Add more robust check

Signed-off-by: Pawel Kojma <pkojma@internships.antmicro.com>
This commit is contained in:
Pawel Kojma 2026-02-10 16:11:13 +01:00
parent 3dd2b762e7
commit ae135d8fdd
2 changed files with 15 additions and 8 deletions

View File

@ -33,13 +33,12 @@
#include "verilatedos.h"
#include "V3Randomize.h"
#include "V3Ast.h"
#include "V3Error.h"
#include "V3FileLine.h"
#include "V3Global.h"
#include "V3MemberMap.h"
#include "V3Randomize.h"
#include "V3UniqueNames.h"
#include <queue>
@ -278,7 +277,8 @@ class RandomizeMarkVisitor final : public VNVisitor {
// Process a single constraint during nested constraint cloning
void processNestedConstraint(AstConstraint* const constrp, AstVarRef* rootVarRefp,
const std::vector<AstVar*>& newPath, AstClass* targetClassp) {
const std::vector<AstVar*>& newPath, AstClass* targetClassp,
AstClass* const memberClassp) {
std::string pathPrefix = rootVarRefp->name();
for (AstVar* pathMemberVarp : newPath) {
pathPrefix += GLOBAL_CONSTRAINT_SEPARATOR + pathMemberVarp->name();
@ -295,7 +295,6 @@ class RandomizeMarkVisitor final : public VNVisitor {
}
});
if (isDuplicate) return;
AstConstraint* const cloneConstrp = constrp->cloneTree(false);
cloneConstrp->name(newName);
cloneConstrp->foreach([&](AstVarRef* varRefp) {
@ -336,7 +335,8 @@ class RandomizeMarkVisitor final : public VNVisitor {
// member selections
nestedClassp->foreachMember(
[&](AstClass* const containingClassp, AstConstraint* const constrp) {
processNestedConstraint(constrp, rootVarRefp, newPath, targetClassp);
processNestedConstraint(constrp, rootVarRefp, newPath, targetClassp,
containingClassp);
});
cloneNestedConstraintsRecurse(rootVarRefp, nestedClassp, newPath, targetClassp);
}
@ -571,9 +571,11 @@ class RandomizeMarkVisitor final : public VNVisitor {
AstVarRef* rootVarRefp
= new AstVarRef{nodep->fileline(), classp, memberVarp, VAccess::READ};
std::vector<AstVar*> emptyPath;
memberClassp->foreachMember([&](AstClass* const, AstConstraint* const constrp) {
processNestedConstraint(constrp, rootVarRefp, emptyPath, classp);
});
memberClassp->foreachMember(
[&](AstClass* const containingClassp, AstConstraint* const constrp) {
processNestedConstraint(constrp, rootVarRefp, emptyPath, classp,
containingClassp);
});
cloneNestedConstraintsRecurse(rootVarRefp, memberClassp, emptyPath, classp);
// Delete the temporary VarRef created for constraint cloning
VL_DO_DANGLING(rootVarRefp->deleteTree(), rootVarRefp);

View File

@ -8,9 +8,11 @@ parameter int LEN = 32;
class A;
rand int x;
rand int array[5];
constraint a_c {
x <= LEN;
x >= LEN;
foreach (array[i]) {array[i] == array[i-1];}
}
endclass
@ -25,6 +27,9 @@ module t;
b.a = new;
if (b.randomize() == 0) $stop;
if (b.a.x != LEN) $stop;
for (int i = 0; i < 4; i++) begin
if (b.a.array[i] != b.a.array[i+1]) $stop;
end
$write("*-* All finished *-*\n");
$finish;
end