From 7094593bd44094ae42b453985ec354525bca34fe Mon Sep 17 00:00:00 2001 From: dylanbenzi Date: Sun, 20 Sep 2026 19:10:26 -0400 Subject: [PATCH] fix load stall logic --- src/verilog/cpu/cpu_top.sv | 23 +++++++++++++---------- src/verilog/cpu/decode.sv | 3 ++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/verilog/cpu/cpu_top.sv b/src/verilog/cpu/cpu_top.sv index bae7e14..edba9bf 100644 --- a/src/verilog/cpu/cpu_top.sv +++ b/src/verilog/cpu/cpu_top.sv @@ -60,14 +60,22 @@ module cpu_top ( logic ebreak_latch; logic load_stall; logic load_stall_cycle; + logic load_stall_ff; - assign stall_core = ebreak_latch | halted_o | ~en_i; + assign load_stall_ff = (load_stall & ~load_stall_cycle); + + assign stall_core = ebreak_latch | halted_o | ~en_i | load_stall_ff; always_ff @(posedge clk_i) begin - if (load_stall & ~load_stall_cycle) begin - stall_core <= 1'b1; + if (rst_i) begin + halted_o <= 1'b0; load_stall_cycle <= 1'b0; - end else if (load_stall & load_stall_cycle) stall_core <= 1'b0; + end else if (ebreak_latch) halted_o <= 1'b1; + else if (load_stall & ~load_stall_cycle) begin + load_stall_cycle <= 1'b1; + end else if (load_stall & load_stall_cycle) begin + load_stall_cycle <= 1'b0; + end end // === Instruction Fetch === // @@ -109,17 +117,12 @@ module cpu_top ( .rs1_data_o(rs1_data), .rs2_data_o(rs2_data), .load_stall_o(load_stall), + .load_stall_ff_i(load_stall_ff), .instr_invld_o(instr_invld_decode), .reg_values_o(reg_crossbar_o), .ebreak_o(ebreak_latch) ); - always_ff @(posedge clk_i) begin - if (rst_i) halted_o <= 1'b0; - else if (ebreak_latch) halted_o <= 1'b1; - end - - always_comb begin if (pc_target[31:12] == '0) begin branch_vld = '1; diff --git a/src/verilog/cpu/decode.sv b/src/verilog/cpu/decode.sv index 7cc2b76..cda6f61 100644 --- a/src/verilog/cpu/decode.sv +++ b/src/verilog/cpu/decode.sv @@ -5,6 +5,7 @@ module decode ( input logic instr_vld_i, // is instruction passed valid input logic alu_zero_i, input logic [31:0] rd_data_i, + input logic load_stall_ff_i, output logic pc_src_o, output logic result_src_o, @@ -49,7 +50,7 @@ module decode ( .rs2_addr_i(instr_i[24:20]), .rs1_data_o(rs1_data_o), .rs2_data_o(rs2_data_o), - .rd_write_en_i(reg_write), + .rd_write_en_i(reg_write & ~load_stall_ff_i), .rd_addr_i(instr_i[11:7]), .rd_data_i(rd_data_i), .reg_values_o(reg_values_o)