mirror of
https://github.com/verilator/verilator.git
synced 2026-09-05 16:45:23 +02:00
Fix toggle coverage of unpacked unions with reals.
This commit is contained in:
+18
-6
@@ -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: "
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user