@@ -1176,7 +1176,9 @@ module ibex_core import ibex_pkg::*; #(
1176
1176
ibex_pkg :: irqs_t captured_mip;
1177
1177
logic captured_nmi;
1178
1178
logic captured_debug_req;
1179
- logic captured_valid;
1179
+ logic captured_valid_nmi;
1180
+ logic captured_valid_irq;
1181
+ logic captured_valid_dbg;
1180
1182
1181
1183
// RVFI extension for co-simulation support
1182
1184
// debug_req and MIP captured at IF -> ID transition so one extra stage
@@ -1321,23 +1323,33 @@ module ibex_core import ibex_pkg::*; #(
1321
1323
1322
1324
always_ff @ (posedge clk_i or negedge rst_ni) begin
1323
1325
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 ;
1325
1329
captured_mip <= '0 ;
1326
1330
captured_nmi <= 1'b0 ;
1327
1331
captured_debug_req <= 1'b0 ;
1328
1332
end else begin
1329
1333
// Capture when ID stage has emptied out and something occurs that will cause a trap and we
1330
1334
// 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 ;
1333
1337
captured_nmi <= irq_nm_i;
1338
+ end
1339
+ if (~ instr_valid_id & new_irq & ~ captured_valid_irq) begin
1340
+ captured_valid_irq <= 1'b1 ;
1334
1341
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 ;
1335
1345
captured_debug_req <= debug_req_i;
1336
1346
end
1337
1347
1338
1348
// Capture cleared out as soon as a new instruction appears in ID
1339
1349
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 ;
1341
1353
end
1342
1354
end
1343
1355
end
@@ -1354,12 +1366,12 @@ module ibex_core import ibex_pkg::*; #(
1354
1366
rvfi_ext_stage_nmi[0 ] <= '0 ;
1355
1367
rvfi_ext_stage_debug_req[0 ] <= '0 ;
1356
1368
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;
1363
1375
end
1364
1376
end
1365
1377
0 commit comments