System verilog SystemVerilog关联数组的随机抽样

System verilog SystemVerilog关联数组的随机抽样,system-verilog,System Verilog,对关联数组进行随机采样的最佳方法是什么?我尝试了以下方法,但是随机化方法总是失败 std::randomize(idx) with {assoc_array.exists(idx);}; 我想我可以调用next方法,从关联数组的第一个元素开始随机调用多次,以实现所需的功能。然而,有没有更好的办法?为什么上面的受约束随机化不起作用?问题是,当您在约束中调用函数时,首先随机化函数的输入参数,然后将结果作为状态变量传递给函数。如果函数返回false,则约束失败,idx保持不变。如果选择了一个确实存在

对关联数组进行随机采样的最佳方法是什么?我尝试了以下方法,但是
随机化方法总是失败

std::randomize(idx) with {assoc_array.exists(idx);};

我想我可以调用
next
方法,从关联数组的第一个元素开始随机调用多次,以实现所需的功能。然而,有没有更好的办法?为什么上面的受约束随机化不起作用?

问题是,当您在约束中调用函数时,首先随机化函数的输入参数,然后将结果作为状态变量传递给函数。如果函数返回false,则约束失败,idx保持不变。如果选择了一个确实存在的idx,则约束将通过。我假设选择一个存在的idx的概率非常低

我建议将所有索引放入一个数组中,然后随机选择其中一个

typedef bit [11:0] index_type; // or whatever your index type is
int assoc_array[index_type];
index_type idx, index_list[$];
...
index_list = assoc_array.find_index() with ('1);
std::randomize(idx) with {idx inside {index_list}};

顺便说一句,我忘了提到一些内置函数(如
sum()
)的行为不同并且是内联的,这些函数在LRM中特别调用。