diff --git a/src/V3Coverage.cpp b/src/V3Coverage.cpp index 34b2c8595..94266f79f 100644 --- a/src/V3Coverage.cpp +++ b/src/V3Coverage.cpp @@ -365,7 +365,7 @@ class CoverageVisitor final : public VNVisitor { AstNodeExpr* const varRefp = new AstStructSel{ varp->fileline(), above.m_varRefp->cloneTree(true), itemp->name()}; AstNodeExpr* const chgRefp = new AstStructSel{ - varp->fileline(), above.m_varRefp->cloneTree(true), itemp->name()}; + varp->fileline(), above.m_chgRefp->cloneTree(true), itemp->name()}; varRefp->dtypep(subtypep); chgRefp->dtypep(subtypep); ToggleEnt newent{above.m_comment + "."s + itemp->name(), varRefp, chgRefp}; @@ -377,11 +377,23 @@ class CoverageVisitor final : public VNVisitor { // Arbitrarily handle only the first member of the union if (const AstMemberDType* const itemp = adtypep->membersp()) { AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp(); - ToggleEnt newent{above.m_comment + "."s + itemp->name(), - above.m_varRefp->cloneTree(true), - above.m_chgRefp->cloneTree(true)}; - toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp); - newent.cleanup(); + if (adtypep->packed()) { + ToggleEnt newent{above.m_comment + "."s + itemp->name(), + above.m_varRefp->cloneTree(true), + above.m_chgRefp->cloneTree(true)}; + toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp); + newent.cleanup(); + } else { + AstNodeExpr* const varRefp = new AstStructSel{ + varp->fileline(), above.m_varRefp->cloneTree(true), itemp->name()}; + AstNodeExpr* const chgRefp = new AstStructSel{ + varp->fileline(), above.m_chgRefp->cloneTree(true), itemp->name()}; + varRefp->dtypep(subtypep); + chgRefp->dtypep(subtypep); + ToggleEnt newent{above.m_comment + "."s + itemp->name(), varRefp, chgRefp}; + toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp); + newent.cleanup(); + } } } else { dtypep->v3fatalSrc("Unexpected node data type in toggle coverage generation: " diff --git a/test_regress/t/t_cover_toggle.out b/test_regress/t/t_cover_toggle.out index 33fac7398..f7eacf7f4 100644 --- a/test_regress/t/t_cover_toggle.out +++ b/test_regress/t/t_cover_toggle.out @@ -27,6 +27,11 @@ %000002 str_t stoggle; initial stoggle='0; + union { + real val1; // TODO use bit [7:0] here + real val2; // TODO use bit [3:0] here +%000001 } utoggle; + const reg aconst = '0; %000000 reg [1:0][1:0] ptoggle; initial ptoggle=0; @@ -72,6 +77,7 @@ toggle <= '0; stoggle.u <= toggle; stoggle.b <= toggle; + utoggle.val1 <= real'(cyc[7:0]); ptoggle[0][0] <= toggle; if (cyc==3) begin toggle <= '1; diff --git a/test_regress/t/t_cover_toggle.v b/test_regress/t/t_cover_toggle.v index d5bd2c9a9..d5dd91bba 100644 --- a/test_regress/t/t_cover_toggle.v +++ b/test_regress/t/t_cover_toggle.v @@ -26,6 +26,11 @@ module t (/*AUTOARG*/ str_t stoggle; initial stoggle='0; + union { + real val1; // TODO use bit [7:0] here + real val2; // TODO use bit [3:0] here + } utoggle; + const reg aconst = '0; reg [1:0][1:0] ptoggle; initial ptoggle=0; @@ -71,6 +76,7 @@ module t (/*AUTOARG*/ toggle <= '0; stoggle.u <= toggle; stoggle.b <= toggle; + utoggle.val1 <= real'(cyc[7:0]); ptoggle[0][0] <= toggle; if (cyc==3) begin toggle <= '1; diff --git a/test_regress/t/t_cover_toggle_points.out b/test_regress/t/t_cover_toggle_points.out index 7a7ed1e14..217fafa23 100644 --- a/test_regress/t/t_cover_toggle_points.out +++ b/test_regress/t/t_cover_toggle_points.out @@ -33,6 +33,12 @@ -000002 point: comment=stoggle.b -000002 point: comment=stoggle.u.ua + union { + real val1; // TODO use bit [7:0] here + real val2; // TODO use bit [3:0] here +%000001 } utoggle; +-000001 point: comment=utoggle.val1 + const reg aconst = '0; %000000 reg [1:0][1:0] ptoggle; initial ptoggle=0; @@ -115,6 +121,7 @@ toggle <= '0; stoggle.u <= toggle; stoggle.b <= toggle; + utoggle.val1 <= real'(cyc[7:0]); ptoggle[0][0] <= toggle; if (cyc==3) begin toggle <= '1;