mirror of
https://github.com/verilator/verilator.git
synced 2024-12-29 10:47:34 +00:00
Fix randomizing current object with rand
class instance member (#5292)
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
This commit is contained in:
parent
8f4490628f
commit
f5caa4b7dc
@ -119,20 +119,20 @@ class RandomizeMarkVisitor final : public VNVisitorConst {
|
|||||||
m_baseToDerivedMap[basep].insert(nodep);
|
m_baseToDerivedMap[basep].insert(nodep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void visit(AstMethodCall* nodep) override {
|
|
||||||
if (nodep->name() != "randomize") return;
|
|
||||||
if (const AstClassRefDType* const classRefp
|
|
||||||
= VN_CAST(nodep->fromp()->dtypep()->skipRefp(), ClassRefDType)) {
|
|
||||||
AstClass* const classp = classRefp->classp();
|
|
||||||
classp->user1(true);
|
|
||||||
markMembers(classp);
|
|
||||||
}
|
|
||||||
iterateChildrenConst(nodep);
|
|
||||||
}
|
|
||||||
void visit(AstNodeFTaskRef* nodep) override {
|
void visit(AstNodeFTaskRef* nodep) override {
|
||||||
iterateChildrenConst(nodep);
|
iterateChildrenConst(nodep);
|
||||||
if (nodep->name() != "randomize") return;
|
if (nodep->name() != "randomize") return;
|
||||||
if (m_classp) m_classp->user1(true);
|
AstClass* classp = m_classp;
|
||||||
|
if (const AstMethodCall* const methodCallp = VN_CAST(nodep, MethodCall)) {
|
||||||
|
if (const AstClassRefDType* const classRefp
|
||||||
|
= VN_CAST(methodCallp->fromp()->dtypep()->skipRefp(), ClassRefDType)) {
|
||||||
|
classp = classRefp->classp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (classp) {
|
||||||
|
classp->user1(true);
|
||||||
|
markMembers(classp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void visit(AstConstraintExpr* nodep) override {
|
void visit(AstConstraintExpr* nodep) override {
|
||||||
VL_RESTORER(m_constraintExprp);
|
VL_RESTORER(m_constraintExprp);
|
||||||
|
@ -4,14 +4,32 @@
|
|||||||
// any use, without warranty, 2023 by Wilson Snyder.
|
// any use, without warranty, 2023 by Wilson Snyder.
|
||||||
// SPDX-License-Identifier: CC0-1.0
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
|
class Member;
|
||||||
|
rand int m_val;
|
||||||
|
endclass
|
||||||
|
|
||||||
class Cls;
|
class Cls;
|
||||||
rand int m_val;
|
rand int m_val;
|
||||||
|
rand Member m_member;
|
||||||
|
|
||||||
function void test;
|
function void test;
|
||||||
automatic int rand_result;
|
automatic int rand_result;
|
||||||
|
logic ok1 = 0, ok2 = 0;
|
||||||
|
|
||||||
rand_result = randomize();
|
m_val = 256;
|
||||||
if (rand_result != 1) $stop;
|
m_member.m_val = 65535;
|
||||||
|
for (int i = 0; i < 20; i++) begin
|
||||||
|
rand_result = randomize();
|
||||||
|
if (rand_result != 1) $stop;
|
||||||
|
if (m_val != 256) ok1 = 1;
|
||||||
|
if (m_member.m_val != 65535) ok2 = 1;
|
||||||
|
end
|
||||||
|
if (!ok1) $stop;
|
||||||
|
if (!ok2) $stop;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function new;
|
||||||
|
m_member = new;
|
||||||
endfunction
|
endfunction
|
||||||
endclass
|
endclass
|
||||||
|
|
Loading…
Reference in New Issue
Block a user