Fix capturing params in randomize() with (#5416) (#5418)

Signed-off-by: Krzysztof Bieganski <[email protected]>
This commit is contained in:
Krzysztof Bieganski
2024-08-29 23:02:21 +02:00
committed by GitHub
parent aecf38e3ad
commit f133a2811f
2 changed files with 7 additions and 1 deletions
+2
View File
@@ -865,8 +865,10 @@ class CaptureVisitor final : public VNVisitor {
const bool varIsFuncLocal = varRefp->varp()->isFuncLocal();
const bool varHasAutomaticLifetime = varRefp->varp()->lifetime().isAutomatic();
const bool varIsFieldOfCaller = AstClass::isClassExtendedFrom(callerClassp, varClassp);
const bool varIsParam = varRefp->varp()->isParam();
if (refIsXref) return CaptureMode::CAP_VALUE | CaptureMode::CAP_F_XREF;
if (varIsFuncLocal && varHasAutomaticLifetime) return CaptureMode::CAP_VALUE;
if (varIsParam) return CaptureMode::CAP_VALUE;
// Static var in function (will not be inlined, because it's in class)
if (callerIsClass && varIsFuncLocal) return CaptureMode::CAP_VALUE;
if (callerIsClass && varIsFieldOfCaller) return CaptureMode::CAP_THIS;
@@ -10,7 +10,7 @@ endclass
class c2;
rand int c2_f;
endclass
localparam int PARAM = 42;
class Cls;
rand int x;
rand enum {
@@ -80,6 +80,10 @@ class SubC extends SubB;
if (doit != 1) $stop;
if (f.en != SubA::AMBIG) $stop;
doit &= f.randomize() with { x == PARAM; };
if (doit != 1) $stop;
if (f.x != PARAM) $stop;
f.en = SubA::ONE_A;
doit &= f.randomize() with { en == ONE_A; };
doit &= f.randomize() with { local::en == local::AMBIG; };