队伍编号:CICC1413
在增加浮点数指令时,我们会遇到一些需要写回寄存器的指令,此时就需要对原先的写回功能模块做更改。
写回功能主要集中在这两个模块中
e203_exu_longpwbck.v 长指令写回仲裁
e203_exu_wbck.v 最终写回仲裁
该模块实现了长流水线指令的写回操作,包括 LSU 写回接口和最终仲裁的写回接口。其中,LSU 写回接口需要和 OITF(Out-of-Order Instruction Tracking FIFO)模块进行比较,只有当当前指令的 itag 和 OITF 中最顶部指令的 itag 相同时才进行写回操作。
在实现中,先通过逻辑运算得到写回操作是否可以进行,然后根据需要写回的寄存器和是否有错误信息,选择是否需要与提交模块进行握手,最后输出写回操作的结果。
同时,该模块还实现了对异常信息的处理,当指令有错误信息时,需要将错误信息传递给提交模块进行处理。
首先,通过逻辑运算得到写回操作是否可以进行:
wire wbck_ready4lsu = (lsu_wbck_i_itag == oitf_ret_ptr) & (~oitf_empty);
wire wbck_sel_lsu = lsu_wbck_i_valid & wbck_ready4lsu;
其中,wbck_ready4lsu
表示当前指令是否可以进行写回,wbck_sel_lsu
表示是否有需要进行写回的指令。
然后,根据需要写回的寄存器和是否有错误信息,选择是否需要与提交模块进行握手:
assign {
longp_excp_o_insterr
,longp_excp_o_ld
,longp_excp_o_st
,longp_excp_o_buserr
,longp_excp_o_badaddr } =
({`E203_ADDR_SIZE+4{wbck_sel_lsu}} &
{
1'b0,
lsu_cmt_i_ld,
lsu_cmt_i_st,
lsu_cmt_i_buserr,
lsu_cmt_i_badaddr
})
;
这里使用了 Verilog 中的拼接操作符 {}
,将 wbck_sel_lsu
拼接成一个长度为 E203_ADDR_SIZE+4
的向量,然后和相应的信号进行逻辑与运算,得到需要传递给提交模块的异常信息。
接着,根据是否需要写回和是否有错误信息,选择是否需要与提交模块进行握手:
wire need_wbck = wbck_i_rdwen & (~wbck_i_err);
wire need_excp = wbck_i_err;
assign wbck_i_ready =
(need_wbck ? longp_wbck_o_ready : 1'b1)
& (need_excp ? longp_excp_o_ready : 1'b1);
最后,根据需要写回和是否有错误信息,输出写回操作的结果:
assign longp_wbck_o_valid = need_wbck & wbck_i_valid & (need_excp ? longp_excp_o_ready : 1'b1);
assign longp_excp_o_valid = need_excp & wbck_i_valid & (need_wbck ? longp_wbck_o_ready : 1'b1);
assign longp_wbck_o_wdat = wbck_i_wdat ;
assign longp_wbck_o_flags = wbck_i_flags ;
assign longp_wbck_o_rdfpu = wbck_i_rdfpu ;
assign longp_wbck_o_rdidx = wbck_i_rdidx;
assign longp_excp_o_pc = wbck_i_pc;
assign oitf_ret_ena = wbck_i_valid & wbck_i_ready;
其中,need_wbck
表示是否需要进行写回操作,need_excp
表示是否需要将错误信息传递给提交模块。如果需要进行写回操作,则输出写回操作的结果,包括写回的数据、标志位、寄存器索引和是否为 FPU 寄存器等信息;如果需要将错误信息传递给提交模块,则输出错误信息和当前指令的 PC 值;最后,如果当前指令有效并且已经完成写回操作,则将 oitf_ret_ena
设为 1,表示可以将 OITF 中的指令弹出。
在修改前,保证浮点数指令中长指令已经在iotf中实现
在输入输出段定义一下字段
// The fpu Write-Back Interface
input fpu_wbck_i_valid, // Handshake valid
output fpu_wbck_i_ready, // Handshake ready
input [`E203_FLEN-1:0] fpu_wbck_i_wdat,
input [`E203_ITAG_WIDTH -1:0] fpu_wbck_i_itag,
模仿代码做更改,例如:
// The Long-pipe instruction can write-back only when it's itag
// is same as the itag of toppest entry of OITF
wire wbck_ready4lsu = (lsu_wbck_i_itag == oitf_ret_ptr) & (~oitf_empty);
wire wbck_sel_lsu = lsu_wbck_i_valid & wbck_ready4lsu;
wire wbck_ready4fpu = (fpu_wbck_i_itag == oitf_ret_ptr) & (~oitf_empty);
wire wbck_sel_fpu = fpu_wbck_i_valid & wbck_ready4fpu;
其他地方修改类似,即可完成对长指令写回仲裁的更改。