我必须在systemVerilog中实现randomize()函数,因为我使用的工具(模型sim)不支持这个函数。
我在一个类中使用以下成员实现了一个基本函数:
bit [15:0] data_xi;
bit [15:0] data_xq;
基本随机函数:
//function my_randomize
function int my_randomize(int seed);
int temp1, temp2;
temp1 = (($urandom(seed)) + 1);
data_xi = temp1 - 1;
temp2 = (($urandom(seed)) + 1);
data_xq = temp2 - 1;
if(temp1 != 0 || temp2 != 0 )
return 1;
else
return 0;
endfunction: my_randomize
现在我必须将其更改为静态函数,假设其行为类似于带约束的randomize()。
我该如何实现?
答案 0 :(得分:0)
1)为了使你的函数像约束一样,你可以输入你的函数来设置范围或模数。
//function my_randomize
function int my_randomize(int seed, int temp1_min, int temp1_max, int temp2_min, int temp2_max, int temp3_min, int temp3_max);
int temp1, temp2, temp3;
temp1 = $urandom_range(temp1_min, temp1_max);
temp2 = (($urandom(seed)) % (temp2_max+1));
data_xi = temp2 - 1;
temp3 = ((($urandom($urandom(seed))) % temp3_max+1) + temp3_min;
data_xq = temp3 - 1;
if(temp1 != 0 || temp2 != 0 )
return 1;
else
return 0;
endfunction: my_randomize
当然,您可以决定如何实施temp1
,temp2
和temp3
的随机化。这些是一些想法。
2)如果您希望所有类都能访问此函数,请使用randomize功能创建一个基类,然后从中派生所有类。虽然在这种情况下您将无法访问派生类变量,但只是基类变量。您始终可以将此虚拟函数设置为在派生类中重写。
3)请注意,在同一个线程中对seed
使用相同的$urandom/$urandom_range
将创建相同的随机数。