1、2. 额外设计要求时间允许的情况下,进行一些额外的、探索性的改造,可用于加分。例如,(1)利用TEC-CA平台上的16位RAM来存放8位的指令和数据;(2)实现一条JRS指令,以便在符号标志位S=1时跳转。需要改写ID段的控制信息,并改写IF段;(3)实现一条CMPJ DR,SR,offset指令,当比较的两个数相等时,跳转到目标地址PC+1+offset;(4)可以探索从外部输入指令,而不是初始化时将指令“写死”在RAM中;(5)此5段流水模块之间,并没有明显地加上流水寄存器,可以考虑在不同模块间加上流水寄存器;(6)探索5段流水带cache的CPU的设计。各组亦可根据实际情况来做一些创新性
2、的探索,酌情加分。 1.3 实验设备本课程综合设计中,需要用到的实验设备如下:1.PC两台;2.TEC-CA硬件实验箱一个;3.Quartus II软件平台一个;4.DebugController软件一个;5.JTAG连接线。 1.4 主要成果实现5级流水无cache的8位实验CPU,16条简单的命令执行,输出确认无误。2. 8位无Cache的5段流水CPU总体设计 2.1 指令系统的设计(注:要给出指令功能、指令格式、指令列表) constant ADD : std_logic_vector(3 downto 0):=0000; /加法 constant SUBB :0001 /减法 con
3、stant ANDins :0011 /与 constant MOV :0010 /赋值 constant LOAD :1000 /load指令 constant STORE :1010 /store指令 constant LOADH :1011 /高位load指令 constant LOADL :1001 /低位load指令 constant JR :0100 /跳转 constant JRZ :0111 /Z=1跳转 constant NOP :1100 /空操作 constant MOVI :1101 / constant NOPIns : std_logic_vector(7 down
4、to 0):11000000 2.2 数据通路的设计(注:可参考16位CPU,然后指出变为8位时,作了哪些修改) 一、数据通路图图1 无cache五级流水线数据通路示意图整个CPU由下边几个模块组成: 控制器:在每个时钟周期给出cpu其它部件的控制信号。 运算器:本运算器包括寄存器堆。 Bus MUX:通过控制信号BusSel数据的来源,通过Wr来控制送往外部数据总线上的数据内容。AR(地址寄存器):驱动地址总线。IR(指令寄存器):存放根据当前PC值取得的指令。 2.3 控制信号的设计(注:要分析控制信号有哪些,最后总结一个控制信号列表,可参考上个学期综合实验参考文档中控制信号的列表方法)w
5、rMem信号含义w_memToReg1: 内存数据到寄存器0: ALU输出到寄存器wRegEn 允许写寄存器 禁止写寄存器wRegEn & MemToRegALUSrcRS000A001B0101011100FFFF101立即数ALUOpr功能0000R + S0001S R0010R AND S0011R OR S0100R XOR S0101SHL S0110SHR S0111 SAR S1000LOADH R1001LOADL R1010MOVI RsetFlag(3位:#)Flag_holdFlag_updateFlag_innerDBFlag_C0Flag_C1Flag_clear其
6、它未定义 2.4 结构相关的处理由于我们的设计中不包含缓存,因此会有取指和访存的冲突,即结构相关(见下图)。当冲突发生时,必须先“访存”,将“取指”延后一个时钟周期,这样才能保证指令的正确执行。处理结构相关需要做两项工作:1)冲突检测 2)取指延后。1)冲突检测只有执行访存指令(LOAD/STORE)时,才会出现冲突。因此,我们在译码时产生一个标志是否访存的信号wrMem。含义如下:wMem意义00写内存(STORE)01读内存(LOAD)1不占用内存通过检查“访存阶段”的m_wrMem就可确定是否冲突。2)取指延后在每次取指时,若有冲突,则往IR中写入空指令(NOP),并保持PC不变,使取指
7、延后一个节拍。 2.5 数据相关的处理数据相关是指在执行本条指令的过程中,如果用到的操作数是前面指令的执行结果,则必须等待前面的指令执行完成,并把结果写回寄存器或主存之后,本条指令才能继续执行3。我们采用设置专用数据通路(即傍路技术)来解决数据相关问题。但旁路技术并非一劳永逸。若前一指令为LOAD,而后一指令和它数据相关,如下图所示,当下一指令的执行阶段需要数据时,上一指令尚未给出,这种情况是无法用旁路技术来解决的。图 五级流水LOAD数据相关示意图针对上述情况的一般处理方法是通过插入bubble使LOAD之后的两条指令拖后一个节拍执行4。但我们感觉这种处理过于繁琐。我们发现,如果在LOAD译
8、码时,后面自动加一条空指令,即增加冗余,就可以避免上述情况的出现。在这种简化处理后,我们将数据相关划分为以下三种情况。1相邻指令数据相关举例: INC R0INC R0 在此情形下,将上一指令的ALU输出经缓存后直接送回,作为ALU多路选择器的入口之一,如下图所示。图 五级流水相邻指令数据相关示意图具体代码片段为(forwardingentity.vhd): if m_wRegEn=1 and m_SA=e_SA then forwardA = 10其中m_SA为当前处于访问内存(MEM)中寄存器输出结果的索引,e_SA为处于当前执行阶段中ALU的输入寄存器A的索引,倘若两个索引值相等,则产生
9、相邻指令数据相关2中间隔1条指令的两指令数据相关 INC R0 INC R1在此情形下,将第1条指令的回写数据送回作为ALU多路选择器的入口之一供第3条指令使用,如下图所示。图 五级流水相隔1条指令的两指令数据相关示意图具体代码片段如下(forwardingentity.vhd):elsif w_wRegEn= and w_SA=e_SA then01其中w_SA为当前处于回写阶段(WB)中寄存器输出结果的索引,e_SA为处于当前执行阶段中ALU的输入寄存器A的索引,倘若两个索引值相等,则产生中间隔1条指令的两指令数据相关3中间隔2条指令的两指令数据相关INC R1INC R2第1和第4条指令
10、数据相关,有两种处理方法。方法1:在第4条指令的译码阶段作旁路处理,将第1条指令的回写数据作为运算器的输入送入下一级,如下图所示。方法2:考虑到读写寄存器的时间较短,因此将写寄存器的时机改在时钟下降沿。这样1、4指令就没有数据相关了。图 五级流水相隔2条指令的两指令数据相关示意图由于方法2处理较简洁,因此我们在实现时使用了后者。具体部分代码如下(ifentity.vhd):process(reset,clk,PCStall) begin if reset = 0 then PC = x00 elsif FALLING_EDGE(clk) and (PCStall=) then PC = PCn
11、ext; end if; end process;可以看到更新PC的时机为FALLING_EDGE。 2.6 控制相关的处理控制相关是指因为程序的执行方向可能改变而引起的相关。当执行跳转指令时,就会发生这种情况。除JR外,JRZ等条件跳转需要根据当前状态位来决定是否跳转,而当前状态位是由前面最近的会影响状态位的指令(如算术指令)决定。常规的也是比较简单的做法是在碰到JRX之类的跳转指令时,延迟后边流水线的进入。但我们通过分析,认为可以一点都不必延迟,通过旁路处理把控制相关转为数据相关来处理。这样处理,不必延迟,可以提高流水线的性能。按我们的方式解决控制相关需要做两项工作:1)通过旁路,提供状态寄存器的值和临时状态位的值,为判断是否跳转
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1