From 8e87a9962827569771cc94b3ecf990de908386b7 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Wed, 5 Mar 2025 21:43:50 -0500 Subject: [PATCH] Fix `rand_mode` method with cast (#5831). --- Changes | 1 + src/V3Width.cpp | 5 +++-- test_regress/t/t_randomize_rand_mode_constr.v | 15 +++++++++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Changes b/Changes index 6f5adfcd7..2c544cf7a 100644 --- a/Changes +++ b/Changes @@ -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 diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 8ee3810a1..e34f07461 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -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); } diff --git a/test_regress/t/t_randomize_rand_mode_constr.v b/test_regress/t/t_randomize_rand_mode_constr.v index c82db0cc3..2e06b2061 100644 --- a/test_regress/t/t_randomize_rand_mode_constr.v +++ b/test_regress/t/t_randomize_rand_mode_constr.v @@ -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;