《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 超标量TURBO52嵌入式微处理器结构设计
超标量TURBO52嵌入式微处理器结构设计
吴晓非
(电子科技大学,四川 成都610041)
摘要: 介绍了TURBO52的研究背景及技术路线,在保持对经典8051指令集后向兼容的前题下,通过重新进行结构设计来提高系统性能。介绍了指令流水线的结构设计,包括两路超标量结构、分支预测、动态执行和存储管理。在FPGA上运行真实控制系统应用程序测试表明,在相同工作频率下运行一系列系统软件可达经典8051的30倍以上,最高指令吞吐率每时钟周期两条指令。但由于未实现三级存储体系和数据高速缓存,工作在100 MHz以上性能的提升会受限。
Abstract:
Key words :

摘  要: 介绍了TURBO52的研究背景及技术路线,在保持对经典8051指令集后向兼容的前题下,通过重新进行结构设计来提高系统性能。介绍了指令流水线的结构设计,包括两路超标量结构、分支预测、动态执行和存储管理。在FPGA上运行真实控制系统应用程序测试表明,在相同工作频率下运行一系列系统软件可达经典8051的30倍以上,最高指令吞吐率每时钟周期两条指令。但由于未实现三级存储体系和数据高速缓存,工作在100 MHz以上性能的提升会受限。
关键词: 8051单片机嵌入式微处理器;结构设计;超标量流水线动态调度;转移猜测

  8051指令集微处理器[1]自面世以来,以数以亿计的规模应用于各个领域,至今仍占据嵌入式微处理器用量的首位。但另一方面,相对于近三十年通用微处理器Intel Pentium PIV[2]、龙芯1号[3]、龙芯2号[4、5]、MIPS1000[6]和近年来32位高端嵌入式微处理器及ARM11[7]体系结构突飞猛进的发展而言,对8051微处理器核的改动很小,这也使得现有8051指令集系列微处理器受24 MHz工作频率、24周期一条指令、256 B的变量空间和64 KB的数据空间[1]的局限,在运行基于操作系统的高端嵌入式应用时变得非常困难。
  Turbo52微处理器的设计背景是现有系统控制软件都基于8051指令集开发环境,但未来要求数据和代码从只有原来1/20外存访问带宽的串行flash中读取,且还要求达到至少30倍于传统8051的性能,运行带图形界面的系统软件。Turbo52在技术路线的选择上,第一是考虑到未来是用于系统控制而非数据处理,这很大程度上减小了8051指令集由于指令位宽和没有浮点运算单元带来的运算性能上的局限;第二,从通用微处理器在过去三十多年的演进历史中可知,对于一个微处理器系列而言,因为为其开发软件的总成本已远远高于微处理器设计成本,所以,一个微处理器系列的核心竞争力很大程度上是依赖于它能兼容现有软件资源的数量,8051系列就拥有最为丰富的软件资源;第三,目前国际上在单核微处理器体系结构设计上已基本成熟,对微处理器体系结构的研究热点已转入片内存储共享的多微处理器结构和低功耗设计;第四,目前芯片设计流程以及芯片设计、仿真,综合和验证的自动化工具已允许对微处理器系统结构进行重新定义。
  综上考虑认为,造成8051系列性能局限性的根本原因是它落后的微体系结构而非指令集本身,因此决定在首先保证完全重用所有现有软件资源的基础上,通过采用先进系统结构来重新定义内部体系结构的方法来挖掘微处理器结构上的并行性以实现本应由更复杂的32位嵌入式微处理器完成的系统控制任务。
  相对于传统8051指令集处理器,Turbo52系统结构上的改进主要在于以下7个方面:
  (1)双发射超标量结构。
  (2)基于寄存器重命名,动态调度和动态分支预测8级动态乱序流水线。
  (3)1 KB片上高速指令缓。
  (4)虚拟地址映射管理16 MB代码,数据和输入输出空间。
  (5)将可直接寻址的输入输出设备、定时器计数器、串口、外口、中断控制等的输入输出设备时序与微处理器核时序完全分离,异步相连,方便了输入输出设备的增减。
  (6)微处理器核时序与存储介质时序完全分离,异步相连,使得可使用任何介质。
  (7)访存载入定向。
1 指令流水线结构设计综述
  微处理器结构设计的重点是指令流水线结构设计,其中数据相关和控制相关的解决是难点。Turbo52的设计是用动态调度解决数据相关和用分支预测解决控制相关。动态调度是动态地平衡不同的功能器件延时对流水效率的影响。分支预测是让条件分支先猜测执行。8051指令集共有111条指令,有着多种寻址方式,不定的指令长度和将输入输出设备寄存器与体系结构寄存器作为同类寄存器访问[1],这些都成为了动态乱序结构设计中的难点。选用两路超标量是考虑它是现有8051指令集软件开发编译环境下[7]处理器性能的峰值点。因为多发射是在同一时钟周期取得,发射、执行、写回和提交多条不相关的指令,这是与单发射的最大不同。超过两路的多发射必须依赖于编译器的支持,否则如果指令发射段得不到足够多条源操作数已准备好的不相关指令,更多的发射就不能实现,性能也就不能相对于更少的发射窗口有提高。在目前获得支持多发射编译优化的编译器不现实的条件下,根据对运行现有应用程序的仿真,实际程序中有大量的相关存在于相邻2条指令间,故双发射平均每个时钟内可发射1.4条指令而非理想状态下的2条指令,因此再增加发射窗口也不能换来显著的性能提高。指令流水线设计的原则是将一个指令周期尽可能均匀地分割到流水段中来获得较小延时的关键路径[8],量化流水段从按系统结构功能划分开始,然后再根据综合结果指出关键路径在RTL上调整每一段的细节功能划分和节拍数。TURBO52指令流水线分为流水线前端和后端2个部分。前端由先行指令数据预取、取指对齐和译码组成,后端由寄存器重命名、指令发射、指令执行、指令写回、指令提交和例外处理构成。
2 前端流水线设计
  实现两路超标量结构,首先是前端流水线平均能在每个时钟周期取得2条对齐指令送入译码队列。TURBO52前端流水由指令块预取,指令取指和指令译码组成。前端流水线的3个流水段各自独立自治,由缓冲区相连,当下级缓冲满或本级缓冲空时停止工作,但全局例外时全部指令作废,从重新取到指令的开始向前流动。
2.1 指令预取
  采用推测方式,每两个周期从指令缓冲中取得一个块,下个周期取下一块,按先进先出方式进入指令块队列。队列可供4块,共32 B。如Cache缺失就从存储单元调入该块。但如取指未取中或指令未对齐,就会向预取触发一个调入例外,如不是正在取的块,就会作废当前块,并调入重新调取指段要求的块。
2.2 指令取指
  取指流水段指第一次从存储单元取得一条指令长度,可能是1 B、2 B或3 B,因此这时只能确定它的下一条指令所在的地址,而无法获得下2条指令的地址,所以每个时钟周期取2条指令是不可能实现的。TURBO52的做法是只有指令Cache命中时才能实现双发射。第一次取到由ITLB预译码后的指令块后,先不写入Cache,而在取指段加入该块中每条指令下2条指令的第一个字节所在地址,然后再写入Cache,这样在下一次Cache命中时,就可同时判定一条指令的下2条指令是否在预取队列中。在指令取指段,对取指影响最大的是不对齐和控制流的改变[8]。不对齐是指由于指令长度不定但指令块却是固定的8字节,所以跨越了2个指令块,并且其中一个未在预取队列中,只有等待调入。控制流的改变中影响最大的是条件分支,8051应用中平均每六七条指令就会有一条是条件分支指令。TURBO52采用了动态乱序执行的后端流水线,一条条件分支指令要到在7个时钟后的提交阶段才会给出转移成功还是失败,但另一方面,条件分支方向大多数是可预测的[9]。TURBO52使用了动态静态结合的分支预测,分支成功率90%以上,使得绝大多数由条件分支引起的在此之间流水线停顿的现象得以消除。动态分支预测的分支目标缓冲采用全相连方式,保存了最近32个分支入口及最近3次的实际分支方向,对分支目标缓冲未命中的分支指令,就按分支发生方向进行静态预测。在TURBO52的指令流水线中,判定预测正确与否是由提交段给出,只在提交分支指令时更新分支历史信息。如同时取到2条条件分支,则会一条条地处理,因为不能同时预测2条分支。为简化例外处理,8051指令集的3条指令(RET,RETI,JMP_A+DPTR)TURBO52让它强行串行化,即让流水停顿。
2.3 指令译码
  将取得的指令对齐后放入深度为4的译码队列,译码部件每个时钟周期对应2条指令同时译码,即在已预译码的基础上把8051指令集的指令按源、目的、操作3个大类进行正交分解,将8051指令集原本不规则的指令格式转换成适于后端流水处理规则的内部操作格式。
3 基于动态执行的后端流水线设计
  TURBO52后端指令流水线包括按序的寄存器重命名、乱序指令发射、乱序指令执行、乱序指令写回、顺序指令提交共5个流水段。除指令执行段各种不同的操作有不同的延时外,其余均能在一个时钟周期最多完成2条指令的处理,但对访存和条件分支指令,指令发射段每周期只能发射一条。与前端指令流水线不同,它们共享一个再定序缓冲循环队列,记录了指令进入后端流水线的原始顺序,这个顺序也是指令的最后提交次序。在这里,大多数假相关已被消除,流水线真相关的关键路径是整条指令流水线的关键路径。
3.1 寄存器重命名
  在动态执行中,对一串寄存器的读写并不一定按照它们在程序中的顺序进行,这就要求要解决反向相关与输出相关[9]。TURBO52共有24个重命名文件寄存器项,它们都由重命名寄存器号来标识。在8051指令集中,很多运算结果都是由几个有限的体系结构寄存器A、B、PSW、R0~R7进行中转[1],TURBO51在建立映射关系时常常是不同的几个重命名寄存器对应同一体系结构寄存器在不同时刻的值。对于一个重命名寄存器项,最基本的3个状态是已写回、闲和未决。在寄存器重命名段,只要再定序缓冲有空且已译码对列不为空,寄存器重命名段就将巳译码指令重命名并加入再定序缓冲。其结果是分配重命名寄存器和为源匹配最近对它写入的重命名寄存器这两项任务同时进行。这里,对间接寻址的处理是一个关键边界点。TURBO52处理这几类间接寻址指令采取了基于猜测的方法,因为虽然存在相关的可能而且不允许读错误数据,但从目标应用程序的统计结果来看,为处理不足0.3%的可能性而增加整个间接寻址方式的流水延时是不合理的。例如对@RI:首先使用体系结构寄存器中对应的R1或R0的值作为地址发出访问体系结构寄存器的请求,如果在重命名寄存器中没有PSW中RSO,RSI或对目前RO、RI所在地址的写入操作的映射,即没有发在相关时,它所得到的是与直接寻址方式一样的取源操作数延时,如发生相关,TURBO52寄存器重命名段使用了一个长度为8的循环队列用于处理间接寻址的地址未决,不采用由先前猜测所得的结果,当地址出现在写回总线时立即触发访体系结构寄存器操作。
3.2 指令发射
  指令发射段负责在每个时钟周期内从再定序缓冲中选择发射两条源已准备好的指令到相应的执行部件。TURBO52的再定序缓冲也同时作为保留站。由指令发射段根据执行单元的忙闲状态以及源是否准备好来决定是否发射这条指令。
3.3 指令执行
  本微处理器的指令一旦被发射进入功能单元后就开始执行了。在这里,操作的执行顺序与它们在软件中的次序无关。TURBO52指令执行部件由一个算术流水单元(加减乘除)、1个LOAD/STORE部件、2个传送、逻辑和位操作部件和1个分支部件组成。有的操作是单周期的,如传送和逻缉运算;有的是固定多周期的,如加减乘除;有的是不固定多周期延时的,如访问数据区的LOAD/SRORE。
3.4 指令写回
  公共数据总线连接了所有执行功能单元,重命名寄存器堆和再定序缓冲,功能单元产生的结果广播到公共数据总线的同时从公共数据总线锁存源送往执行。TURBO52指令写回保证了操作,当其所有源操作数就续后马上开始执行,达到数据流极限。
3.5 指令提交
  指令提交意味着指令执行结束并修改了微处理器的状态,指令离开再定序缓冲,写入真实意义的寄存器文件。再定序缓冲由一个头指针和尾指针构成了一个循环队列,深度为8条指令,指令进行提交时释放一项再定序缓冲,尾指针递增。乱序执行的另一个困难是异常处理,因为8051指令集系采用的精确例外[1],即只允许程序在严格顺序执行的情况下所产生的异常发生。在程序的执行中,中断和异常会打断程序的执行,动态流水线的两路超标量微处理器由指令的动态乱序执行,但对外部程序来说与完全顺序执行只存在速度的差别而非结果的差别,所以它必须能精确地与顺序执行条件下的例外结果保持一致,这是设计的一个高风险区。中断在本处理机中是来自外部输入输出环境,在程序执行期间异步发生。中断发生时,正常运行的程序必须挂起。异常是由程序自身指令的执行而引起的,当正在进行代码分页切换时会引发分页异常,分支预测错误时会引起分支异常,本处器只在指令提交段上对异常和中断进行处理,将中断也作为异常的一种。
4 存储子系统和输入输出设备设计
  8051指令集是指令和数据相分离的哈佛结构,存储子系统分为代码空间和数据空间[1]。TURBO52在保持兼传统8051指令集数据和代码空间各64 KB的基础上,用分页的方式实现了共享一个外部数据和代码存储器件的物理地址空间下,代码与数据各16 MB的虚拟地址空间。
4.1 代码空间
  TURBO52中访问代码空间均以8 B块为单位进行,分为外部存储器和一级指令高速缓存两个层次。指令高速缓存容量是1KB,采用四路组相连映象,LFU替换算法。指令流水线代码预取段首先访问指令高速缓存,如命中则调入并更新相应标识位,如缺失则进入指令先行访存队列中查找。指令块在从外存中取入队列时已完成了对指令长度是否为可预测分支及目标地址来自哪个指令字节的预译码。
4.2 数据空间
  8051指令集对数据空间的访问只能通过MOVX指令进行[1],MOVX变量空间、外设IO与外存共享这个数据空间。这里使用了载入定向,当一条MOVX读指令到来且正要读还未写就续的这个寄存器,LOAD/STORE部件用直接旁路将这条LOAD定向到写总线上,从而消除不必要的等待。从简化设计的角度,TURBO52没有实现完整的一级数据高速缓存,而是用一个容量为4 KB的RAM用于程序变量的访问。在目前基于RTOS实时操作系统的应用下完全达到了快速的变量访问又避免了实现较复杂的一致性问题。外部数据区:对于指令和数据对外部存储的访问均是按相同大小的8 B块为最小单位的方式进行的。用先行预取缓冲的方式,当TLB缺失时,向外部存储器接口启动这个块的调入请求。输入输出设备有2个定时器计数器、1个串口,中断控制和32条通用I/O口都可直接寻址方式访问。对新增加的18位PWM,是在MOVX访问的数据空间通过新定义的输入输出总线和分配端口地址来接入,这也使以后增减外设的工作只与输入输出总线有关而与指令流水线完全分离,对增减外设提供了方便。
  在设计中先走通了静态分支预测和顺序流水线,然后在总结这个阶段错误的基础上开始TURBO52其他部份的设计。即先走完从每个时钟级的功能描述,到可综合且代码风格规范的RTL描述[10],然后进行NC-Verilog前仿真验证、DC综合、FPGA验证,最后针对具体ASIC单元库进行门级仿真的设计流程。在此后的设计中,从功能描述文档开始就将综合中可能遇到的问题纳入考虑,在划分流水线功能时由综合结果帮助了功能描述级文档的修改,并排除了大多数严重错误。在RTL仿真阶段运行了指令集验证,尤其着重验证了动态执行、分支预测和例外处理中的临界指令组合,排除少量严重错误和较多外设错误;此后又验证了体系结构寄存器文件读写、分页代码间的切换等其他高风险点;之后又验证了以外设为主的用户功能部分和运行完整的RTOS操作系统。最后,TURBO52微处理器在FPGA系统级验证上能正确且稳定地运行RTL仿真所用的测试程序包,全部现有应用软件和基于RTOS操作系统的应用方案, 能流畅处理图形用户界面。在同为27 MHz时钟下,其结果显示系统运行速度比传统8051提高30倍以上。运行直观的方波发生应用测试是37倍以上,这说明TURBO52技术路线选择正确,流水线效率高,高速缓存容量足够,命中率高。使用CMIC 0.18 um标准单元工艺库进行了综合,表明TURBO52微处理器最高工作频率大于150 MHz。接下来的工作是进一步改进存贮子系统,因为TURBO52工作在100 MHz以上时,Flash访问带宽与处理器核的需求带宽的差距显著拉大,这带来了性能提升的瓶颈,应引入有DDR_SDRAM的三级存储体系和加入数据高速缓存,使运行更流畅,力争最终能运行用于32位嵌入处理器上流行的基于LINUX操作系统的应用。
参考文献
[1] MCS(R) 51 Microcontroller Family User′s Manual,Intel Corp Press,1994.
[2] Micro Architecture of the Pentium 4 Processor,Glenn Hinton,Dave Sage,Intel Technology Journal,Q1,2001,5(1):1-12.
[3] 胡伟武,唐志敏.龙芯1号处理器结构设计.计算机学报,2003.4:386-396.
[4] 胡伟武,张福新,李祖松.龙芯2号处理器设计与性能分析.计算机研究与发展,2006,43(60):956-966.
[5] HU Wei Wu,ZHAO Ji Ye.Implementing a 1 GHz four issue  out-of-order execution microprocessor in a standard ASIC  methodology,J.Comput.Sci & Techno,2007(6):1-14.
[6] YEAGER K.The MIPS10000 superscalar microprocessor, IEEE Micro,1996,16(2).
[7] ARM DDI 0100E,ARM Architecture Reference Manual,2nd Edition,ARM Limited,2000.
[8] SHENG J P.Modern processor design:Fundamentals of  Superscalar Processors,McGraw.Hill,2004.(7).
[9] HENNESSY J L,DAVID A P.Computer architecture:A   quantitative approach, 2nd Ed.,morgan kaufmann publishers, Inc.,1996.
[10] MICHAEL D.C,Advanced digital design with the verilog HDL,prentice hall India,2004.

此内容为AET网站原创,未经授权禁止转载。