diff --git a/lacpu/rtl/mycpu/dt.v b/lacpu/rtl/mycpu/dt.v
new file mode 100644
index 0000000..07d97ea
--- /dev/null
+++ b/lacpu/rtl/mycpu/dt.v
@@ -0,0 +1,63 @@
+module dt
+#(
+ parameter ES_TO_DT_BUS_WD = 340,
+ parameter DT_TO_MS_BUS_WD = 271,
+ parameter MS_TO_ES_BUS_WD = 38
+)
+(
+ input clk,
+ input reset,
+ input flush,
+ input [ 5:0] stall,
+
+ input [ES_TO_DT_BUS_WD -1:0] es_to_dts_bus,
+ output [DT_TO_MS_BUS_WD -1:0] dts_to_ms1_bus,
+ output [MS_TO_ES_BUS_WD -1:0] dts_to_es_bus,
+
+ output data_sram_en,
+ output [ 3:0] data_sram_we,
+ output [31:0] data_sram_addr,
+ output [31:0] data_sram_wdata
+);
+
+ reg [ES_TO_DT_BUS_WD -1:0] es_to_dts_bus_r;
+
+ wire reg_we;
+ wire [ 4:0] dest;
+ wire [31:0] es_result;
+
+ assign dts_to_ms1_bus = es_to_dts_bus_r[DT_TO_MS_BUS_WD -1:0];
+
+
+ assign {reg_we ,
+ dest ,
+ es_result
+ } = es_to_dts_bus_r[133:96];
+
+ assign {data_sram_en ,
+ data_sram_we ,
+ data_sram_addr ,
+ data_sram_wdata
+ } = es_to_dts_bus_r[339:271];
+
+ assign dts_to_es_bus = {reg_we,
+ dest,
+ es_result
+ };
+
+ always @(posedge clk) begin
+ if (reset) begin
+ es_to_dts_bus_r <= 0;
+ end
+ else if (flush) begin
+ es_to_dts_bus_r <= 0;
+ end
+ else if(stall[3] & (!stall[4])) begin
+ es_to_dts_bus_r <= 0;
+ end
+ else if(!stall[3]) begin
+ es_to_dts_bus_r <= es_to_dts_bus;
+ end
+ end
+
+endmodule
\ No newline at end of file
diff --git a/lacpu/rtl/mycpu/exe_stage.v b/lacpu/rtl/mycpu/exe_stage.v
index 0c0dc82..3f94cea 100644
--- a/lacpu/rtl/mycpu/exe_stage.v
+++ b/lacpu/rtl/mycpu/exe_stage.v
@@ -2,7 +2,7 @@ module exe_stage
#(
parameter BR_BUS_WD = 33,
parameter DS_TO_ES_BUS_WD = 301,
- parameter ES_TO_MS_BUS_WD = 271,
+ parameter ES_TO_DT_BUS_WD = 340,
parameter MS_TO_ES_BUS_WD = 38,
parameter WS_TO_ES_BUS_WD = 38
)
@@ -16,19 +16,24 @@ module exe_stage
//output stallreq_es_for_cache,
input [DS_TO_ES_BUS_WD -1:0] ds_to_es_bus,
- output [ES_TO_MS_BUS_WD -1:0] es_to_ms1_bus,
+ output [ES_TO_DT_BUS_WD -1:0] es_to_dts_bus,
- input [MS_TO_ES_BUS_WD -1:0] ms1_to_es_bus,
- input [MS_TO_ES_BUS_WD -1:0] ms_to_es_bus,
- input [WS_TO_ES_BUS_WD -1:0] ws_to_es_bus,
+ input src1_is_forward,
+ input src2_is_forward,
+ input [31:0] src1_forward_result,
+ input [31:0] src2_forward_result,
+ //input [MS_TO_ES_BUS_WD -1:0] dts_to_es_bus,
+ //input [MS_TO_ES_BUS_WD -1:0] ms1_to_es_bus,
+ //input [MS_TO_ES_BUS_WD -1:0] ms2_to_es_bus,
+ //input [WS_TO_ES_BUS_WD -1:0] ws_to_es_bus,
output [BR_BUS_WD -1:0] br_bus,
- input br_taken_buffer,
+ input br_taken_buffer
- output data_sram_en,
- output [ 3:0] data_sram_we,
- output [31:0] data_sram_addr,
- output [31:0] data_sram_wdata
+ // output data_sram_en,
+ // output [ 3:0] data_sram_we,
+ // output [31:0] data_sram_addr,
+ // output [31:0] data_sram_wdata
);
reg [DS_TO_ES_BUS_WD -1:0] ds_to_es_bus_r;
@@ -59,12 +64,15 @@ module exe_stage
wire [31:0] es_pc;
wire [31:0] inst;
+ wire dts_reg_we;
+ wire [ 4:0] dts_dest;
+ wire [31:0] dts_result;
wire ms1_reg_we;
wire [ 4:0] ms1_dest;
wire [31:0] ms1_result;
- wire ms_reg_we;
- wire [ 4:0] ms_dest;
- wire [31:0] ms_result;
+ wire ms2_reg_we;
+ wire [ 4:0] ms2_dest;
+ wire [31:0] ms2_result;
wire ws_reg_we;
wire [ 4:0] ws_dest;
wire [31:0] ws_result;
@@ -92,6 +100,11 @@ module exe_stage
wire excp_adef;
wire excp_ale;
+ wire data_sram_en;
+ wire [ 3:0] data_sram_we;
+ wire [31:0] data_sram_addr;
+ wire [31:0] data_sram_wdata;
+
assign {csr_vec_temp ,//300:237
csr_op ,//236:230
csr_wdata_sel ,//229:229
@@ -117,34 +130,43 @@ module exe_stage
inst //31 :0
} = ds_to_es_bus_r;
- assign {ms1_reg_we,
- ms1_dest,
- ms1_result
- } = ms1_to_es_bus;
+ // assign {dts_reg_we,
+ // dts_dest,
+ // dts_result
+ // } = dts_to_es_bus;
- assign {ms_reg_we,
- ms_dest,
- ms_result
- } = ms_to_es_bus;
+ // assign {ms1_reg_we,
+ // ms1_dest,
+ // ms1_result
+ // } = ms1_to_es_bus;
- assign {ws_reg_we,
- ws_dest,
- ws_result
- } = ws_to_es_bus;
+ // assign {ms2_reg_we,
+ // ms2_dest,
+ // ms2_result
+ // } = ms2_to_es_bus;
- assign es_to_ms1_bus = {csr_vec ,//270:207
- csr_bus ,//206:143
- load_op ,//142:137
- store_op ,//136:134
- reg_we ,//133:133
- dest ,//132:128
- es_result,//127:96
- src1 ,//95 :64
- es_pc ,//63 :32
- inst //31 :0
+ // assign {ws_reg_we,
+ // ws_dest,
+ // ws_result
+ // } = ws_to_es_bus;
+
+ assign es_to_dts_bus = {data_sram_en ,//339:339
+ data_sram_we ,//338:335
+ data_sram_addr ,//334:303
+ data_sram_wdata ,//302:271
+ csr_vec ,//270:207
+ csr_bus ,//206:143
+ load_op ,//142:137
+ store_op ,//136:134
+ reg_we ,//133:133
+ dest ,//132:128
+ es_result ,//127:96
+ src1 ,//95 :64
+ es_pc ,//63 :32
+ inst //31 :0
};
- assign br_flush = (br_taken & ~(csr_cancel|csr_cancel_reg))/* | br_taken_buffer*/; // TODO!
+ assign br_flush = (br_taken & ~(csr_cancel|csr_cancel_reg)) | br_taken_buffer; // TODO!
assign excp_adef = csr_vec[6];
@@ -156,11 +178,11 @@ module exe_stage
ds_to_es_bus_r <= 0;
end
//nop, id stall and ex not stall
- else if (stall[2]&(!stall[3])) begin
+ else if (stall[2] & (!stall[3])) begin
ds_to_es_bus_r <= 0;
end
//nop, id not stall and br_bus[32]
- else if (!stall[2]&br_flush) begin
+ else if (!stall[2] & br_flush) begin
ds_to_es_bus_r <= 0;
end
// id not stall so can go on
@@ -169,13 +191,17 @@ module exe_stage
end
end
- assign src1 = ms1_reg_we & (ms1_dest == rj ) & (rj != 1'b0) ? ms1_result : // TODO!
- ms_reg_we & (ms_dest == rj ) & (rj != 1'b0) ? ms_result :
- ws_reg_we & (ws_dest == rj ) & (rj != 1'b0) ? ws_result :
+ assign src1 = //dts_reg_we & (dts_dest == rj ) & (rj != 1'b0) ? dts_result : // TODO!
+ //ms1_reg_we & (ms1_dest == rj ) & (rj != 1'b0) ? ms1_result : // TODO!
+ //ms2_reg_we & (ms2_dest == rj ) & (rj != 1'b0) ? ms2_result :
+ //ws_reg_we & (ws_dest == rj ) & (rj != 1'b0) ? ws_result :
+ src1_is_forward ? src1_forward_result :
rj_value;
- assign src2 = ms1_reg_we & (ms1_dest == rkd) & (rkd != 1'b0) ? ms1_result : // TODO!
- ms_reg_we & (ms_dest == rkd) & (rkd != 1'b0) ? ms_result :
- ws_reg_we & (ws_dest == rkd) & (rkd != 1'b0) ? ws_result :
+ assign src2 = //dts_reg_we & (dts_dest == rkd) & (rkd != 1'b0) ? dts_result : // TODO!
+ //ms1_reg_we & (ms1_dest == rkd) & (rkd != 1'b0) ? ms1_result : // TODO!
+ //ms2_reg_we & (ms2_dest == rkd) & (rkd != 1'b0) ? ms2_result :
+ //ws_reg_we & (ws_dest == rkd) & (rkd != 1'b0) ? ws_result :
+ src2_is_forward ? src2_forward_result :
rkd_value;
assign alu_src1 = src1_is_pc ? es_pc :
@@ -257,11 +283,12 @@ module exe_stage
alu_result;
assign csr_wdata = src2;
- assign csr_bus = {csr_we,
- csr_wdata_sel,
- csr_op,
- csr_addr,
- csr_wdata
+ assign csr_bus = {9'b0 ,//63:55
+ csr_we ,//54:54
+ csr_wdata_sel ,//53:53
+ csr_op ,//52:46
+ csr_addr ,//45:32
+ csr_wdata //31:0
};
assign csr_vec = {csr_vec_temp[63:8], excp_ale, csr_vec_temp[6:0]};
diff --git a/lacpu/rtl/mycpu/forward.v b/lacpu/rtl/mycpu/forward.v
new file mode 100644
index 0000000..51d89a1
--- /dev/null
+++ b/lacpu/rtl/mycpu/forward.v
@@ -0,0 +1,109 @@
+module forward
+#(
+ parameter DEST_WD = 5,
+ parameter RESULT_WD = 32,
+ parameter CTRL_WD = 2
+)
+(
+ input clk ,
+ input reset,
+
+ input flush,
+ input [ 5:0] stall,
+
+ input [ 4:0] rj,
+ input [ 4:0] rkd,
+ input es_reg_we ,
+ input [DEST_WD -1:0] es_dest ,
+ input [RESULT_WD -1:0] es_result ,
+ input [CTRL_WD -1:0] es_ctrl ,
+ input dts_reg_we,
+ input [DEST_WD -1:0] dts_dest ,
+ input [RESULT_WD -1:0] dts_result,
+ input [CTRL_WD -1:0] dts_ctrl ,
+ input ms1_reg_we,
+ input [DEST_WD -1:0] ms1_dest ,
+ input [RESULT_WD -1:0] ms1_result,
+ input [CTRL_WD -1:0] ms1_ctrl ,
+ input ms2_reg_we,
+ input [DEST_WD -1:0] ms2_dest ,
+ input [RESULT_WD -1:0] ms2_result,
+ input [CTRL_WD -1:0] ms2_ctrl ,
+
+ output reg src1_is_forward,
+ output reg src2_is_forward,
+
+ output reg [RESULT_WD -1:0] src1_forward_result,
+ output reg [RESULT_WD -1:0] src2_forward_result,
+
+ output stallreq_forward
+);
+
+ wire src1_is_es_result;
+ wire src1_is_dts_result;
+ wire src1_is_ms1_result;
+ wire src1_is_ms2_result;
+
+ wire src2_is_es_result;
+ wire src2_is_dts_result;
+ wire src2_is_ms1_result;
+ wire src2_is_ms2_result;
+
+ wire src1_is_forward_w;
+ wire src2_is_forward_w;
+
+ wire [RESULT_WD -1:0] src1_forward_result_w;
+ wire [RESULT_WD -1:0] src2_forward_result_w;
+
+ assign src1_is_es_result = es_reg_we & (rj == es_dest ) & (rj != 0);
+ assign src1_is_dts_result = dts_reg_we & (rj == dts_dest) & (rj != 0);
+ assign src1_is_ms1_result = ms1_reg_we & (rj == ms1_dest) & (rj != 0);
+ assign src1_is_ms2_result = ms2_reg_we & (rj == ms2_dest) & (rj != 0);
+
+ assign src2_is_es_result = es_reg_we & (rkd == es_dest ) & (rkd != 0);
+ assign src2_is_dts_result = dts_reg_we & (rkd == dts_dest) & (rkd != 0);
+ assign src2_is_ms1_result = ms1_reg_we & (rkd == ms1_dest) & (rkd != 0);
+ assign src2_is_ms2_result = ms2_reg_we & (rkd == ms2_dest) & (rkd != 0);
+
+ assign src1_is_forward_w = src1_is_es_result | src1_is_dts_result | src1_is_ms1_result | src1_is_ms2_result;
+ assign src2_is_forward_w = src2_is_es_result | src2_is_dts_result | src2_is_ms1_result | src2_is_ms2_result;
+
+ assign src1_forward_result_w = src1_is_es_result ? es_result :
+ src1_is_dts_result ? dts_result :
+ src1_is_ms1_result ? ms1_result :
+ src1_is_ms2_result ? ms2_result :
+ 32'b0;
+
+ assign src2_forward_result_w = src2_is_es_result ? es_result :
+ src2_is_dts_result ? dts_result :
+ src2_is_ms1_result ? ms1_result :
+ src2_is_ms2_result ? ms2_result :
+ 32'b0;
+
+ assign stallreq_forward = ((|es_ctrl ) & (src1_is_es_result | src2_is_es_result ))
+ | ((|dts_ctrl) & (src1_is_dts_result | src2_is_dts_result))
+ | ((|ms1_ctrl) & (src1_is_ms1_result | src2_is_ms1_result));
+ //| ((|ms2_ctrl) & (src1_is_ms2_result | src2_is_ms2_result));
+
+ always @(posedge clk) begin
+ if (reset) begin
+ src1_is_forward <= 0;
+ src2_is_forward <= 0;
+ src1_forward_result <= 0;
+ src2_forward_result <= 0;
+ end
+ else if (stall[2] & (!stall[3])) begin
+ src1_is_forward <= 0;
+ src2_is_forward <= 0;
+ src1_forward_result <= 0;
+ src2_forward_result <= 0;
+ end
+ else if (!stall[2]) begin
+ src1_is_forward <= src1_is_forward_w;
+ src2_is_forward <= src2_is_forward_w;
+ src1_forward_result <= src1_forward_result_w;
+ src2_forward_result <= src2_forward_result_w;
+ end
+ end
+
+endmodule
\ No newline at end of file
diff --git a/lacpu/rtl/mycpu/mem_stage.v b/lacpu/rtl/mycpu/mem_stage.v
index 2b181fe..bbbe7d1 100644
--- a/lacpu/rtl/mycpu/mem_stage.v
+++ b/lacpu/rtl/mycpu/mem_stage.v
@@ -1,6 +1,6 @@
module mem1_stage
#(
- parameter ES_TO_MS_BUS_WD = 271,
+ parameter DT_TO_MS_BUS_WD = 271,
parameter MS_TO_ES_BUS_WD = 38
)
(
@@ -9,22 +9,22 @@ module mem1_stage
input flush,
input [ 5:0] stall,
- input [ES_TO_MS_BUS_WD -1:0] es_to_ms1_bus,
- output [ES_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus,
+ input [DT_TO_MS_BUS_WD -1:0] dts_to_ms1_bus,
+ output [DT_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus,
output [MS_TO_ES_BUS_WD -1:0] ms1_to_es_bus
);
-reg [ES_TO_MS_BUS_WD -1:0] es_to_ms1_bus_r;
+reg [DT_TO_MS_BUS_WD -1:0] dts_to_ms1_bus_r;
wire reg_we;
wire [ 4:0] dest;
wire [31:0] es_result;
-assign ms1_to_ms2_bus = es_to_ms1_bus_r;
+assign ms1_to_ms2_bus = dts_to_ms1_bus_r;
-assign reg_we = es_to_ms1_bus_r[133:133];
-assign dest = es_to_ms1_bus_r[132:128];
-assign es_result = es_to_ms1_bus_r[127:96];
+assign reg_we = dts_to_ms1_bus_r[133:133];
+assign dest = dts_to_ms1_bus_r[132:128];
+assign es_result = dts_to_ms1_bus_r[127:96];
assign ms1_to_es_bus = {reg_we,
dest,
@@ -33,16 +33,16 @@ assign ms1_to_es_bus = {reg_we,
always @(posedge clk) begin
if (reset) begin
- es_to_ms1_bus_r <= 0;
+ dts_to_ms1_bus_r <= 0;
end
else if (flush) begin
- es_to_ms1_bus_r <= 0;
+ dts_to_ms1_bus_r <= 0;
end
else if(stall[3] & (!stall[4])) begin
- es_to_ms1_bus_r <= 0;
+ dts_to_ms1_bus_r <= 0;
end
else if(!stall[3]) begin
- es_to_ms1_bus_r <= es_to_ms1_bus;
+ dts_to_ms1_bus_r <= dts_to_ms1_bus;
end
end
@@ -52,9 +52,9 @@ endmodule
module mem2_stage
#(
- parameter ES_TO_MS_BUS_WD = 271,
+ parameter DT_TO_MS_BUS_WD = 271,
parameter MS_TO_ES_BUS_WD = 38,
- parameter MS_TO_WS_BUS_WD = 102
+ parameter MS_TO_WS_BUS_WD = 172
)
(
input clk,
@@ -72,14 +72,14 @@ module mem2_stage
input [ 7:0] ext_int,
- input [ES_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus,
- output [MS_TO_ES_BUS_WD -1:0] ms_to_es_bus,
+ input [DT_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus,
+ output [MS_TO_ES_BUS_WD -1:0] ms2_to_es_bus,
output [MS_TO_WS_BUS_WD -1:0] ms2_to_ws_bus,
input [31:0] data_sram_rdata
);
- reg [ES_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus_r;
+ reg [DT_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus_r;
reg [31:0] data_sram_rdata_r;
reg [31:0] data_sram_rdata_buffer;
reg [31:0] csr_rdata_buffer;
@@ -132,12 +132,14 @@ module mem2_stage
inst //31 :0
} = ms1_to_ms2_bus_r;
- assign ms_to_es_bus = {reg_we,
- dest,
- ms_final_result//es_result
- };
+ assign ms2_to_es_bus = {reg_we,
+ dest,
+ ms_final_result//es_result
+ };
- assign ms2_to_ws_bus = {reg_we ,//101:101
+ assign ms2_to_ws_bus = {csr_bus ,//171:108
+ load_op ,//107:102
+ reg_we ,//101:101
dest ,//100:96
ms_final_result ,//95 :64
ms_pc ,//63 :32
diff --git a/lacpu/rtl/mycpu/mycpu_core.v b/lacpu/rtl/mycpu/mycpu_core.v
index 98ced1c..faebbc4 100644
--- a/lacpu/rtl/mycpu/mycpu_core.v
+++ b/lacpu/rtl/mycpu/mycpu_core.v
@@ -4,8 +4,9 @@ module mycpu_core
#(
parameter FS_TO_DS_BUS_WD = 34,
parameter DS_TO_ES_BUS_WD = 301,
- parameter ES_TO_MS_BUS_WD = 271,
- parameter MS_TO_WS_BUS_WD = 102,
+ parameter ES_TO_DT_BUS_WD = 340,
+ parameter DT_TO_MS_BUS_WD = 271,
+ parameter MS_TO_WS_BUS_WD = 172,
parameter WS_TO_RF_BUS_WD = 38,
parameter MS_TO_ES_BUS_WD = 38,
@@ -50,18 +51,26 @@ module mycpu_core
wire [FS_TO_DS_BUS_WD -1:0] fs1_to_fs2_bus;
wire [FS_TO_DS_BUS_WD -1:0] fs2_to_ds_bus;
wire [DS_TO_ES_BUS_WD -1:0] ds_to_es_bus;
- wire [ES_TO_MS_BUS_WD -1:0] es_to_ms1_bus;
- wire [ES_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus;
+ wire [ES_TO_DT_BUS_WD -1:0] es_to_dts_bus;
+ wire [DT_TO_MS_BUS_WD -1:0] dts_to_ms1_bus;
+ wire [DT_TO_MS_BUS_WD -1:0] ms1_to_ms2_bus;
wire [MS_TO_WS_BUS_WD -1:0] ms2_to_ws_bus;
wire [WS_TO_RF_BUS_WD -1:0] ws_to_rf_bus;
- wire [MS_TO_ES_BUS_WD -1:0] ms1_to_es_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 [MS_TO_ES_BUS_WD -1:0] ms1_to_es_bus;
+ //wire [MS_TO_ES_BUS_WD -1:0] ms2_to_es_bus;
+ //wire [WS_TO_ES_BUS_WD -1:0] ws_to_es_bus;
wire [BR_BUS_WD -1:0] br_bus;
wire [BR_BUS_WD -1:0] br_bus_real;
+ wire src1_is_forward;
+ wire src2_is_forward;
+ wire [31:0] src1_forward_result;
+ wire [31:0] src2_forward_result;
+
+ wire stallreq_forward;
+
wire flush;
wire stallreq_es;
wire stallreq_ds;
@@ -97,7 +106,7 @@ module mycpu_core
assign br_target = br_bus[32] ? br_bus[31:0] :
br_taken_buffer ? br_target_buffer :
32'b0;
- assign br_bus_real = {br_taken, br_target};
+ assign br_bus_real = {br_taken, br_target}; // TODO!
if1_stage if1_stage(
@@ -148,14 +157,32 @@ module mycpu_core
.stallreq_es (stallreq_es ),
.ds_to_es_bus (ds_to_es_bus ),
- .es_to_ms1_bus (es_to_ms1_bus ),
+ .es_to_dts_bus (es_to_dts_bus ),
- .ms1_to_es_bus (ms1_to_es_bus ),
- .ms_to_es_bus (ms_to_es_bus ),
- .ws_to_es_bus (ws_to_es_bus ),
+ .src1_is_forward (src1_is_forward ),
+ .src2_is_forward (src2_is_forward ),
+ .src1_forward_result (src1_forward_result),
+ .src2_forward_result (src2_forward_result),
+
+ //.dts_to_es_bus (dts_to_es_bus ),
+ //.ms1_to_es_bus (ms1_to_es_bus ),
+ //.ms2_to_es_bus (ms2_to_es_bus ),
+ //.ws_to_es_bus (ws_to_es_bus ),
.br_bus (br_bus ),
- .br_taken_buffer (br_taken_buffer ),
+ .br_taken_buffer (br_taken_buffer )
+ );
+
+ dt dt(
+ .clk (clk ),
+ .reset (reset ),
+ .flush (flush ),
+ .stall (stall ),
+
+ .es_to_dts_bus (es_to_dts_bus ),
+ .dts_to_ms1_bus (dts_to_ms1_bus ),
+
+ //.dts_to_es_bus (dts_to_es_bus ),
.data_sram_en (data_sram_en ),
.data_sram_we (data_sram_we ),
@@ -169,10 +196,10 @@ module mycpu_core
.flush (flush ),
.stall (stall ),
- .es_to_ms1_bus (es_to_ms1_bus ),
- .ms1_to_ms2_bus (ms1_to_ms2_bus ),
+ .dts_to_ms1_bus (dts_to_ms1_bus ),
+ .ms1_to_ms2_bus (ms1_to_ms2_bus )
- .ms1_to_es_bus (ms1_to_es_bus )
+ //.ms1_to_es_bus (ms1_to_es_bus )
);
@@ -189,7 +216,7 @@ module mycpu_core
.ext_int (ext_int ),
.ms1_to_ms2_bus (ms1_to_ms2_bus ),
- .ms_to_es_bus (ms_to_es_bus ),
+ //.ms2_to_es_bus (ms2_to_es_bus ),
.ms2_to_ws_bus (ms2_to_ws_bus ),
.data_sram_rdata (data_sram_rdata )
@@ -211,13 +238,50 @@ module mycpu_core
.debug_wb_rf_wdata (debug_wb_rf_wdata)
);
+ forward forward(
+ .clk (clk ),
+ .reset (reset),
+ .flush (flush),
+ .stall (stall),
+
+ .rj (ds_to_es_bus[174:170] ),
+ .rkd (ds_to_es_bus[169:165] ),
+
+ .es_reg_we (es_to_dts_bus[133] ),
+ .es_dest (es_to_dts_bus[132:128] ),
+ .es_result (es_to_dts_bus[127:96 ] ),
+ .es_ctrl ({(|es_to_dts_bus[142:137] ), (|es_to_dts_bus[195:189] )}),
+
+ .dts_reg_we (dts_to_ms1_bus[133] ),
+ .dts_dest (dts_to_ms1_bus[132:128]),
+ .dts_result (dts_to_ms1_bus[127:96 ]),
+ .dts_ctrl ({(|dts_to_ms1_bus[142:137]), (|dts_to_ms1_bus[195:189])}),
+
+ .ms1_reg_we (ms1_to_ms2_bus[133] ),
+ .ms1_dest (ms1_to_ms2_bus[132:128]),
+ .ms1_result (ms1_to_ms2_bus[127:96 ]),
+ .ms1_ctrl ({(|ms1_to_ms2_bus[142:137]), (|ms1_to_ms2_bus[195:189])}),
+
+ .ms2_reg_we (ms2_to_ws_bus[101] ),
+ .ms2_dest (ms2_to_ws_bus[100:96] ),
+ .ms2_result (ms2_to_ws_bus[95 :64 ] ),
+ .ms2_ctrl (2'b0),
+
+ .src1_is_forward (src1_is_forward ),
+ .src2_is_forward (src2_is_forward ),
+ .src1_forward_result (src1_forward_result ),
+ .src2_forward_result (src2_forward_result ),
+ .stallreq_forward (stallreq_forward )
+ );
+
+
pip_ctrl pip_ctrl(
.reset (reset ),
.except_en (except_en ),
- .stallreq_ds (stallreq_ds ),
+ .stallreq_ds (stallreq_forward),
.stallreq_es (stallreq_es ),
.stallreq_axi (stallreq_cache ),
- .stallreq_cache (stallreq_cache ),
+ //.stallreq_cache (stallreq_cache ),
.flush (flush ),
.stall (stall )
);
diff --git a/lacpu/rtl/mycpu/pip_ctrl.v b/lacpu/rtl/mycpu/pip_ctrl.v
index 80b9b2a..7d0166a 100644
--- a/lacpu/rtl/mycpu/pip_ctrl.v
+++ b/lacpu/rtl/mycpu/pip_ctrl.v
@@ -34,7 +34,7 @@ module pip_ctrl(
flush = 0;
stall = `StallBus'b111111;
end
- //id段发生暂停,此时id及之前暂?
+ //id段发生暂停,此时id及之前暂停
else if (stallreq_ds) begin
flush = 0;
stall = `StallBus'b000111;
diff --git a/lacpu/rtl/mycpu/wb_stage.v b/lacpu/rtl/mycpu/wb_stage.v
index 2b78e1a..5dc36ab 100644
--- a/lacpu/rtl/mycpu/wb_stage.v
+++ b/lacpu/rtl/mycpu/wb_stage.v
@@ -1,6 +1,6 @@
module wb_stage
#(
- parameter MS_TO_WS_BUS_WD = 102,
+ parameter MS_TO_WS_BUS_WD = 172,
parameter WS_TO_RF_BUS_WD = 38,
parameter WS_TO_ES_BUS_WD = 38
)
@@ -32,7 +32,7 @@ module wb_stage
ms_final_result ,//95 :64
ws_pc ,//63 :32
inst //31 :0
- } = ms2_to_ws_bus_r;
+ } = ms2_to_ws_bus_r[101:0];
assign ws_to_rf_bus = {reg_we,
dest,
diff --git a/lacpu/rtl/xilinx_ip/clk_pll/clk_pll.xci b/lacpu/rtl/xilinx_ip/clk_pll/clk_pll.xci
index 6ae03ba..dbe8b2e 100644
--- a/lacpu/rtl/xilinx_ip/clk_pll/clk_pll.xci
+++ b/lacpu/rtl/xilinx_ip/clk_pll/clk_pll.xci
@@ -98,17 +98,17 @@
100.0
0000
0000
- 65.00000
+ 84.61538
0000
0000
100.00000
BUFG
50.0
false
- 65.00000
+ 84.61538
0.000
50.000
- 65.000
+ 85.000
0.000
1
0000
@@ -203,12 +203,12 @@
din
0000
1
- 0.65
- 0.65
- 0.65
- 0.65
- 0.65
- 0.65
+ 0.85
+ 0.85
+ 0.85
+ 0.85
+ 0.85
+ 0.85
dout
drdy
dwe
@@ -246,16 +246,16 @@
false
false
OPTIMIZED
- 13.000
+ 11.000
0.000
FALSE
10.000
10.000
- 20.000
+ 13.000
0.500
0.000
FALSE
- 13
+ 11
0.500
0.000
FALSE
@@ -292,8 +292,8 @@
2
Output Output Phase Duty Cycle Pk-to-Pk Phase
Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps)
- _cpu_clk__65.00000______0.000______50.0______118.571_____82.897
- timer_clk__100.00000______0.000______50.0______109.471_____82.897
+ _cpu_clk__84.61538______0.000______50.0______127.938_____92.672
+ timer_clk__100.00000______0.000______50.0______123.670_____92.672
no_CLK_OUT3_output
no_CLK_OUT4_output
no_CLK_OUT5_output
@@ -414,18 +414,18 @@
100.0
0.010
BUFG
- 118.571
+ 127.938
false
- 82.897
+ 92.672
50.000
- 65.000
+ 85.000
0.000
1
true
BUFG
- 109.471
+ 123.670
false
- 82.897
+ 92.672
50.000
100.000
0.000
@@ -525,16 +525,16 @@
No_Jitter
locked
OPTIMIZED
- 13
+ 11
0.000
false
10.000
10.000
- 20
+ 13
0.500
0.000
false
- 13
+ 11
0.500
0.000
false
@@ -712,6 +712,8 @@
+
+
diff --git a/lacpu/run_vivado/la32r/la32r.xpr b/lacpu/run_vivado/la32r/la32r.xpr
index d702fef..f82faf3 100644
--- a/lacpu/run_vivado/la32r/la32r.xpr
+++ b/lacpu/run_vivado/la32r/la32r.xpr
@@ -36,13 +36,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -135,6 +135,13 @@
+
+
+
+
+
+
+
@@ -142,6 +149,13 @@
+
+
+
+
+
+
+
@@ -391,10 +405,12 @@
-
- Vivado Synthesis Defaults
-
-
+
+
+
+
+
+
@@ -443,16 +459,20 @@
-
- Default settings for Implementation.
-
+
-
+
+
+
-
-
+
+
+
+
+
+