oop - 有没有一种方法可以根据另一个变量的随机化结果来约束一个类中的随机变量?
问题描述
我需要随机化变量rA
并将变量设置rB
为 1'b1 如果rA
== 1'b1 或随机化如果rA
== 1'b0。这是我正在尝试的:
class randomizedVars;
rand bit rA;
rand bit rB;
constraint cB {
rB == 1'b1;
}
task changeConstraints();
if (this.rA == 1'b1)
begin
this.cB.constraint_mode(1); // turn on the constraint for rB
this.rA.rand_mode(0); // Disable rA from being randomized
this.randomize(); // Rerandomize to force rB to meet its constraint ?
this.rA.rand_mode(1); // Reenable rA to be randomized later
this.cB.constraint_mode(0); // turn off the constraint for rB for later
end
else
this.cB.constraint_mode(0);
endtask
endclass
这种方法似乎有效,但我主要只是想知道是否有“正确”的方法来做到这一点。我觉得这个方法好像是蛮力和难度方法。更糟糕的是,我需要在每次随机化后调用任务,这让我觉得好像有一种我没有看到的方法。
为了清楚起见,我的预期结果是,当rA
被随机化且等于 1 时,rB
将被强制为 1。如果rA
被随机化且等于 0,那么rB
也将被随机化。我的实际结果与此相符。只是想知道是否有一种方法可以做到这一点,而不必在每次.randomize()
方法调用后调用任务。
解决方案
您可以通过使用不同的约束并删除任务来简化代码。
class randomizedVars;
rand bit rA;
rand bit rB;
constraint cB {
solve rA before rB;
(rA == 1) -> (rB == 1);
}
endclass
module tb;
randomizedVars c;
initial begin
c = new();
repeat (8) begin
c.randomize();
$display("a=%b b=%b", c.rA, c.rB);
end
end
endmodule
这是一个打印输出的示例:
a=0 b=0
a=0 b=1
a=1 b=1
a=1 b=1
a=0 b=0
a=1 b=1
a=0 b=0
a=0 b=1
如果rA
被随机选择为1,则rB
强制为1;否则,rB
将是随机的。
推荐阅读
- antlr4 - ANTLR4 目标文件名
- javascript - 带有切换动画的按钮单击
- python - Python pip install“错误:命令错误退出状态1”
- javascript - React Router Redirect - 将参数添加到路径名
- java - 当我发送消息时,我可以在 firebase 中看到它,但我无法在模拟器或手机上阅读它,它什么也没有显示
- mysql - 无法安装 mysql-server 包
- java - VPN 开启时无法访问 REST 端点
- python - 通过 websocket 问题进行币安流交易
- python - 我需要修复此代码未完成到最后
- javascript - .sort() 对具有嵌套日期的对象