Fix `rand_mode` method with cast (#5831).

This commit is contained in:
Wilson Snyder 2025-03-05 21:43:50 -05:00
parent 258becd179
commit 8e87a99628
3 changed files with 15 additions and 6 deletions

View File

@ -24,6 +24,7 @@ Verilator 5.035 devel
* Fix tcmalloc static link and non-22.04 builds (#5817) (#5818). [Geza Lore]
* Fix UNOPTFLAT warnings with `--coverage-trace` and always_comb (#5821).
* Fix function locals in SenExprBuilder (#5822). [Geza Lore]
* Fix `rand_mode` method with cast (#5831).
Verilator 5.034 2025-02-24

View File

@ -1996,6 +1996,7 @@ class WidthVisitor final : public VNVisitor {
if (debug() >= 9) nodep->dumpTree("- CastPre: ");
// if (debug()) nodep->backp()->dumpTree("- CastPreUpUp: ");
userIterateAndNext(nodep->fromp(), WidthVP{SELF, PRELIM}.p());
if (debug() >= 9) nodep->dumpTree("- CastDit: ");
AstNodeDType* const toDtp = nodep->dtypep()->skipRefToEnump();
AstNodeDType* const fromDtp = nodep->fromp()->dtypep()->skipRefToEnump();
const auto castable = AstNode::computeCastable(toDtp, fromDtp, nodep->fromp());
@ -4009,9 +4010,9 @@ class WidthVisitor final : public VNVisitor {
methodOkArguments(nodep, 0, 1);
// IEEE 1800-2023 18.8
if (nodep->pinsp()) {
nodep->dtypep(nodep->findBasicDType(VBasicDTypeKwd::INT));
} else {
nodep->dtypeSetVoid();
} else {
nodep->dtypep(nodep->findBasicDType(VBasicDTypeKwd::INT));
}
v3Global.useRandomizeMethods(true);
}

View File

@ -25,16 +25,23 @@ class Qux extends Bar;
constraint y_gt_x {y > x;};
constraint y_lt_10 {y < 10;};
function bit get_rand_mode();
return bit'(y.rand_mode());
endfunction
function void test;
logic ok = 0;
x.rand_mode(1);
if (x.rand_mode == 0) $stop;
if (x.rand_mode != 1) $stop; // Note no rand_mode parens
if (get_rand_mode() != 1) $stop;
y.rand_mode(0);
if (y.rand_mode == 1) $stop;
if (y.rand_mode() != 0) $stop; // Note has rand_mode parens
foo.a.rand_mode(0);
if (foo.a.rand_mode == 1) $stop;
if (foo.a.rand_mode != 0) $stop; // Note no rand_mode parens
foo.b.rand_mode(1);
if (foo.b.rand_mode == 0) $stop;
if (foo.b.rand_mode() != 1) $stop; // Note has rand_mode parens
for (int i = 0; i < 20; ++i) begin
x = 4;
y = 8;