SystemVerilog 关联数组的随机采样
Random sampling of SystemVerilog associative array
随机抽取关联数组的最佳方法是什么?我尝试了以下方法,但 randomize
方法总是失败。
std::randomize(idx) with {assoc_array.exists(idx);};
我想我可以从关联数组的第一个元素开始随机调用 next
方法多次来实现所需的功能。然而,有更好的方法吗?为什么上面的约束随机化不起作用?
问题是当您在约束中调用函数时,函数的输入参数首先被随机化,然后结果在传递给函数时被视为状态变量。如果函数 returns false,则约束失败,idx 保持不变。如果它碰巧选择了一个确实存在的 idx,则约束通过。我假设选择存在的 idx 的概率非常低。
我的建议是将所有索引放入一个数组中,然后随机select其中一个
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}};
随机抽取关联数组的最佳方法是什么?我尝试了以下方法,但 randomize
方法总是失败。
std::randomize(idx) with {assoc_array.exists(idx);};
我想我可以从关联数组的第一个元素开始随机调用 next
方法多次来实现所需的功能。然而,有更好的方法吗?为什么上面的约束随机化不起作用?
问题是当您在约束中调用函数时,函数的输入参数首先被随机化,然后结果在传递给函数时被视为状态变量。如果函数 returns false,则约束失败,idx 保持不变。如果它碰巧选择了一个确实存在的 idx,则约束通过。我假设选择存在的 idx 的概率非常低。
我的建议是将所有索引放入一个数组中,然后随机select其中一个
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}};