Fix toggle coverage of unpacked unions with reals.

This commit is contained in:
Wilson Snyder 2024-02-07 21:03:32 -05:00
parent c20634e4f8
commit e2e0795538
4 changed files with 37 additions and 6 deletions

View File

@ -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: "

View File

@ -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;

View File

@ -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;

View File

@ -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;