[Add] add loaduse.v & fix little bug

This commit is contained in:
2023-05-28 16:53:31 +08:00
parent 3b43e06054
commit 144623175a
4 changed files with 70 additions and 20 deletions

View File

@@ -190,15 +190,15 @@ module exe_stage(
always @(posedge clk) begin always @(posedge clk) begin
if(reset) begin if(reset) begin
div_divisor_valid_reg <= 0'b0; div_divisor_valid_reg <= 1'b0;
div_divisor_ready_flag <= 0'b0; div_divisor_ready_flag <= 1'b0;
end end
else if(div_divisor_valid_reg && div_divisor_ready) begin else if(div_divisor_valid_reg && div_divisor_ready) begin
div_divisor_valid_reg <= 0'b0; div_divisor_valid_reg <= 1'b0;
div_divisor_ready_flag <= 0'b1; div_divisor_ready_flag <= 1'b1;
end end
else if((es_inst_divw || es_inst_modw) && !div_divisor_ready_flag) begin else if((es_inst_divw || es_inst_modw) && !div_divisor_ready_flag) begin
div_divisor_valid_reg <= 0'b1; div_divisor_valid_reg <= 1'b1;
end end
else if(es_ready_go) begin else if(es_ready_go) begin
div_divisor_ready_flag <= 1'b0; div_divisor_ready_flag <= 1'b0;
@@ -206,15 +206,15 @@ module exe_stage(
end end
always @(posedge clk) begin always @(posedge clk) begin
if(reset) begin if(reset) begin
div_dividend_valid_reg <= 0'b0; div_dividend_valid_reg <= 1'b0;
div_dividend_ready_flag <= 0'b0; div_dividend_ready_flag <= 1'b0;
end end
else if(div_dividend_valid_reg && div_dividend_ready) begin else if(div_dividend_valid_reg && div_dividend_ready) begin
div_dividend_valid_reg <= 0'b0; div_dividend_valid_reg <= 1'b0;
div_dividend_ready_flag <= 0'b1; div_dividend_ready_flag <= 1'b1;
end end
else if((es_inst_divw || es_inst_modw) && !div_dividend_ready_flag) begin else if((es_inst_divw || es_inst_modw) && !div_dividend_ready_flag) begin
div_dividend_valid_reg <= 0'b1; div_dividend_valid_reg <= 1'b1;
end end
else if(es_ready_go) begin else if(es_ready_go) begin
div_dividend_ready_flag <= 1'b0; div_dividend_ready_flag <= 1'b0;
@@ -222,15 +222,15 @@ module exe_stage(
end end
always @(posedge clk) begin always @(posedge clk) begin
if(reset) begin if(reset) begin
divu_divisor_valid_reg <= 0'b0; divu_divisor_valid_reg <= 1'b0;
divu_divisor_ready_flag <= 0'b0; divu_divisor_ready_flag <= 1'b0;
end end
else if(divu_divisor_valid_reg && divu_divisor_ready) begin else if(divu_divisor_valid_reg && divu_divisor_ready) begin
divu_divisor_valid_reg <= 0'b0; divu_divisor_valid_reg <= 1'b0;
divu_divisor_ready_flag <= 0'b1; divu_divisor_ready_flag <= 1'b1;
end end
else if((es_inst_divw || es_inst_modw) && !divu_divisor_ready_flag) begin else if((es_inst_divw || es_inst_modw) && !divu_divisor_ready_flag) begin
divu_divisor_valid_reg <= 0'b1; divu_divisor_valid_reg <= 1'b1;
end end
else if(es_ready_go) begin else if(es_ready_go) begin
divu_divisor_ready_flag <= 1'b0; divu_divisor_ready_flag <= 1'b0;
@@ -238,15 +238,15 @@ module exe_stage(
end end
always @(posedge clk) begin always @(posedge clk) begin
if(reset) begin if(reset) begin
divu_dividend_valid_reg <= 0'b0; divu_dividend_valid_reg <= 1'b0;
divu_dividend_ready_flag <= 0'b0; divu_dividend_ready_flag <= 1'b0;
end end
else if(divu_dividend_valid_reg && divu_dividend_ready) begin else if(divu_dividend_valid_reg && divu_dividend_ready) begin
divu_dividend_valid_reg <= 0'b0; divu_dividend_valid_reg <= 1'b0;
divu_dividend_ready_flag <= 0'b1; divu_dividend_ready_flag <= 1'b1;
end end
else if((es_inst_divw || es_inst_modw) && !divu_dividend_ready_flag) begin else if((es_inst_divw || es_inst_modw) && !divu_dividend_ready_flag) begin
divu_dividend_valid_reg <= 0'b1; divu_dividend_valid_reg <= 1'b1;
end end
else if(es_ready_go) begin else if(es_ready_go) begin
divu_dividend_ready_flag <= 1'b0; divu_dividend_ready_flag <= 1'b0;

39
lacpu/rtl/cpu/loaduse.v Normal file
View File

@@ -0,0 +1,39 @@
`include "mycpu.v"
module loaduse(
input clk,
input reset,
input [`DS_TO_LU_BUS_WD -1:0] ds_to_lu_bus,
input [`ES_TO_LU_BUS_WD -1:0] es_to_lu_bus,
output loaduse
);
wire [4:0] ds_rf_raddr1;
wire [4:0] ds_rf_raddr2;
wire [4:0] es_load_op;
wire [4:0] es_dest;
reg [`DS_TO_LU_BUS_WD -1:0] ds_to_lu_bus_reg;
reg [`ES_TO_LU_BUS_WD -1:0] es_to_lu_bus_reg;
wire loaduse;
always @(posedge clk) begin
if(reset) begin
ds_to_lu_bus_reg <= 0;
es_to_lu_bus_reg <= 0;
end
else begin
ds_to_lu_bus_reg <= ds_to_lu_bus;
es_to_lu_bus_reg <= es_to_lu_bus;
end
end
assign {ds_rf_rdata1, ds_rf_rdata2} = ds_to_lu_bus_reg;
assign {es_dest , es_load_op } = es_to_lu_bus_reg;
assign loaduse = ^es_load_op &&
(((ds_rf_rdata1 == es_dest) && (ds_rf_rdata1 != 5'b0)) || ((ds_rf_rdata2 == es_dest) && (ds_rf_rdata2 != 5'b0)));
endmodule

View File

@@ -15,4 +15,7 @@
`define MS_TO_ES_BUS_WD 32 `define MS_TO_ES_BUS_WD 32
`define WS_TO_ES_BUS_WD 32 `define WS_TO_ES_BUS_WD 32
`define DS_TO_LU_BUS_WD 10
`define ES_TO_LU_BUS_WD 10
`endif `endif

View File

@@ -152,6 +152,14 @@
<Attr Name="UsedIn" Val="simulation"/> <Attr Name="UsedIn" Val="simulation"/>
</FileInfo> </FileInfo>
</File> </File>
<File Path="$PPRDIR/../../rtl/cpu/loaduse.v">
<FileInfo>
<Attr Name="AutoDisabled" Val="1"/>
<Attr Name="UsedIn" Val="synthesis"/>
<Attr Name="UsedIn" Val="implementation"/>
<Attr Name="UsedIn" Val="simulation"/>
</FileInfo>
</File>
<Config> <Config>
<Option Name="DesignMode" Val="RTL"/> <Option Name="DesignMode" Val="RTL"/>
<Option Name="TopModule" Val="soc_lite_top"/> <Option Name="TopModule" Val="soc_lite_top"/>