限制随机 10 位,这样不会有 7 个连续的 0 或 1
Constrain random 10-bit such that there won't be 7 consecutive 0s or 1s
假设有一个 rand 10 位变量名为 data
。我想确保不会有 7 个连续的 0 或 1。有人可以建议我如何以这种方式进行约束吗?
constraint c_data
{
foreach(data[i])
{
(data[i] && data[i+7]) == 0;
}
}
但是当i
大于3时,数组将越界。
这是避免像 10'b0000000111
或 10'b1111111000
这样的值的一种方法:
class foo;
rand bit [9:0] data;
constraint c_data {
!(data[9:3] inside {'0, '1});
!(data[8:2] inside {'0, '1});
!(data[7:1] inside {'0, '1});
!(data[6:0] inside {'0, '1});
}
endclass
module tb;
foo foo;
initial begin
foo = new();
repeat (10_000) begin
if (!foo.randomize()) $error;
$displayb(foo.data);
end
end
endmodule
您可以添加一个蕴涵来保持索引有界
parameter width = 7;
constraint c_data
{
foreach(data[i])
{
(i < data.size() - width) -> !(data[i+:width] inside {'0,'1});
}
}
假设有一个 rand 10 位变量名为 data
。我想确保不会有 7 个连续的 0 或 1。有人可以建议我如何以这种方式进行约束吗?
constraint c_data
{
foreach(data[i])
{
(data[i] && data[i+7]) == 0;
}
}
但是当i
大于3时,数组将越界。
这是避免像 10'b0000000111
或 10'b1111111000
这样的值的一种方法:
class foo;
rand bit [9:0] data;
constraint c_data {
!(data[9:3] inside {'0, '1});
!(data[8:2] inside {'0, '1});
!(data[7:1] inside {'0, '1});
!(data[6:0] inside {'0, '1});
}
endclass
module tb;
foo foo;
initial begin
foo = new();
repeat (10_000) begin
if (!foo.randomize()) $error;
$displayb(foo.data);
end
end
endmodule
您可以添加一个蕴涵来保持索引有界
parameter width = 7;
constraint c_data
{
foreach(data[i])
{
(i < data.size() - width) -> !(data[i+:width] inside {'0,'1});
}
}