fix load stall logic
This commit is contained in:
+13
-10
@@ -60,14 +60,22 @@ module cpu_top (
|
|||||||
logic ebreak_latch;
|
logic ebreak_latch;
|
||||||
logic load_stall;
|
logic load_stall;
|
||||||
logic load_stall_cycle;
|
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
|
always_ff @(posedge clk_i) begin
|
||||||
if (load_stall & ~load_stall_cycle) begin
|
if (rst_i) begin
|
||||||
stall_core <= 1'b1;
|
halted_o <= 1'b0;
|
||||||
load_stall_cycle <= 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
|
end
|
||||||
|
|
||||||
// === Instruction Fetch === //
|
// === Instruction Fetch === //
|
||||||
@@ -109,17 +117,12 @@ module cpu_top (
|
|||||||
.rs1_data_o(rs1_data),
|
.rs1_data_o(rs1_data),
|
||||||
.rs2_data_o(rs2_data),
|
.rs2_data_o(rs2_data),
|
||||||
.load_stall_o(load_stall),
|
.load_stall_o(load_stall),
|
||||||
|
.load_stall_ff_i(load_stall_ff),
|
||||||
.instr_invld_o(instr_invld_decode),
|
.instr_invld_o(instr_invld_decode),
|
||||||
.reg_values_o(reg_crossbar_o),
|
.reg_values_o(reg_crossbar_o),
|
||||||
.ebreak_o(ebreak_latch)
|
.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
|
always_comb begin
|
||||||
if (pc_target[31:12] == '0) begin
|
if (pc_target[31:12] == '0) begin
|
||||||
branch_vld = '1;
|
branch_vld = '1;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ module decode (
|
|||||||
input logic instr_vld_i, // is instruction passed valid
|
input logic instr_vld_i, // is instruction passed valid
|
||||||
input logic alu_zero_i,
|
input logic alu_zero_i,
|
||||||
input logic [31:0] rd_data_i,
|
input logic [31:0] rd_data_i,
|
||||||
|
input logic load_stall_ff_i,
|
||||||
|
|
||||||
output logic pc_src_o,
|
output logic pc_src_o,
|
||||||
output logic result_src_o,
|
output logic result_src_o,
|
||||||
@@ -49,7 +50,7 @@ module decode (
|
|||||||
.rs2_addr_i(instr_i[24:20]),
|
.rs2_addr_i(instr_i[24:20]),
|
||||||
.rs1_data_o(rs1_data_o),
|
.rs1_data_o(rs1_data_o),
|
||||||
.rs2_data_o(rs2_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_addr_i(instr_i[11:7]),
|
||||||
.rd_data_i(rd_data_i),
|
.rd_data_i(rd_data_i),
|
||||||
.reg_values_o(reg_values_o)
|
.reg_values_o(reg_values_o)
|
||||||
|
|||||||
Reference in New Issue
Block a user