///* Example 1.1 */
program automatic test;
class pkt;
rand bit [3:0] array[12];
rand bit [3:0] value;
int count;
function new(int cnt);
count = cnt;
this.randomize();
endfunction: new
constraint c {
value inside {array[3:count]};
}
endclass: pkt
initial begin
pkt p;
repeat(10)
begin
p = new(6);
$display("==================");
$display("array = %0p and value = %0d", p.array, p.value);
$display("==================");
end
end
endprogram
我希望value
在array
内有一个值,索引范围为3
至count
。
但是出现错误,
this.array [3:this.count]“表达式'this.array [3:this.count]'包含解压缩的数组切片内部运算符右侧尚不支持该功能。请从约束表达式中删除数组切片,或替换它与整个数组。
有什么办法可以达到这个目的?没有多余的变量会更好。
使用数组归约迭代约束。
module test;
class pkt;
rand bit [3:0] array[12];
rand bit [3:0] value;
int count;
function new(int cnt);
count = cnt;
this.randomize();
endfunction: new
constraint c {
array.or() with (item.index inside {[3:count]} && item == value);
}
endclass: pkt
initial begin
pkt p;
repeat(10)
begin
p = new(6);
$display("==================");
$display("array = %0p and value = %0h", p.array, p.value);
$display("==================");
end
end
endmodule
系统verilog中的所有切片运算符都需要constant切片宽度。在您的示例中,您尝试使用非恒定lsb表达式count
。这是行不通的。它应为[3:1]
之类的常量,或者您需要使用+:
/ -:
语法,例如array[count +: 3]
的含义是,从索引count
开始切片,并从数组中提取3个元素。 宽度必须恒定。
我认为,在您的情况下,您可以使用参数化的类并将count
作为类参数传递。类似于以下内容:
class pkt#(int count = 1);
logic [3:0]a[3:0];
function print;
$display ("++> %d", $bits(a[3:count]));
endfunction
endclass
initial begin
pkt #(2) p = new;
p.print;
end
我想不出如何用一个简单的约束就能做到这一点。这是一个解决方案:
您确实需要一个额外的变量(不是很好):
rand int index;
而且,您需要修改约束:
constraint c {
index inside {[3:count]}; value == array[index];
}
使得index
的随机值在3和count
之间选择,然后选择该值作为array
的对应元素。
https://www.edaplayground.com/x/3ata
program automatic test;
class pkt;
rand bit [3:0] array[12];
rand int index;
rand bit [3:0] value;
int count;
function new(int cnt);
count = cnt;
this.randomize();
endfunction: new
constraint c {
index inside {[3:count]}; value == array[index];
}
endclass: pkt
initial begin
pkt p;
repeat(10)
begin
p = new(6);
$display("==================");
$display("array = %0p and value = %0h", p.array, p.value);
$display("==================");
end
end
endprogram