通过前面的设计,一个RISC_V的雏形就出来了,但是五级流水就会产生数据冒险,需要前递和冒险检测,并且为了提高性能进行分支缩减。
前递
前递主要解决当前指令给某个寄存器写入数据,而紧挨着的下二条指令刚好用到了该寄存器,就会导致数据不能正确得到,为了解决此问题我们使用前递单元进行判断,并使用两个数据选择器选择输入给alu的数据,从而解决该问题。
module forwarding(
rst_n ,
rs1 ,
rs2 ,
EX_MEM_rd ,
EX_MEM_regwrite ,
MEM_WB_rd ,
MEM_WB_regwrite ,
mux_a ,
mux_b
);
input rst_n ;
input [4:0] rs1 ;
input [4:0] rs2 ;
input [4:0] EX_MEM_rd ;
input EX_MEM_regwrite ;
input [4:0] MEM_WB_rd ;
input MEM_WB_regwrite ;
output reg [1:0] mux_a ;
output reg [1:0] mux_b ;
always@(*)
if(!rst_n)
mux_a = 'd0;
else if(EX_MEM_regwrite && (EX_MEM_rd != 0) && (EX_MEM_rd == rs1))
mux_a = 2'b10