如何在 class 中仅随机化 1 个变量?
How to randomize only 1 variable in a class?
我有以下class
class ABC;
rand bit[2 : 0] mode;
randc bit[2 : 0] mode_cylic;
constraint range{
mode >= 2;
mode < 6;
};
constraint range_cylic{
mode_cylic >= 2;
mode_cylic < 6;
};
endclass
我有一个测试对象 class ABC
,我只想随机化该对象中的 mode
变量。我该怎么做?
一种方法是对您不想随机化的变量禁用随机化:
class ABC;
rand bit[2 : 0] mode;
randc bit[2 : 0] mode_cylic;
constraint range{
mode >= 2;
mode < 6;
}
constraint range_cylic{
mode_cylic >= 2;
mode_cylic < 6;
}
endclass
module tb;
ABC abc = new();
bit result;
initial begin
abc.range_cylic.constraint_mode(0);
abc.mode_cylic.rand_mode(0);
repeat (10) begin
result = abc.randomize();
$display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
end
end
endmodule
请参阅 IEEE 标准 1800-2017,第 18.8 节 使用 rand_mode() 禁用随机变量。
这是我得到的输出:
mode=2 mode_cylic=0
mode=2 mode_cylic=0
mode=2 mode_cylic=0
mode=4 mode_cylic=0
mode=4 mode_cylic=0
mode=2 mode_cylic=0
mode=4 mode_cylic=0
mode=3 mode_cylic=0
mode=5 mode_cylic=0
mode=4 mode_cylic=0
或者,如果您希望 mode_cylic
具有 range_cylic
范围内的特定值,请使用 with
:
initial begin
repeat (10) begin
result = abc.randomize() with { mode_cylic == 5; };
$display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
end
end
这是我得到的输出:
mode=2 mode_cylic=5
mode=2 mode_cylic=5
mode=2 mode_cylic=5
mode=4 mode_cylic=5
mode=4 mode_cylic=5
mode=2 mode_cylic=5
mode=4 mode_cylic=5
mode=3 mode_cylic=5
mode=5 mode_cylic=5
mode=4 mode_cylic=5
随机化 class 并且只随机化某些变量时必须小心,因为约束与变量分开停用。 class 随机化的所有活动约束都必须成功。
当您只有一大组随机变量中的一个或几个变量要随机化时,最简单的方法是使用内置的 std::randomize
方法。这会随机化其参数中的变量,而不管它们是否是 class 变量,并且不使用任何 class 约束。
std::randomize(obj.mode);
您要使用的任何约束都必须使用 with {expressions}
约束添加。
您可以做的另一件事是使用 class 随机化方法,也只放置您想要随机化的变量。
obj.randomize(mode);
然而,所有 class 约束仍必须成功,因此 mode_cylic
必须已经具有值 2-5,或者您需要使用
关闭约束
obj.range_cylic.constraint_mode(0);
您可以使用 rand_mode()
做类似的事情来关闭您不想随机化的随机变量。
我会使用 rand/constraint_mode()
来关闭一个变量或约束,而不是尝试关闭除一个之外的所有内容。当您开始向测试平台添加更多 variables/constraints 时,维护变得非常困难。
尝试使用 std:randomize
或更好,将您的 class 分成要单独随机化的对象。
我有以下class
class ABC;
rand bit[2 : 0] mode;
randc bit[2 : 0] mode_cylic;
constraint range{
mode >= 2;
mode < 6;
};
constraint range_cylic{
mode_cylic >= 2;
mode_cylic < 6;
};
endclass
我有一个测试对象 class ABC
,我只想随机化该对象中的 mode
变量。我该怎么做?
一种方法是对您不想随机化的变量禁用随机化:
class ABC;
rand bit[2 : 0] mode;
randc bit[2 : 0] mode_cylic;
constraint range{
mode >= 2;
mode < 6;
}
constraint range_cylic{
mode_cylic >= 2;
mode_cylic < 6;
}
endclass
module tb;
ABC abc = new();
bit result;
initial begin
abc.range_cylic.constraint_mode(0);
abc.mode_cylic.rand_mode(0);
repeat (10) begin
result = abc.randomize();
$display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
end
end
endmodule
请参阅 IEEE 标准 1800-2017,第 18.8 节 使用 rand_mode() 禁用随机变量。
这是我得到的输出:
mode=2 mode_cylic=0
mode=2 mode_cylic=0
mode=2 mode_cylic=0
mode=4 mode_cylic=0
mode=4 mode_cylic=0
mode=2 mode_cylic=0
mode=4 mode_cylic=0
mode=3 mode_cylic=0
mode=5 mode_cylic=0
mode=4 mode_cylic=0
或者,如果您希望 mode_cylic
具有 range_cylic
范围内的特定值,请使用 with
:
initial begin
repeat (10) begin
result = abc.randomize() with { mode_cylic == 5; };
$display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
end
end
这是我得到的输出:
mode=2 mode_cylic=5
mode=2 mode_cylic=5
mode=2 mode_cylic=5
mode=4 mode_cylic=5
mode=4 mode_cylic=5
mode=2 mode_cylic=5
mode=4 mode_cylic=5
mode=3 mode_cylic=5
mode=5 mode_cylic=5
mode=4 mode_cylic=5
随机化 class 并且只随机化某些变量时必须小心,因为约束与变量分开停用。 class 随机化的所有活动约束都必须成功。
当您只有一大组随机变量中的一个或几个变量要随机化时,最简单的方法是使用内置的 std::randomize
方法。这会随机化其参数中的变量,而不管它们是否是 class 变量,并且不使用任何 class 约束。
std::randomize(obj.mode);
您要使用的任何约束都必须使用 with {expressions}
约束添加。
您可以做的另一件事是使用 class 随机化方法,也只放置您想要随机化的变量。
obj.randomize(mode);
然而,所有 class 约束仍必须成功,因此 mode_cylic
必须已经具有值 2-5,或者您需要使用
obj.range_cylic.constraint_mode(0);
您可以使用 rand_mode()
做类似的事情来关闭您不想随机化的随机变量。
我会使用 rand/constraint_mode()
来关闭一个变量或约束,而不是尝试关闭除一个之外的所有内容。当您开始向测试平台添加更多 variables/constraints 时,维护变得非常困难。
尝试使用 std:randomize
或更好,将您的 class 分成要单独随机化的对象。