diff --git a/lacpu/rtl/cpu/alu.v b/lacpu/rtl/cpu/alu.v
index 63724a3..163f842 100755
--- a/lacpu/rtl/cpu/alu.v
+++ b/lacpu/rtl/cpu/alu.v
@@ -44,9 +44,6 @@ module alu(
wire [31:0] sll_result;
wire [63:0] sr64_result;
wire [31:0] sr_result;
- wire [63:0] mul64_result;
- wire [63:0] mulu64_result;
- wire [31:0] mul_result;
// 32-bit adder
wire [31:0] adder_a;
@@ -77,7 +74,7 @@ module alu(
assign or_result = alu_src1 | alu_src2;
assign nor_result = ~or_result;
assign xor_result = alu_src1 ^ alu_src2;
- assign lui_result = {alu_src2[19:0], 12'b0};
+ assign lui_result = alu_src2;
// SLL result
assign sll_result = alu_src1 << alu_src2[4:0];
diff --git a/lacpu/rtl/cpu/exe_stage.v b/lacpu/rtl/cpu/exe_stage.v
index c0a58eb..49b59e4 100755
--- a/lacpu/rtl/cpu/exe_stage.v
+++ b/lacpu/rtl/cpu/exe_stage.v
@@ -1,7 +1,7 @@
module exe_stage
#(
parameter BR_BUS_WD = 33,
- parameter DS_TO_ES_BUS_WD = 206,
+ parameter DS_TO_ES_BUS_WD = 237,
parameter ES_TO_MS_BUS_WD = 175,
parameter MS_TO_ES_BUS_WD = 38,
parameter WS_TO_ES_BUS_WD = 38
@@ -22,7 +22,7 @@ module exe_stage
output [BR_BUS_WD -1:0] br_bus,
output data_sram_en,
- output [ 7:0] data_sram_we,
+ output [ 3:0] data_sram_we,
output [31:0] data_sram_addr,
output [31:0] data_sram_wdata
);
@@ -71,32 +71,32 @@ module exe_stage
wire data_sram_en_temp;
wire stallreq_for_mul_div;
- wire [31:0] mul_div_result;
+ wire [31:0] mul_div_result; // TODO!!!
wire [31:0] es_result;
wire [31:0] csr_wdata;
wire [63:0] csr_bus;
- assign {csr_op ,//205:199
- csr_wdata_sel ,//198:198
- csr_addr ,//197:184
- csr_we ,//183:183
- alu_op ,//182:171
- mul_div_op ,//170:167
- mul_div_sign ,//166:166
- branch_op ,//165:157
- store_op ,//156:154
- load_op ,//153:148
- reg_we ,//147:147
- src1_is_pc ,//146:146
- src2_is_imm ,//145:145
- src2_is_4 ,//144:144
- rj ,//143:139
- rkd ,//138:134
- rj_value ,//133:102
- rkd_value ,//101:70
- dest ,//69 :65
+ assign {csr_op ,//236:230
+ csr_wdata_sel ,//229:229
+ csr_addr ,//228:215
+ csr_we ,//214:214
+ alu_op ,//213:202
+ mul_div_op ,//198:189
+ mul_div_sign ,//197:197
+ branch_op ,//196:188
+ store_op ,//187:185
+ load_op ,//184:179
+ reg_we ,//178:178
+ src1_is_pc ,//177:177
+ src2_is_imm ,//176:176
+ src2_is_4 ,//175:175
+ rj ,//174:170
+ rkd ,//169:165
+ rj_value ,//164:133
+ rkd_value ,//132:101
+ dest ,//100:96
imm ,//95 :64
es_pc ,//63 :32
inst //31 :0
@@ -176,8 +176,8 @@ module exe_stage
wire csr_cancel;
wire csr_cancel_reg;
- assign csr_cancel = 1'b1;
- assign csr_cancel_reg = 1'b1; //TODO!
+ assign csr_cancel = 1'b0;
+ assign csr_cancel_reg = 1'b0; //TODO!
assign br_bus = {br_taken & ~(csr_cancel|csr_cancel_reg),
br_target
@@ -186,8 +186,8 @@ module exe_stage
lsu u_lsu(
.load_op (load_op ),
.store_op (store_op ),
- .rj_value (rj_value ),
- .rkd_value (rkd_value ),
+ .rj_value (src1 ),
+ .rkd_value (src2 ),
.imm (imm ),
.data_sram_en (data_sram_en_temp),
diff --git a/lacpu/rtl/cpu/id_stage.v b/lacpu/rtl/cpu/id_stage.v
index e6ee87c..2734982 100755
--- a/lacpu/rtl/cpu/id_stage.v
+++ b/lacpu/rtl/cpu/id_stage.v
@@ -1,7 +1,7 @@
module id_stage
#(
parameter FS_TO_DS_BUS_WD = 32,
- parameter DS_TO_ES_BUS_WD = 206,
+ parameter DS_TO_ES_BUS_WD = 237,
parameter WS_TO_RF_BUS_WD = 38
)
(
@@ -12,7 +12,7 @@ module id_stage
input [ 5:0] stall,
input br_taken,
- output stallreq_id,
+ output stallreq_ds,
input pc_valid,
input [31:0] inst_sram_rdata,
@@ -62,12 +62,12 @@ module id_stage
wire [31:0] inst;
wire [31:0] next_inst;
- wire rf_raddr1;
+ wire [ 4:0] rf_raddr1;
wire [31:0] rf_rdata1;
- wire rf_raddr2;
+ wire [ 4:0] rf_raddr2;
wire [31:0] rf_rdata2;
wire rf_we;
- wire rf_waddr;
+ wire [ 4:0] rf_waddr;
wire [31:0] rf_wdata;
wire [31:0] rj_value;
@@ -91,25 +91,25 @@ module id_stage
assign csr_vec_l = 0; //TODO!
assign csr_vec = {csr_vec_h_r, csr_vec_l};
- assign ds_to_es_bus = {csr_op ,//205:199
- csr_wdata_sel ,//198:198
- csr_addr ,//197:184
- csr_we ,//183:183
- alu_op ,//182:171
- mul_div_op & {4{pc_valid_r}} ,//170:167
- mul_div_sign & pc_valid_r ,//166:166
- branch_op & {9{pc_valid_r}} ,//165:157
- store_op & {3{pc_valid_r}} ,//156:154
- load_op & {6{pc_valid_r}} ,//153:148
- reg_we & pc_valid_r ,//147:147
- src1_is_pc ,//146:146
- src2_is_imm ,//145:145
- src2_is_4 ,//144:144
- rj ,//143:139
- rkd ,//138:134
- rj_value ,//133:102
- rkd_value ,//101:70
- dest ,//69 :65
+ assign ds_to_es_bus = {csr_op ,//236:230
+ csr_wdata_sel ,//229:229
+ csr_addr ,//228:215
+ csr_we ,//214:214
+ alu_op ,//213:202
+ mul_div_op & {4{pc_valid_r}} ,//198:189
+ mul_div_sign & pc_valid_r ,//197:197
+ branch_op & {9{pc_valid_r}} ,//196:188
+ store_op & {3{pc_valid_r}} ,//187:185
+ load_op & {6{pc_valid_r}} ,//184:179
+ reg_we & pc_valid_r ,//178:178
+ src1_is_pc ,//177:177
+ src2_is_imm ,//176:176
+ src2_is_4 ,//175:175
+ rj ,//174:170
+ rkd ,//169:165
+ rj_value ,//164:133
+ rkd_value ,//132:101
+ dest ,//100:96
imm ,//95 :64
ds_pc ,//63 :32
inst & {32{pc_valid_r}} //31 :0
@@ -195,7 +195,6 @@ module id_stage
.csr_op (csr_op ),
.csr_addr (csr_addr ),
.csr_wdata_sel (csr_wdata_sel ),
- .sel_rf_res (sel_rf_res ),
.reg_we (reg_we )
);
@@ -246,7 +245,7 @@ module id_stage
//ex段为load指令,且发生数据相关时,id段需要被暂停
assign stallreq_load = ex_is_load & ex_rf_we & ((ex_rf_waddr==rj_value & rj_value!=0)|(ex_rf_waddr==rkd_value & rkd_value!=0));
assign stallreq_csr = ex_is_csr & ex_rf_we & ((ex_rf_waddr==rj_value & rj_value!=0)|(ex_rf_waddr==rkd_value & rkd_value!=0));
- assign stallreq_id = stallreq_load | stallreq_csr;
+ assign stallreq_ds = stallreq_load | stallreq_csr;
endmodule
\ No newline at end of file
diff --git a/lacpu/rtl/cpu/inst_decoder.v b/lacpu/rtl/cpu/inst_decoder.v
index e569ba0..4430218 100644
--- a/lacpu/rtl/cpu/inst_decoder.v
+++ b/lacpu/rtl/cpu/inst_decoder.v
@@ -1,4 +1,3 @@
-`include "tools.v"
module inst_decoder(
input [31:0] inst,
@@ -31,7 +30,7 @@ module inst_decoder(
output csr_wdata_sel,
//output [31:0] csr_vec_l,
- output [ 3:0] sel_rf_res,
+ //output [ 3:0] sel_rf_res,
output reg_we
);
@@ -428,7 +427,7 @@ module inst_decoder(
assign csr_op = {inst_csrrd,
inst_csrwr,
inst_csrxchg,
- inst_rdcntid_w,
+ inst_rdcntid_w,
inst_rdcntvh_w,
inst_rdcntvl_w,
inst_sc_w
@@ -439,8 +438,8 @@ module inst_decoder(
// rf_res from
- assign sel_rf_res[0] = inst_jirl | inst_bl;
- assign sel_rf_res[1] = |load_op;
- assign sel_rf_res[2] = |csr_op;
- assign sel_rf_res[3] = |mul_div_op;
+ // assign sel_rf_res[0] = inst_jirl | inst_bl;
+ // assign sel_rf_res[1] = |load_op;
+ // assign sel_rf_res[2] = |csr_op;
+ // assign sel_rf_res[3] = |mul_div_op;
endmodule
diff --git a/lacpu/rtl/cpu/lsu.v b/lacpu/rtl/cpu/lsu.v
index 6d68569..fa6eca9 100644
--- a/lacpu/rtl/cpu/lsu.v
+++ b/lacpu/rtl/cpu/lsu.v
@@ -6,9 +6,9 @@ module lsu(
input [31:0] imm,
output data_sram_en,
- output data_sram_we,
- output data_sram_addr,
- output data_sram_wdata
+ output [ 3:0] data_sram_we,
+ output [31:0] data_sram_addr,
+ output [31:0] data_sram_wdata
);
wire inst_ll_w;
wire inst_ld_b;
diff --git a/lacpu/rtl/cpu/mem_stage.v b/lacpu/rtl/cpu/mem_stage.v
index 6ddcaca..41a604b 100755
--- a/lacpu/rtl/cpu/mem_stage.v
+++ b/lacpu/rtl/cpu/mem_stage.v
@@ -68,7 +68,7 @@ module mem_stage
assign ms_to_es_bus = {reg_we,
dest,
- es_result
+ (|load_op) ? ms_result : es_result
};
assign ms_to_ws_bus = {reg_we ,//101:101
diff --git a/lacpu/rtl/cpu/mycpu.v b/lacpu/rtl/cpu/mycpu_top.v
similarity index 93%
rename from lacpu/rtl/cpu/mycpu.v
rename to lacpu/rtl/cpu/mycpu_top.v
index f5c144e..7b4f0e1 100644
--- a/lacpu/rtl/cpu/mycpu.v
+++ b/lacpu/rtl/cpu/mycpu_top.v
@@ -1,14 +1,14 @@
-module mycpu
+module mycpu_top
#(
parameter FS_TO_DS_BUS_WD = 32,
- parameter DS_TO_ES_BUS_WD = 206,
+ parameter DS_TO_ES_BUS_WD = 237,
parameter ES_TO_MS_BUS_WD = 175,
parameter MS_TO_WS_BUS_WD = 102,
parameter WS_TO_RF_BUS_WD = 38,
- parameter MS_TO_ES_BUS_WD = 32,
- parameter WS_TO_ES_BUS_WD = 32,
- parameter BR_BUS_WD = 33
+ parameter MS_TO_ES_BUS_WD = 38,
+ parameter WS_TO_ES_BUS_WD = 38,
+ parameter BR_BUS_WD = 33
)
(
@@ -44,11 +44,14 @@ module mycpu
wire [MS_TO_WS_BUS_WD -1:0] ms_to_ws_bus;
wire [WS_TO_RF_BUS_WD -1:0] ws_to_rf_bus;
+ wire [MS_TO_ES_BUS_WD -1:0] ms_to_es_bus;
+ wire [WS_TO_ES_BUS_WD -1:0] ws_to_es_bus;
+
wire [BR_BUS_WD -1:0] br_bus;
wire flush;
wire stallreq_es;
- wire stallreq_id;
+ wire stallreq_ds;
wire [ 5:0] stall;
wire except_en;
wire [31:0] new_pc;
@@ -76,7 +79,7 @@ module mycpu
.flush (flush ),
.stall (stall ),
.br_taken (br_bus[32] ),
- .stallreq_id (stallreq_id ),
+ .stallreq_ds (stallreq_ds ),
.fs_to_ds_bus (fs_to_ds_bus ),
.pc_valid (inst_sram_en ),
.inst_sram_rdata (inst_sram_rdata ),
diff --git a/lacpu/rtl/cpu/regfile.v b/lacpu/rtl/cpu/regfile.v
index e9ad95b..1353032 100755
--- a/lacpu/rtl/cpu/regfile.v
+++ b/lacpu/rtl/cpu/regfile.v
@@ -56,13 +56,13 @@ module regfile(
end
//READ OUT 1
- assign rdata1 = (raddr1==5'b0 ) ? 32'b0 :
- (raddr1==waddr) ? wdata :
- rf[raddr1];
+ assign rdata1 = (raddr1==5'b0 ) ? 32'b0 :
+ (raddr1==waddr) & we ? wdata :
+ rf[raddr1];
//READ OUT 2
- assign rdata2 = (raddr2==5'b0 ) ? 32'b0 :
- (raddr2==waddr) ? wdata :
- rf[raddr2];
+ assign rdata2 = (raddr2==5'b0 ) ? 32'b0 :
+ (raddr2==waddr) & we ? wdata :
+ rf[raddr2];
endmodule
\ No newline at end of file
diff --git a/lacpu/rtl/cpu/tools.v b/lacpu/rtl/cpu/tools.v
index 234bf1f..b140e32 100755
--- a/lacpu/rtl/cpu/tools.v
+++ b/lacpu/rtl/cpu/tools.v
@@ -1,3 +1,4 @@
+`default_nettype wire
module decoder_2_4(
input [ 1:0] in,
output [ 3:0] out
diff --git a/lacpu/rtl/cpu/wb_stage.v b/lacpu/rtl/cpu/wb_stage.v
index 3173862..a4761b3 100755
--- a/lacpu/rtl/cpu/wb_stage.v
+++ b/lacpu/rtl/cpu/wb_stage.v
@@ -62,7 +62,7 @@ module wb_stage
assign debug_wb_pc = ws_pc;
assign debug_wb_rf_we = {4{reg_we}};
- assign debug_wb_rf_wnum = ms_final_result;
+ assign debug_wb_rf_wnum = dest;
assign debug_wb_rf_wdata = ms_final_result;
endmodule
\ No newline at end of file
diff --git a/lacpu/rtl/soc_lite_top.v b/lacpu/rtl/soc_lite_top.v
index 01ca86e..4b06fe4 100755
--- a/lacpu/rtl/soc_lite_top.v
+++ b/lacpu/rtl/soc_lite_top.v
@@ -35,7 +35,7 @@ module soc_lite_top
wire [31:0] cpu_data_rdata;
//cpu
- mycpu mycpu(
+ mycpu_top mycpu_top(
.clk (cpu_clk ),
.resetn (cpu_resetn), //low active
diff --git a/lacpu/run_vivado/la32r/la32r.xpr b/lacpu/run_vivado/la32r/la32r.xpr
index e1acad0..76896df 100644
--- a/lacpu/run_vivado/la32r/la32r.xpr
+++ b/lacpu/run_vivado/la32r/la32r.xpr
@@ -29,7 +29,7 @@
-
+
@@ -145,7 +145,7 @@
-
+
@@ -166,6 +166,13 @@
+
+
+
+
+
+
+
@@ -320,7 +327,7 @@
-
+
@@ -333,7 +340,6 @@
-