2)控制相关:(吴立钦) 解决方法:
运用此方法时需要解决下面两个问题: (1)碰到JRX类指令,跳转的判定:
如下:
(2)合适的PC更新时机:
方法一:将pc放在时钟的上升沿
方法二:将pc放在时钟的下降沿
11
译码时判断上一条指令是否要跳转: 关键信号:d_IR:
forwardA:
forwardB:
3)数据相关(郑文龙) 数据相关:考虑3种情况
相邻指令RAW相关; 中间隔1条指令的RAW相关; 中间隔2条指令的RAW相关; 数据相关的判断:
在相邻指令RAW相关中,如果MEM段(代表前一条指令)如需要写的SA(记作m_SA)与EX段(代表后一条指令)的SA (记作e_SA)或SB(记作e_SB)相同,则存在数据相关。即有:
m_SA = e_SA 或者 m_SA = e_SB
中间隔1条指令的RAW相关类似相邻指令RAW相关的思路。
中间隔2条指令的RAW相关,在采用了下降沿写入寄存器的策略后,此种情况不 再存在,因此不再考虑
信号VHD:
12
信号代码段:
当m_wRegEn='1' 如果是m_SA = e_SA或者 m_SA = e_SB 则为相邻指令RAW情况,所以forwardA=10或者forwardB=10 如果是w_SA = e_SA或者w_SA = e_SB则为中间隔1条指令的RAW相关,所以forwardA=01或者forwardB=01
对于中间隔2条指令的RAW相关,则forwardA=00或者forwardB=00在采用了下降沿写入寄存器的策略后,此种情况不再存在,因此不再考虑。
在检测到数据相关后,根据检测到的不同类数据相关,分别将相应的结果定向回传到EX段ALU的输入端:
由代码可得,相邻指令RAW情况时,ALUaIN=e_ALUOut或者ALUbIN=e_ALUOut, 中间隔1条指令的RAW相关时,ALUaIN=w_WBdata或者ALUbIN=w_WBdata.数据相关得以解决。
13
4 各流水段功能和实现的详细分析
组长组织这部分撰写,具体哪个功能段谁负责撰写的要标出姓名。
(1)各流水段需要实现的功能列表
? 取指模块(IF):给出内存地址,读取指令并送入指令寄存器,为下一级准备数据。
由于PC控制模块处于取指模块中,因此控制相关的检测也置于取指模块。
? 译码模块(ID):读取寄存器值和指令译码。我们采取一次译码,逐级传递的方式,译出后几
级流水所需的控制信号和数据(如立即数等),在每次时钟上升沿到来时送入下一级。实际上,结构相关、控制相关、数据相关的检测都可归入译码部分。考虑到“相关检测”涉及到的信号分属不同阶段以及整体结构的清晰性,我们将“相关检测”独立出来。 ? 执行模块(Ex):完成算术逻辑运算、计算有效地址和提供数据通道。
存储器访问指令:ALU把所指定的寄存器的内容与偏移量相加,形成用于访存的有效地址。 寄存器-寄存器ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读取的数据进行运算。
寄存器-立即数ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读取的第一操作数和立即数进行运算。
分支指令:ALU把偏移量与PC值相加,形成转移目标的地址。同时,对在前一个周期读出的操作数进行判断,确定分支是否成功。
? 访存模块(Mem):选择地址线的数据来源和数据线的流向。访存和取指在功能上是独立的,
但CPU对外只有一条地址线和数据线的事实决定了访存和取指是相互联系的。当执行LOAD/STORE指令时,地址线由ALU送入“访存段”的值提供;取指时,则由PC提供。当写内存时,CPU内部数据送数据线;当需要读内存时,CPU往数据线送高阻。
? 回写模块(Wb):选择回写数据源和根据写使能信号wRegEn将数据回写到寄存器堆;
(2)各流水段的输入、输出信号
1、取指模块(IF) 输入信号:tempZ,tempC,e_setFlag,PCPlusOffset,PCStall,IFFlush,OuterDB 输出信号:PC_addr,d_PCInc1,d_IR
14
2、译码模块(ID)输入信号:reset,clk,d_IR,d_PCInc1,w_WBData ,w_destReg,w_wRegEn, RegSel
输出信号:e_SA,e_SB,i_PCPlusOffset,e_RAOut,e_RBOut,e_IMM e_ALUSrc , 3、执行模块(Ex)
输入信号:
(1) ALU:e_RAOut,e_RBOut, e_ALUSrc, e_ALUOpr, e_SetFlag, e_IMM, forwardA,forwardB (2) Fowarding: e_SA, e_ALUOut, w_Wbdata
(3) Control Signal for Ex_MemReg & Mem_WBReg:e_wRegEn, e_memToReg, e_destReg, e_wrMem
,
输出信号: (1)ALU:无
(2)Forwarding:m_SA,m_ALUOut,m_Rbdata,i_tempZ,i_tempC
(3) Control Signal for Ex_MemReg & Mem_WBReg:m_flag, m_wRegEn, m_memToReg, m_destReg, m_wrMem
4、访问模块(Mem)输入信号:(1)m_wrMem, m_ALUOut, m_Rbdata, m_flag, PC
(2)Forwarding:m_SA
(3)WB Reg:m_wRegEn,m_destReg,m_memToReg
输出信号:(1)w_wrMem,wr,OuterDB,w_ALUOut,w_MemOut,w_flag,
addr
(2)Forwarding:w_SA
(3)WB Reg:w_wRegEn,w_destReg,w_memToReg
5、回写模块(Wb)输入信号:s_w_memToReg,
输出信号:s_w_ALUOut,s_w_WBData,s_w_MemOut,s_w_flag
(3)每个功能的实现逻辑
1、取指模块(IF):
1)给出内存地址,读取指令并送入指令寄存器
15