summaryrefslogtreecommitdiff
path: root/rtl/core/control/writeback.sv
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/core/control/writeback.sv')
-rw-r--r--rtl/core/control/writeback.sv108
1 files changed, 57 insertions, 51 deletions
diff --git a/rtl/core/control/writeback.sv b/rtl/core/control/writeback.sv
index 733881c..a4465ff 100644
--- a/rtl/core/control/writeback.sv
+++ b/rtl/core/control/writeback.sv
@@ -35,53 +35,91 @@ module core_control_writeback
output psr_flags wb_alu_flags
);
- always_ff @(posedge clk) begin
- wb_alu_flags <= alu_flags;
+ reg_num last_rd;
+ always_comb begin
+ rd = last_rd;
unique case(next_cycle)
TRANSFER:
if(mem_ready)
- rd <= final_rd;
+ rd = final_rd;
ISSUE, BASE_WRITEBACK:
- rd <= final_rd;
+ rd = final_rd;
EXCEPTION:
- rd <= `R15;
+ rd = `R15;
MUL_HI_WB:
- rd <= mul_r_add_hi;
+ rd = mul_r_add_hi;
endcase
unique case(next_cycle)
ISSUE:
- if(issue)
- final_rd <= dec_data.rd;
+ writeback = final_writeback;
TRANSFER:
- if((cycle != TRANSFER || mem_ready) && pop_valid)
- final_rd <= popped;
+ writeback = mem_ready && !mem_write;
BASE_WRITEBACK:
- final_rd <= ra;
+ writeback = !mem_write;
+
+ EXCEPTION, MUL_HI_WB:
+ writeback = 1;
+
+ default:
+ writeback = 0;
+ endcase
+
+ unique case(cycle)
+ TRANSFER:
+ wr_value = mem_data_rd;
+
+ BASE_WRITEBACK:
+ wr_value = saved_base;
+
+ MUL, MUL_HI_WB:
+ wr_value = mul_q_lo;
+
+ default:
+ // Ruta combinacional larga
+ wr_value = q_alu;
+ endcase
+
+ unique case(next_cycle)
+ TRANSFER:
+ if(mem_ready)
+ wr_value = mem_data_rd;
+
+ BASE_WRITEBACK:
+ wr_value = mem_data_rd;
EXCEPTION:
- final_rd <= `R14;
+ wr_value = vector;
+
+ MUL_HI_WB:
+ wr_value = mul_q_hi;
endcase
+ end
+
+ always_ff @(posedge clk) begin
+ last_rd <= rd;
+ wb_alu_flags <= alu_flags;
- writeback <= 0;
unique case(next_cycle)
ISSUE:
- writeback <= final_writeback;
+ if(issue)
+ final_rd <= dec_data.rd;
TRANSFER:
- writeback <= mem_ready && !mem_write;
+ if((cycle != TRANSFER || mem_ready) && pop_valid)
+ final_rd <= popped;
BASE_WRITEBACK:
- writeback <= !mem_write;
+ final_rd <= ra;
- EXCEPTION, MUL_HI_WB:
- writeback <= 1;
+ EXCEPTION:
+ final_rd <= `R14;
endcase
unique case(next_cycle)
@@ -108,48 +146,16 @@ module core_control_writeback
EXCEPTION:
final_update_flags <= 0;
endcase
-
- unique case(cycle)
- TRANSFER:
- wr_value <= mem_data_rd;
-
- BASE_WRITEBACK:
- wr_value <= saved_base;
-
- MUL, MUL_HI_WB:
- wr_value <= mul_q_lo;
-
- default:
- wr_value <= q_alu;
- endcase
-
- unique case(next_cycle)
- TRANSFER:
- if(mem_ready)
- wr_value <= mem_data_rd;
-
- BASE_WRITEBACK:
- wr_value <= mem_data_rd;
-
- EXCEPTION:
- wr_value <= vector;
-
- MUL_HI_WB:
- wr_value <= mul_q_hi;
- endcase
end
initial begin
- rd = 0;
+ last_rd = 0;
final_rd = 0;
-
- writeback = 0;
final_writeback = 0;
update_flags = 0;
final_update_flags = 0;
- wr_value = 0;
wb_alu_flags = {$bits(wb_alu_flags){1'b0}};
end