文献标识码: A
文章编号: 0258-7998(2014)07-0009-04
RISC(精简指令集处理器)处理器完成一个指令集包含的操作只需要一条指令,而要完成一个指令集不包含的操作则需要几条甚至几十条基本操作指令,大大降低了处理效率[1]。针对这一问题,本文提出一种在通用RISC微处理器中增加指令扩展接口的方法。用户可以根据自己的需要,在扩展接口挂接自己设计的扩展模块,即可简单、灵活地进行指令扩展。如何消除数据冲突是设计指令扩展接口的关键技术。
在编写程序时通过人为调整指令顺序可以消除数据冲突,这种方法不需要更改硬件电路,但是容易发生错误,而且对于无法通过调整顺序消除的冲突需要插入空指令,降低了执行效率。另外一种简单的方法就是设置流水线互锁部件,如果检测到两条指令之间存在冲突,则使流水线停顿,直到冲突消除,这种方法同样会导致执行效率的降低。
本文将处理器通用指令和扩展指令按照运算结果产生时刻分为两种类型,通过分析不同类型指令发生数据冲突的情况,设计数据定向通道来消除数据冲突。通过设计数据定向通道可以保证程序执行的正确性和执行效率。
1 指令扩展接口结构
指令扩展接口在RISC处理器的基础上设计,本文选用的 RISC处理器以MIPS指令集为标准,采用哈佛结构程序空间与数据空间相互独立,设立5级流水线[2]。5级流水线包括:
(1)指令获取(Instruction Fetch,IF);
(2)指令译码(Instruction Decode,ID);
(3)指令执行(Instruction Execute,EX);
(4)内存读写(Memory Access,MEM);
(5)寄存器回写(Write Back,WB)。
整个微处理器系统[3]划分为两部分:一部分是数据单元,另一部分是控制单元。在每条指令执行的过程中,控制单元控制数据通路正确无误地执行每条指令,完成数据的各种运算,实现处理器的各项功能。
设计完成的指令扩展接口支持两种类型的扩展指令:一种为A型简单指令,该指令用于实现简单的逻辑运算;另一种为B型复杂指令,该指令用于实现一些复杂的操作。用户在进行指令扩展时,根据运算的复杂度选择相应的指令类型,可以降低难度,提高效率。
对于A型指令,由于只是实现简单的逻辑运算,可以通过扩展流水线执行级的ALU(逻辑运算单元)实现,是单个时钟周期内组合逻辑电路。这种扩展方法与Nios II的定制指令相似[4-5]。
对于B型指令,外围扩展模块要占用EX和MEM两个流水级[6],这是因为:(1)扩展指令不能对处理器数据存储区进行访问,所以处理器执行扩展指令时系统EX和MEM级处于空闲状态;(2)如果用户设计的逻辑运算单元关键路径太长,延时大于时钟周期,就需要在运算单元中间插入一级寄存器;(3)用户可能需要自建存储区域,需要两个时钟周期才能完成存取操作。基于以上3点原因,使扩展模块占用两个流水级能够给外部扩展模块预留足够的设计空间,更好地满足设计需求。B型指令扩展结构在处理器与外部扩展模块之间增加了一个接口单元。接口单元的作用是隔离系统的控制通路,使扩展接口只保留数据信号[7]。
2 数据冲突分析
数据冲突是指令在流水线中重叠执行时因需要用到前面指令的执行结果而发生的冲突。流水线冲突除了数据冲突还有结构冲突和控制冲突。由于加入指令扩展接口以后,只对处理器的数据冲突产生重大影响,所以本文对如何消除结构冲突和控制冲突就不再介绍,只介绍处理器的数据冲突以及如何将其消除。
为了能够更加清楚地说明增加指令扩展接口以后流水线数据冲突的情况,本文用数据路径的快照形式反映流水线的执行过程。在时空图中数据路径的快照示例如图1所示。
在图1中,将处理器的指令(包括通用指令和两种类型扩展指令)按照运算结果产生时刻分为两类:(1)在流水线第三级(执行级)产生结果,这种指令包括处理器自身的数据操作指令和A型扩展指令,用图1中(a)表示;(2)在流水线第四级(内存读写级)产生结果,这种指令包含处理器load指令和B型扩展指令,用图1中(b)表示。在图2所示的时空图中将采用上面两种数据路径快照表示相应指令的执行过程。
将指令分为(a)、(b)两种类型以后,相邻两条指令存在数据冲突的情况就可以归结为以下四种情况。
在图2中,箭头代表数据需要传输的路径,箭头起点为第一条指令数据最早产生的位置,箭头终点为第二条指令最迟需要数据的位置。从图2可以看出,(1)、(2)两种情况下数据产生的时刻比数据需要的时刻早,对于这种情况采取措施将前一条指令的运算结果通过专用通道提前送给当前指令需要数据的位置,流水线可以顺序执行。而对于(3)、(4)两种情况,前一条指令结果产生的时刻比后一条指令需要数据的时刻晚,所以无论采取什么措施,都无法得到前一条指令的运算结果,对于这种情况,流水线必须暂停一个时钟周期,等前一条指令运算完成以后数据通过定向通道送给第二条指令,流水线才能继续执行。
上面分析的是简单数据冲突,第二条指令只与前面一条指令发生数据冲突。还有一种更复杂的情况是后面一条指令与前面两条指令都发生数据冲突。为了能够更形象地体现这种情况,将图1中(a)型指令的数据路径快照稍微修改,即为如图3所示的复杂情况的数据冲突。
在图3中,第三条指令中执行级的源操作数a是第一条指令的目的操作数,源操作数b是第二条指令的目的操作数。此时源操作数a通过定向通道已经准备好了,而源操作数b还没有运算完成,所以执行第三条指令时需插入一个气泡。流水线停顿一个时钟周期以后,第二条指令的运算结果可以通过定向通道送给第三条指令的执行级。但是此时第一条指令的运算结果已经回写到数据寄存器,通过定向通道送过来的数据已经不是第三条指令所需的数据,这样就导致运算结果出错。
对于这种情况,需要对第一条指令定向过来的数据寄存一级,流水线停顿一个时钟周期以后源操作数a使用寄存以后的数据,源操作数b使用定向通道送来的数据。
3 数据定向通道设计
数据定向通道就是将EX级和MEM级操作完成以后的数据和目的寄存器的地址直接送到EX级输入端。回送目的寄存器地址用于检测数据冲突,冲突检测部件的工作过程:(1)比较当前指令源操作数寄存器的地址与回送的目的寄存器地址是否相同;(2)检测前面指令运算结果是否有效;(3)检测当前指令源地址是否有效;(4)条件全部满足以后,发出流水线冲突信号。
控制单元检测冲突类型,如果流水线不需要停顿,则控制EX级内部的数据选择器选择定向通道的数据;如果需要停顿,则控制流水线停顿。
对于B型扩展指令,如果在接口单元内部再设计一套冲突检测部件和数据定向通道,则会造成资源浪费。在执行B型扩展指令时,处理器EX级和MEM级处于空闲状态,因此可以利用EX级中的部分资源。最后设计数据定向通道后处理器的局部数据路径如图4所示。
在图4中只显示与数据流动有关的部件。图中接口单元和EX级使用相同的数据定向通道[8],数据冲突检测部件也使用同一个。接口单元在执行B型扩展指令且没有发生数据冲突时,接口单元控制信号才有效,接口单元通过指令扩展接口向外传递有效数据,而且只有在控制信号有效时,接口单元接收到的数据才送到回写单元,否则将接收到的数据丢弃。虽然控制单元不能直接控制外部扩展模块,但是通过控制接口单元导通、关断数据的方式,可使外部扩展模块准确地工作在流水线中。图4中右上角“Reg”寄存器的作用是对MEM级定向的数据寄存一级,用于解决3条指令存在数据冲突的问题。
4 功能测试
最后在RISC微处理器基础上设计完成指令扩展接口,预留的A型和B型扩展指令各有200条,对增加了指令扩展接口的处理器进行数据冲突测试。扩展一条A型指令,指令格式:AR3 Rd,Rt;指令功能:将Rt寄存器的值按位取反,结果赋给Rd寄存器。扩展一条B型指令,指令格式:BR1 Rd,Rs,Rt;指令功能:Rs寄存器的值和Rt寄存器的值按位同或,结果赋给Rd寄存器。编写一段针对性强的程序,用于测试增加指令扩展接口以后处理器处理数据冲突的能力。测试程序如图5所示,图6为测试结果。
图5中的4条测试程序包含了可能的数据冲突的情况。图6为使用EDA(Electronic Design Automation)软件仿真得到的波形图。从图中可以看出,除了第三条指令,其他指令数据冲突都通过数据定向解决,流水线没有停顿;第三条指令和前两条指令产生冲突,流水线停顿一个时钟周期以后得到正确的运算结果。
如果使用指令调度解决数据冲突,同样是执行图5中的程序,则需要编译软件或者人为地在存在数据冲突的指令之间插入空指令,最后处理器实际执行的指令如下:
AR3 R4,R1;
NOP;NOP;NOP;
BR1 R5,R2,R4;
NOP;NOP;NOP;
ADDU R6,R5,R4;
NOP;NOP;NOP;
OR R7,R6,R1;
使用流水线停顿解决数据冲突,处理器最后执行效果与上面结果相同,只是使用指令调度处理器通过执行空指令等待前面程序运行完成,而流水线停顿是通过内部设置的流水线互锁部件使流水线停顿等待前面程序运行完成。上面两种方法使用软件仿真得到测试结果如图7所示。
从图6、图7中可以看出,执行相同的程序,图6使用的时钟数明显比图7中使用的时钟数多。为了能够更直观地对比处理器的执行效率,引入每条指令的平均时钟周期数CPI(Cycles Per Instruction)。通过简单计算可知,执行上面的测试程序时本文方法的CPI=5/4=1.25,而使用软件调度或者流水线停顿方法的CPI=13/4=3.25。可见,使用数据定向通道可以提高处理器的执行效率。
在进行SoC设计时,使用具有指令扩展接口的处理器,只需要设计扩展模块就可以完成指令扩展,实现复杂操作,而且不会对处理器自身产生任何影响,在保证系统稳定性的前提下,增加了系统的运算能力。如果本文的设计方法能够广泛应用到微处理器的设计中,则具有指令扩展接口的RISC 微处理器将会极大地促进SoC设计的进步。
参考文献
[1] 夏军.32位RISC微处理器设计研究[D].武汉:华中科技大学,2004.
[2] 张晨曦,王志英.计算机系统结构[M].北京:高等教育出版社,2011.
[3] 郑纬民.计算机组成和设计[M].北京:清华大学出版社,2003.
[4] 李兰英.Nios II嵌入式软核SoPC设计原理及应用[M].北京:北京航空航天大学出版社,2009.
[5] 屈文新,樊晓桠.一种高代码密度RISC结构微控器的设计[J].小型微型计算机系统,2006,27(7):1242-1244.
[6] 刘元锋.RISC架构微处理器扩展对称密码处理指令的研究[D].郑州:解放军信息工程大学,2006.
[7] 张琰,戴紫彬.RISC结构微处理器专用存储单元的研究与实现[J].电子技术应用,2008,34(7):140-146.
[8] 李秀娟,王祖强,张甜.一种8位嵌入式RISC MCU IP核数据通道模型设计[J].电子技术应用,2006,32(4):105-106.