检查数组内容是否有重复值的断言

问题描述 投票:0回答:1

我有一个数组

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
    );

有没有更优雅的实现方式?

verilog system-verilog system-verilog-assertions
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.