63 lines
2.3 KiB
Verilog
63 lines
2.3 KiB
Verilog
`include "mycpu.v"
|
|
|
|
module forward(
|
|
input clk ,
|
|
input reset ,
|
|
input [`DS_TO_FW_BUS_WD -1:0] ds_to_fw_bus,
|
|
input [`ES_TO_FW_BUS_WD -1:0] es_to_fw_bus,
|
|
input [`MS_TO_FW_BUS_WD -1:0] ms_to_fw_bus,
|
|
|
|
output [`FW_TO_ES_BUS_WD -1:0] fw_to_es_bus
|
|
);
|
|
|
|
reg [`DS_TO_FW_BUS_WD -1:0] ds_to_fw_bus_r;
|
|
reg [`ES_TO_FW_BUS_WD -1:0] es_to_fw_bus_r;
|
|
reg [`MS_TO_FW_BUS_WD -1:0] ms_to_fw_bus_r;
|
|
|
|
wire [4:0] ds_rf_raddr1;
|
|
wire [4:0] ds_rf_raddr2;
|
|
wire [4:0] es_rf_raddr2;
|
|
wire [4:0] es_dest;
|
|
wire [4:0] ms_dest;
|
|
|
|
wire es_mem_we;
|
|
wire es_reg_we;
|
|
wire ms_reg_we;
|
|
|
|
wire src1_is_es_dest;
|
|
wire src1_is_ms_dest;
|
|
wire src2_is_es_dest;
|
|
wire src2_is_ms_dest;
|
|
wire data_is_rf_wdata;
|
|
|
|
assign {ds_rf_raddr1, ds_rf_raddr2 } = ds_to_fw_bus_r;
|
|
assign {es_rf_raddr2, es_dest, es_reg_we, es_mem_we} = es_to_fw_bus_r;
|
|
assign {ms_dest , ms_reg_we} = ms_to_fw_bus_r;
|
|
|
|
assign fw_to_es_bus = {src1_is_es_dest , //4:4
|
|
src1_is_ms_dest , //3:3
|
|
src2_is_es_dest , //2:2
|
|
src2_is_ms_dest , //1:1
|
|
data_is_rf_wdata //0:0
|
|
};
|
|
always @(posedge clk) begin
|
|
if(reset) begin
|
|
ds_to_fw_bus_r <= 0;
|
|
es_to_fw_bus_r <= 0;
|
|
ms_to_fw_bus_r <= 0;
|
|
end
|
|
else begin
|
|
ds_to_fw_bus_r <= ds_to_fw_bus;
|
|
es_to_fw_bus_r <= es_to_fw_bus;
|
|
ms_to_fw_bus_r <= ms_to_fw_bus;
|
|
end
|
|
end
|
|
|
|
assign src1_is_ms_dest = ms_reg_we && (ms_dest != 5'b0) && (es_dest != ds_rf_raddr1) && (ms_dest == ds_rf_raddr1);
|
|
assign src1_is_es_dest = es_reg_we && (es_dest != 5'b0) && (es_dest == ds_rf_raddr1);
|
|
assign src2_is_ms_dest = ms_reg_we && (ms_dest != 5'b0) && (es_dest != ds_rf_raddr2) && (ms_dest == ds_rf_raddr2);
|
|
assign src2_is_es_dest = es_reg_we && (es_dest != 5'b0) && (es_dest == ds_rf_raddr2);
|
|
assign data_is_rf_wdata = ms_reg_we && (ms_dest != 5'b0) && (ms_dest == es_rf_raddr2) && es_mem_we;
|
|
|
|
|
|
endmodule |