System verilog 如何创建具有随机大小的不同随机值的动态数组?
面试问题: 我有一个基于systemverilog的类,如下所示:System verilog 如何创建具有随机大小的不同随机值的动态数组?,system-verilog,System Verilog,面试问题: 我有一个基于systemverilog的类,如下所示: class A; rand n; constraint c:{n>=10 &&n<=15}; bit [31:0] arr[]; randc [31:0] data; endclass A类; 兰德n; 约束c:{n>=10&&n您想要唯一的约束 class A; rand bit [31:0] arr[]; constraint arr_size { arr.size() inside
class A;
rand n;
constraint c:{n>=10 &&n<=15};
bit [31:0] arr[];
randc [31:0] data;
endclass
A类;
兰德n;
约束c:{n>=10&&n您想要唯一的约束
class A;
rand bit [31:0] arr[];
constraint arr_size { arr.size() inside {[10:15]}; }
constraint arr_uniq { unique {arr}; }
endclass
如果没有unique,您可以执行以下操作:
class T;
randc bit [31:0] x;
endclass
class A;
rand bit [31:0] arr[];
local T temp;
function void post_randomize();
foreach (arr[i])
begin
void'(temp.randomize());
arr[i] = temp.x;
end
void'(temp.randomize());
endfunction
constraint size_con { arr.size() inside {[10:15]}; }
endclass
只需使用一些紧约束,您就可以生成动态数组的唯一随机模式。我尝试给出一些解决方案。我还添加了一个相同的代码示例。希望对您有所帮助
class A;
rand int a[];
constraint generate_unique_dyn_array {
foreach( a[ii] )
{
foreach( a[jj] )
{
if( ii != jj )
a[ii] != a[jj] ;
}
}
}
endclass
在位[31:0]arr[]之前不应该有一个rand
?是的,你是对的。面试官不希望我使用unique,那么如何在没有unique约束的情况下使用它呢?IEEE 1800-2012中添加的unique约束使这个问题变得微不足道。面试问题应该修改为询问如何在没有unique约束的情况下使用它。这种暴力解决方案会产生太多的不独立性双重约束,这可能会随着阵列的尺寸越来越大而降低模拟速度。在post_rand和pre_rand中实现这一点时是否相同?如果不是,区别是什么?我相信只有两种方法:pre_randomize&post_randomize,而不是pre_rand,post_randSry,typo。我想问一下pre_randomize和post_ran之间的区别domize.pre_randomize是在类随机化之前自动执行的方法。类似地,post_randomize将在类随机化之后执行。如果这是您想要的,则可以将其标记为答案。