Fix toggle coverage of unpacked unions with reals.
This commit is contained in:
parent
c20634e4f8
commit
e2e0795538
|
|
@ -365,7 +365,7 @@ class CoverageVisitor final : public VNVisitor {
|
||||||
AstNodeExpr* const varRefp = new AstStructSel{
|
AstNodeExpr* const varRefp = new AstStructSel{
|
||||||
varp->fileline(), above.m_varRefp->cloneTree(true), itemp->name()};
|
varp->fileline(), above.m_varRefp->cloneTree(true), itemp->name()};
|
||||||
AstNodeExpr* const chgRefp = new AstStructSel{
|
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);
|
varRefp->dtypep(subtypep);
|
||||||
chgRefp->dtypep(subtypep);
|
chgRefp->dtypep(subtypep);
|
||||||
ToggleEnt newent{above.m_comment + "."s + itemp->name(), varRefp, chgRefp};
|
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
|
// Arbitrarily handle only the first member of the union
|
||||||
if (const AstMemberDType* const itemp = adtypep->membersp()) {
|
if (const AstMemberDType* const itemp = adtypep->membersp()) {
|
||||||
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp();
|
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp();
|
||||||
|
if (adtypep->packed()) {
|
||||||
ToggleEnt newent{above.m_comment + "."s + itemp->name(),
|
ToggleEnt newent{above.m_comment + "."s + itemp->name(),
|
||||||
above.m_varRefp->cloneTree(true),
|
above.m_varRefp->cloneTree(true),
|
||||||
above.m_chgRefp->cloneTree(true)};
|
above.m_chgRefp->cloneTree(true)};
|
||||||
toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp);
|
toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp);
|
||||||
newent.cleanup();
|
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 {
|
} else {
|
||||||
dtypep->v3fatalSrc("Unexpected node data type in toggle coverage generation: "
|
dtypep->v3fatalSrc("Unexpected node data type in toggle coverage generation: "
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,11 @@
|
||||||
|
|
||||||
%000002 str_t stoggle; initial stoggle='0;
|
%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;
|
const reg aconst = '0;
|
||||||
|
|
||||||
%000000 reg [1:0][1:0] ptoggle; initial ptoggle=0;
|
%000000 reg [1:0][1:0] ptoggle; initial ptoggle=0;
|
||||||
|
|
@ -72,6 +77,7 @@
|
||||||
toggle <= '0;
|
toggle <= '0;
|
||||||
stoggle.u <= toggle;
|
stoggle.u <= toggle;
|
||||||
stoggle.b <= toggle;
|
stoggle.b <= toggle;
|
||||||
|
utoggle.val1 <= real'(cyc[7:0]);
|
||||||
ptoggle[0][0] <= toggle;
|
ptoggle[0][0] <= toggle;
|
||||||
if (cyc==3) begin
|
if (cyc==3) begin
|
||||||
toggle <= '1;
|
toggle <= '1;
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,11 @@ module t (/*AUTOARG*/
|
||||||
|
|
||||||
str_t stoggle; initial stoggle='0;
|
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;
|
const reg aconst = '0;
|
||||||
|
|
||||||
reg [1:0][1:0] ptoggle; initial ptoggle=0;
|
reg [1:0][1:0] ptoggle; initial ptoggle=0;
|
||||||
|
|
@ -71,6 +76,7 @@ module t (/*AUTOARG*/
|
||||||
toggle <= '0;
|
toggle <= '0;
|
||||||
stoggle.u <= toggle;
|
stoggle.u <= toggle;
|
||||||
stoggle.b <= toggle;
|
stoggle.b <= toggle;
|
||||||
|
utoggle.val1 <= real'(cyc[7:0]);
|
||||||
ptoggle[0][0] <= toggle;
|
ptoggle[0][0] <= toggle;
|
||||||
if (cyc==3) begin
|
if (cyc==3) begin
|
||||||
toggle <= '1;
|
toggle <= '1;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,12 @@
|
||||||
-000002 point: comment=stoggle.b
|
-000002 point: comment=stoggle.b
|
||||||
-000002 point: comment=stoggle.u.ua
|
-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;
|
const reg aconst = '0;
|
||||||
|
|
||||||
%000000 reg [1:0][1:0] ptoggle; initial ptoggle=0;
|
%000000 reg [1:0][1:0] ptoggle; initial ptoggle=0;
|
||||||
|
|
@ -115,6 +121,7 @@
|
||||||
toggle <= '0;
|
toggle <= '0;
|
||||||
stoggle.u <= toggle;
|
stoggle.u <= toggle;
|
||||||
stoggle.b <= toggle;
|
stoggle.b <= toggle;
|
||||||
|
utoggle.val1 <= real'(cyc[7:0]);
|
||||||
ptoggle[0][0] <= toggle;
|
ptoggle[0][0] <= toggle;
|
||||||
if (cyc==3) begin
|
if (cyc==3) begin
|
||||||
toggle <= '1;
|
toggle <= '1;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue