diff options
| author | Alejandro Soto <alejandro@34project.org> | 2022-11-07 17:20:38 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2022-11-07 17:25:11 -0600 |
| commit | cc7ed6bd05b8143ed4250caf97798c8bbfc6b748 (patch) | |
| tree | 4fef961873f1a52020ee2cb7c49b59c3fc842c10 /rtl/core/regs/file.sv | |
| parent | 280cb5bb42f56d13ae2043b955a7bf286022b0b7 (diff) | |
Rework regfile in order to remove negedge trigger
Diffstat (limited to 'rtl/core/regs/file.sv')
| -rw-r--r-- | rtl/core/regs/file.sv | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/rtl/core/regs/file.sv b/rtl/core/regs/file.sv index e0f9b4c..38c3301 100644 --- a/rtl/core/regs/file.sv +++ b/rtl/core/regs/file.sv @@ -3,27 +3,47 @@ module core_reg_file ( input logic clk, - input reg_index rd_index, - wr_index, + input psr_mode rd_mode, + input reg_num rd_r, + input reg_index wr_index, input logic wr_enable, + wr_enable_file, input word wr_value, + wr_current, + pc_word, output word rd_value ); // Ver comentario en uarch.sv - word file[30] /*verilator public*/; + word file[`NUM_GPREGS] /*verilator public*/; + word rd_actual; + logic rd_pc, hold_rd_pc, forward; + reg_index rd_index; + + core_reg_map map_rd + ( + .r(rd_r), + .mode(rd_mode), + .is_pc(rd_pc), + .index(rd_index) + ); + + assign rd_value = hold_rd_pc ? pc_word : forward ? wr_current : rd_actual; - //FIXME: Esto claramente no sirve -`ifdef VERILATOR - always_ff @(negedge clk) begin -`else always_ff @(posedge clk) begin -`endif - if(wr_enable) + forward <= wr_enable && rd_index == wr_index; + hold_rd_pc <= rd_pc; + + if(wr_enable_file) file[wr_index] <= wr_value; - rd_value <= file[rd_index]; + rd_actual <= file[rd_index]; + end + + initial begin + forward = 0; + hold_rd_pc = 0; end endmodule |
