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);
|
||||
}
|
||||
}
|
||||
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 {
|
||||
iterateChildrenConst(nodep);
|
||||
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 {
|
||||
VL_RESTORER(m_constraintExprp);
|
||||
|
@ -4,14 +4,32 @@
|
||||
// any use, without warranty, 2023 by Wilson Snyder.
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
class Member;
|
||||
rand int m_val;
|
||||
endclass
|
||||
|
||||
class Cls;
|
||||
rand int m_val;
|
||||
rand Member m_member;
|
||||
|
||||
function void test;
|
||||
automatic int rand_result;
|
||||
logic ok1 = 0, ok2 = 0;
|
||||
|
||||
rand_result = randomize();
|
||||
if (rand_result != 1) $stop;
|
||||
m_val = 256;
|
||||
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
|
||||
endclass
|
||||
|
Loading…
Reference in New Issue
Block a user