d_IR 指令寄存器输出 4.1.3功能实现逻辑
通过分析控制信号我们可以大概了解到取指模块的功能实现逻辑是如何的。广义上来说,取指模块包括结构相关冲突检测模块,因为PCStall信号(用来实现IF段对PC的更新)和IFFlush信号(对IR写入空指令)就来自结构相关冲突检测模块。
结构相关检测模块叫HazardDetectEntity,其模块图如下:
其中输入信号的含义是: m_wrMem w_rwMem d_IR wrMem在访存阶段的值 wrMem在写回阶段的值 指令寄存器 通过检测访存阶段的wrMem信号即可确定是否发生了结构冲突。 每次取指后,若有冲突,则往IR中写入空指令(NOP),并保持PC不变,使得取指延后一个节拍。
除此之外,setFlag信号在此处的作用是,决定用状态寄存器输出Flag还是ALU计算出的临时状态位tFlag来判断跳转。
4.2译码(ID)
4.2.1 实现功能列表
译码模块实现的功能是: ? 读取指令寄存器中的指令
? 对指令进行译码,发送控制信号
4.2.2输入、输出信号分析
主要输入信号: d_IR d_PCInc1 w_wbData w_destReg w_wRegEn
主要输出信号: e_RAOut e_RBOut e_IMM e_ALUSrc e_ALUOpr e_SetFlag e_wrMem e_wRegEn 寄存器A输出值 寄存器B输出值 立即数输出值 ALU输入端选择信号 ALU运算选择信号 状态寄存器写使能信号 访存信号 寄存器写使能信号 从取指模块来的指令 从取指模块来的pc+1 写回数据,从写回模块里来 要写回的目标寄存器 寄存器写使能端 e_destReg e_MemToReg
目标寄存器 内存写入寄存器使能信号 4.2.3功能实现逻辑
译码模块内部写好了根据不同的指令发送不同的控制信号的代码,采取一次译码,逐级传递的方式,译出后几级流水所需的控制信号和数据(如立即数)。在每次时钟上升沿到来时送入下一级。实际上,结构相关、控制相关、数据相关的检测都可归入译码部分。考虑到“相关检测”涉及到的信号分属不同阶段以及整体结构的清晰性,作者将“相关检测”独立出来。
4.3执行(EX)
4.3.1 实现功能列表
执行模块实现的功能是:
? 根据控制信号完成算术逻辑运算 ? 根据控制信号计算有效地址
? 提供数据通道,将上一级传递过来的控制信号传到下一级
4.3.2输入、输出信号分析
主要输入信号: e_RAOut、e_RBOut、e_ALUSrc、来自译码模块的控制信号 e_ALUOpr、e_SetFlag、e_IMM、e_memToReg、 e_wRegEn、、 forwardA、forwardB e_ALUOut 主要输出信号: m_SA、m_ALUOut、m_RBdata、主要来自上一级模块传过来的控制信号 i_tempZ、i_tempC、m_flag、m_wRegEn、m_memToReg、m_destReg、m_wrMem
来自数据相关冲突检测模块的输出 上一个指令在执行模块产生的输出,作为下一条指令在执行模块执行的输入信号之一 4.3.3功能实现逻辑
执行模块执行的功能很简单,和上个学期做的CPU综合性实验类似,主要是一些ALU逻辑运算和状态寄存器的更新操作。在这里还有向下一模块传递控制信号的作用。
其中,forwardA和forwardB信号是来自数据相关冲突检测模块的信号。 模块图如下所示:
作用是在发生读后写数据相关时,直接将计算好了的结果在写回目标寄存器时也发往下一条指令的执行模块作为ALU的输入之一。
4.4访存(MEM)
4.4.1 实现功能列表
访存模块实现的功能是:
? 根据地址线对内存进行读操作或者写操作
4.4.2输入、输出信号分析
主要输入信号: m_wrMem m_ALUOut m_RBdata PC
主要输出信号: w_wrMem wr addr OuterDB
传送到写回模块的内存读写控制信号 读写控制信号 要读取的内存地址 既可作为输入又可作为输出,用于传输数据 内存读写控制信号 来自ALU的输出结果 要写回的数据 程序计数器的值 4.4.3功能实现逻辑
访存和取指在功能上是独立的,但是因为CPU对外只有一条地址线和数据线,因此访存和取指在实际上是有联系和冲突的。当执行Load/Store指令时,地址线由ALU送入访存段的值提供;取指时,则由PC提供。当写内存时,CPU内部数据送往数据线。当需要读内存时,CPU往数据线送高阻。