Skip to content

Commit 554de79

Browse files
committed
[rvfi] Refactoring how we capture async signals
In a scenario where we capture an IRQ and wait to send it with a RVFI package, we stop sampling for other signals (e.g. Debug Req) This makes it hard to find/fix cosimulation bugs so this commit changes that structure to be more flexible for each signal. Signed-off-by: Canberk Topal <ctopal@lowrisc.org>
1 parent d16498f commit 554de79

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

rtl/ibex_core.sv

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,7 +1176,9 @@ module ibex_core import ibex_pkg::*; #(
11761176
ibex_pkg::irqs_t captured_mip;
11771177
logic captured_nmi;
11781178
logic captured_debug_req;
1179-
logic captured_valid;
1179+
logic captured_valid_nmi;
1180+
logic captured_valid_irq;
1181+
logic captured_valid_dbg;
11801182

11811183
// RVFI extension for co-simulation support
11821184
// debug_req and MIP captured at IF -> ID transition so one extra stage
@@ -1321,23 +1323,33 @@ module ibex_core import ibex_pkg::*; #(
13211323

13221324
always_ff @(posedge clk_i or negedge rst_ni) begin
13231325
if (!rst_ni) begin
1324-
captured_valid <= 1'b0;
1326+
captured_valid_nmi <= 1'b0;
1327+
captured_valid_irq <= 1'b0;
1328+
captured_valid_dbg <= 1'b0;
13251329
captured_mip <= '0;
13261330
captured_nmi <= 1'b0;
13271331
captured_debug_req <= 1'b0;
13281332
end else begin
13291333
// Capture when ID stage has emptied out and something occurs that will cause a trap and we
13301334
// haven't yet captured
1331-
if (~instr_valid_id & (new_debug_req | new_irq | new_nmi) & ~captured_valid) begin
1332-
captured_valid <= 1'b1;
1335+
if (~instr_valid_id & new_nmi & ~captured_valid_nmi) begin
1336+
captured_valid_nmi <= 1'b1;
13331337
captured_nmi <= irq_nm_i;
1338+
end
1339+
if (~instr_valid_id & new_irq & ~captured_valid_irq) begin
1340+
captured_valid_irq <= 1'b1;
13341341
captured_mip <= cs_registers_i.mip;
1342+
end
1343+
if (~instr_valid_id & new_debug_req & ~captured_valid_dbg) begin
1344+
captured_valid_dbg <= 1'b1;
13351345
captured_debug_req <= debug_req_i;
13361346
end
13371347

13381348
// Capture cleared out as soon as a new instruction appears in ID
13391349
if (if_stage_i.instr_valid_id_d) begin
1340-
captured_valid <= 1'b0;
1350+
captured_valid_nmi <= 1'b0;
1351+
captured_valid_irq <= 1'b0;
1352+
captured_valid_dbg <= 1'b0;
13411353
end
13421354
end
13431355
end
@@ -1354,12 +1366,12 @@ module ibex_core import ibex_pkg::*; #(
13541366
rvfi_ext_stage_nmi[0] <= '0;
13551367
rvfi_ext_stage_debug_req[0] <= '0;
13561368
end else if (if_stage_i.instr_valid_id_d & if_stage_i.instr_new_id_d) begin
1357-
rvfi_ext_stage_mip[0] <= instr_valid_id | ~captured_valid ? cs_registers_i.mip :
1358-
captured_mip;
1359-
rvfi_ext_stage_nmi[0] <= instr_valid_id | ~captured_valid ? irq_nm_i :
1360-
captured_nmi;
1361-
rvfi_ext_stage_debug_req[0] <= instr_valid_id | ~captured_valid ? debug_req_i :
1362-
captured_debug_req;
1369+
rvfi_ext_stage_mip[0] <= instr_valid_id | ~captured_valid_irq ? cs_registers_i.mip :
1370+
captured_mip;
1371+
rvfi_ext_stage_nmi[0] <= instr_valid_id | ~captured_valid_nmi ? irq_nm_i :
1372+
captured_nmi;
1373+
rvfi_ext_stage_debug_req[0] <= instr_valid_id | ~captured_valid_dbg ? debug_req_i :
1374+
captured_debug_req;
13631375
end
13641376
end
13651377

0 commit comments

Comments
 (0)