Fix randomizing current object with rand class instance member (#5292)

Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
This commit is contained in:
Krzysztof Bieganski 2024-07-22 14:41:12 +02:00 committed by GitHub
parent 8f4490628f
commit f5caa4b7dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 31 additions and 13 deletions

View File

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

View File

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