diff --git a/src/V3AstNodeExpr.h b/src/V3AstNodeExpr.h index 9576c4369..fbf45e8bf 100644 --- a/src/V3AstNodeExpr.h +++ b/src/V3AstNodeExpr.h @@ -690,6 +690,7 @@ public: string emitVerilog() override { V3ERROR_NA_RETURN(""); } string emitC() override { V3ERROR_NA_RETURN(""); } bool cleanOut() const override { return true; } + bool isExprCoverageEligible() const override { return false; } const char* broken() const override { BROKEN_RTN(!VN_IS(backp(), NodeAssign)); // V3Emit* assumption return nullptr; diff --git a/src/V3Covergroup.cpp b/src/V3Covergroup.cpp index 48e9bac41..a78fe9cfc 100644 --- a/src/V3Covergroup.cpp +++ b/src/V3Covergroup.cpp @@ -1345,8 +1345,7 @@ class FunctionalCoverageVisitor final : public VNVisitor { refp->v3warn(COVERIGN, "Ignoring unsupported: cross references unknown coverpoint: " + refp->name()); - // Delete the entire cross since we can't generate it - VL_DO_DANGLING(crossp->unlinkFrBack()->deleteTree(), crossp); + // Don't delete crossp here - the caller's cleanup loop will delete it return; } @@ -1830,7 +1829,19 @@ class FunctionalCoverageVisitor final : public VNVisitor { } // If covergroup has unsupported clocking event, skip processing it - if (hasUnsupportedEvent) return; + // but still clean up coverpoints so they don't reach downstream passes + if (hasUnsupportedEvent) { + iterateChildren(nodep); + for (AstCoverpoint* cpp : m_coverpoints) { + cpp->unlinkFrBack(); + VL_DO_DANGLING(cpp->deleteTree(), cpp); + } + for (AstCoverCross* crossp : m_coverCrosses) { + crossp->unlinkFrBack(); + VL_DO_DANGLING(crossp->deleteTree(), crossp); + } + return; + } // Find the sample() method and constructor m_sampleFuncp = VN_CAST(m_memberMap.findMember(nodep, "sample"), Func);