Skip to content

Commit 2727aa9

Browse files
Merge pull request #2449 from dd-baoshan/cv32e40p/dev
Fix hwloop covg model corner issue related to irq check
2 parents 7ed8d56 + ba607bd commit 2727aa9

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

cv32e40p/env/uvme/cov/uvme_rv32x_hwloop_covg.sv

+23-12
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ class uvme_rv32x_hwloop_covg # (
120120
bit enter_hwloop_sub = 0;
121121
int enter_hwloop_sub_cnt = 0;
122122
bit pending_irq = 0;
123+
bit pending_irq_ack = 0;
124+
logic [31:0] valid_irq_prev = 32'h0;
123125
logic [31:0] prev_irq_onehot_priority = 0, prev_irq_onehot_priority_always = 0;
124126
bit prev_irq_onehot_priority_is_0 = 0;
125127

@@ -508,8 +510,7 @@ class uvme_rv32x_hwloop_covg # (
508510
check_ebreakm_entry(i); \
509511
end \
510512
if (is_pc_equal_lpend(hwloop_stat_``TYPE``.hwloop_csr, i, 0, cv32e40p_rvvi_vif.pc_rdata) && hwloop_stat_``TYPE``.track_lp_cnt[i] != 0) begin \
511-
// if (pending_irq) lpend_has_pending_irq_``TYPE``[i] = 1; \
512-
if (pending_irq && cv32e40p_rvvi_vif.trap) lpend_has_pending_irq_``TYPE``[i] = 1; \
513+
if (pending_irq_ack && cv32e40p_rvvi_vif.trap) lpend_has_pending_irq_``TYPE``[i] = 1; \
513514
hwloop_stat_``TYPE``.track_lp_cnt[i]--; \
514515
done_insn_list_capture_``TYPE``[i] = 1; \
515516
assert(hwloop_stat_``TYPE``.track_lp_cnt[i] >= 0); \
@@ -544,8 +545,7 @@ class uvme_rv32x_hwloop_covg # (
544545
check_ebreakm_entry(i); \
545546
end \
546547
if (is_pc_equal_lpend(hwloop_stat_``TYPE``.hwloop_csr, i, 0, cv32e40p_rvvi_vif.pc_rdata) && hwloop_stat_``TYPE``.track_lp_cnt[i] != 0) begin \
547-
// if (pending_irq) lpend_has_pending_irq_``TYPE``[i] = 1; \
548-
if (pending_irq && cv32e40p_rvvi_vif.trap) lpend_has_pending_irq_``TYPE``[i] = 1; \
548+
if (pending_irq_ack && cv32e40p_rvvi_vif.trap) lpend_has_pending_irq_``TYPE``[i] = 1; \
549549
hwloop_stat_``TYPE``.track_lp_cnt[i]--; \
550550
done_insn_list_capture_``TYPE``[i] = 1; \
551551
assert(hwloop_stat_``TYPE``.track_lp_cnt[i] >= 0); \
@@ -824,9 +824,7 @@ class uvme_rv32x_hwloop_covg # (
824824
wait (!cv32e40p_rvvi_vif.trap); // bypass and do nothing
825825
has_trap_due2_dbg_match_trig = 1;
826826
end
827-
else if (
828-
((cv32e40p_rvvi_vif.irq_onehot_priority == 0 && prev_irq_onehot_priority == 0) || prev_irq_onehot_priority_is_0 || cv32e40p_rvvi_vif.csr_dcsr_step) &&
829-
!pending_irq && !is_dbg_mode && !is_irq) begin // set excep flag only if no pending irq, not in irq and not in dbg mode
827+
else if ((cv32e40p_rvvi_vif.csr_dcsr_step || !pending_irq_ack) && !is_dbg_mode && !is_irq) begin // set excep flag only if no pending irq is serving, not in irq and not in dbg mode
830828
is_trap = 1;
831829
case (cv32e40p_rvvi_vif.insn)
832830
TB_INSTR_EBREAK, INSTR_CBREAK : if (cv32e40p_rvvi_vif.csr_dcsr_ebreakm) begin
@@ -845,11 +843,24 @@ class uvme_rv32x_hwloop_covg # (
845843
end // bypass if pending irq exist
846844
end // EXCEPTION_HANDLING
847845

848-
forever begin
846+
forever begin : UPDATE_PREV_IRQ_ONEHOT_PRIORITY_IS_0
849847
@(posedge cv32e40p_rvvi_vif.clk);
850848
if (prev_irq_onehot_priority == 0) prev_irq_onehot_priority_is_0 = 1;
851849
else prev_irq_onehot_priority_is_0 = 0;
852850
end
851+
forever begin : SET_PENDING_IRQ_ACK
852+
@(cv32e40p_rvvi_vif.valid_irq);
853+
if (cv32e40p_rvvi_vif.valid_irq < valid_irq_prev) begin
854+
pending_irq_ack = 1;
855+
end
856+
valid_irq_prev = cv32e40p_rvvi_vif.valid_irq;
857+
end
858+
forever begin : RESET_PENDING_IRQ_ACK
859+
@(posedge cv32e40p_rvvi_vif.clk);
860+
if (cv32e40p_rvvi_vif.valid) begin
861+
if (pc_is_mtvec_addr() && is_mcause_irq()) pending_irq_ack = 0;
862+
end
863+
end
853864
forever begin : SET_PENDING_IRQ_FLAG
854865
@(negedge cv32e40p_rvvi_vif.clk);
855866
if (cv32e40p_rvvi_vif.irq_onehot_priority !== prev_irq_onehot_priority) begin
@@ -959,8 +970,8 @@ class uvme_rv32x_hwloop_covg # (
959970
else if (pc_is_mtvec_addr() && is_mcause_irq()) begin : IRQ_ENTRY
960971
if (hwloop_stat_main.execute_instr_in_hwloop[0] | hwloop_stat_main.execute_instr_in_hwloop[1]) begin
961972
if (is_trap && enter_hwloop_sub_cnt == 1) begin : TRAP_DUETO_IRQ_ENTRY // exception trap and irq are b2b cycles
962-
if (hwloop_stat_main.execute_instr_in_hwloop[0] && lpend_has_pending_irq_main[0]) begin hwloop_stat_main.track_lp_cnt[0]++; lpend_has_pending_irq_main[0] = 0; end
963-
if (hwloop_stat_main.execute_instr_in_hwloop[1] && lpend_has_pending_irq_main[1]) begin hwloop_stat_main.track_lp_cnt[1]++; lpend_has_pending_irq_main[1] = 0; end
973+
if (hwloop_stat_main.execute_instr_in_hwloop[0] && lpend_has_pending_irq_main[0]) begin hwloop_stat_main.track_lp_cnt[0]++; lpend_has_pending_irq_main[0] = 0; end // revert lp_cnt
974+
if (hwloop_stat_main.execute_instr_in_hwloop[1] && lpend_has_pending_irq_main[1]) begin hwloop_stat_main.track_lp_cnt[1]++; lpend_has_pending_irq_main[1] = 0; end // revert lp_cnt
964975
has_pending_trap_due2_irq = 1; is_trap = 0;
965976
enter_hwloop_sub = 0; enter_hwloop_sub_cnt = 0;
966977
pending_irq = 0;
@@ -992,8 +1003,8 @@ class uvme_rv32x_hwloop_covg # (
9921003
`IF_CURRENT_IS_MAIN_HWLOOP(1, IS_IRQ)
9931004
update_prev_irq_onehot_priority();
9941005
`uvm_info(_header, $sformatf("DEBUG - IRQ Entry"), UVM_DEBUG);
995-
if (lpend_has_pending_irq_main[0]) begin hwloop_stat_main.track_lp_cnt[0]++; lpend_has_pending_irq_main[0] = 0; end
996-
if (lpend_has_pending_irq_main[1]) begin hwloop_stat_main.track_lp_cnt[1]++; lpend_has_pending_irq_main[1] = 0; end
1006+
if (lpend_has_pending_irq_main[0]) begin hwloop_stat_main.track_lp_cnt[0]++; lpend_has_pending_irq_main[0] = 0; end // revert lp_cnt
1007+
if (lpend_has_pending_irq_main[1]) begin hwloop_stat_main.track_lp_cnt[1]++; lpend_has_pending_irq_main[1] = 0; end // revert lp_cnt
9971008
is_irq = 1; wait (!is_irq); continue;
9981009
end
9991010
end // IRQ_ENTRY

0 commit comments

Comments
 (0)