1 Instruction Fetch(IF)阶段
IF阶段的操作有取指令,并决定下一条PC寄存器的内容。IF阶段由流水线寄存器与总线接口组成。
1.1 IF阶段的流水线寄存器(if_reg)
首先PC、指令寄存器以及流水线数据有效标志都设置为初始值以及对应的无效值:
if_pc = 0;
if_insn = NOP[32'd0];
if_en = DISABLE;
流水线寄存器的刷新要在延迟信号stall
无效的时候才能刷新,刷新有以下三个动作* flush有效,对流水线寄存器进行刷新操作 本操作包括设置新的PC地址,指令寄存器设置为NOP,流水线数据有效标志置为无效 * 分支处理 分支信号有效的时候,PC设置为分支地址,指令寄存器设置为读取的指令,流水线数据有效标志设置为有效 * PC步进处理 在既没有延迟,也没有分支的情况下,PC地址+1,指令寄存器和流水线数据有效标记和分支处理中的保持一致
指令insn
等于rd_data,rd_data来源于两个地方:要么是spm里面的数据,要么是总线上的bus_rd_data。if_pc回去控制address,来控制总线的地址。IF阶段的总线信号会连接到总线0上。
- 程序计数器PC的控制
ROM会根据程序计数器的值读出数据,然后读出的数据会传到指令寄存器if_insn上,这个指令寄存器以及pc会传到ID指令译码阶段进行后续的操作,同时,还会传送一个enable信号if_en
。if_en会在flush有效的时候拉低,其他时间都置为有效。
1.2 取指阶段的状态控制
首先在BUS_IF_STATE_IDLE状态,在刷新信号flush无效,address选通信号as_n有效的时候进行判断(flush是mem_flush,上电之后是无效的,as_n一直有效的[常量]) :