首先,代码中定义了三个接口,分别是ALU指令的写回接口、长流水线指令的写回接口和最终写回到寄存器文件的接口。其中,ALU指令的写回接口和长流水线指令的写回接口都包括数据、寄存器编号和有效性等信号。
// The ALU Write-Back Interface input alu_wbck_i_valid, // Handshake valid output alu_wbck_i_ready, // Handshake ready input [`E203_XLEN-1:0] alu_wbck_i_wdat, input [`E203_RFIDX_WIDTH-1:0] alu_wbck_i_rdidx, // If ALU have error, it will not generate the wback_valid to wback module // so we dont need the alu_wbck_i_err here ////////////////////////////////////////////////////////////// // The Longp Write-Back Interface input longp_wbck_i_valid, // Handshake valid output longp_wbck_i_ready, // Handshake ready input [`E203_FLEN-1:0] longp_wbck_i_wdat, input [5-1:0] longp_wbck_i_flags, input [`E203_RFIDX_WIDTH-1:0] longp_wbck_i_rdidx, input longp_wbck_i_rdfpu, ////////////////////////////////////////////////////////////// // The Final arbitrated Write-Back Interface to Regfile output rf_wbck_o_ena, output [`E203_XLEN-1:0] rf_wbck_o_wdat, output [`E203_RFIDX_WIDTH-1:0] rf_wbck_o_rdidx,
接下来,代码中定义了两个信号:wbck_ready4alu和wbck_ready4longp,分别表示ALU指令和长流水线指令是否可以进行写回。具体来说,wbck_ready4alu是一个非长流水线指令写回的信号,当它为1时表示ALU指令可以进行写回;wbck_ready4longp则始终为1,表示长流水线指令可以始终进行写回。通过与这两个信号进行与运算,就可以确定哪个指令有优先权进行写回。
// The ALU instruction can write-back only when there is no any // long pipeline instruction writing-back // * Since ALU is the 1 cycle instructions, it have lowest // priority in arbitration wire wbck_ready4alu = (~longp_wbck_i_valid); wire wbck_sel_alu = alu_wbck_i_valid & wbck_ready4alu; // The Long-pipe instruction can always write-back since it have high priority wire wbck_ready4longp = 1'b1; wire wbck_sel_longp = longp_wbck_i_valid & wbck_ready4longp;