我有一个数组
logic [254:0][7:0] array
。根据设计,该数组必须包含 0 到 254 之间的所有值且恰好一次。
我想写一个SystemVerilog断言来测试它。
到目前为止,我想出了这样的东西:
logic update_array_d;
bit [254:0] a_array_dup_mask;
always_ff @(posedge clock, negedge arstn)
if(!arstn) update_array_d <= 1'b0;
else update_array_d <= update_array;
always_comb begin
a_array_dup_mask= '0;
if(update_array_d) begin
a_array_dup_mask= '1;
for(int i=0; i<254; i++)
a_array_dup_mask[array[i]] = 1'b0;
end
end
UNIQUE_ARRAY: assert property (
@(posedge clock) disable iff (!arstn)
update_array_d |-> a_array_dup_mask == '0
);
有没有更优雅的实现方式?
只要代码适合您并且您发现它很容易理解,它看起来就很好。
您将
array
声明为压缩数组。您是否将其声明为 unpacked 数组,例如:
logic [7:0] array [255];
那么你就可以使用
unique
数组方法了。请参阅 IEEE Std 1800-2017,第 7.12.1 节数组定位器方法。但您还需要声明一个中间队列变量。这是否更优雅是有争议的。大致如下:
logic [7:0] array [255];
logic [7:0] q [$];
q = array.unique();
if (q.size() == $size(array)) // there are no duplicates in the array