system verilog - randomize()的实现

时间:2016-11-30 12:55:10

标签: random constraints system-verilog

我必须在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()。

我该如何实现?

1 个答案:

答案 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

当然,您可以决定如何实施temp1temp2temp3的随机化。这些是一些想法。

2)如果您希望所有类都能访问此函数,请使用randomize功能创建一个基类,然后从中派生所有类。虽然在这种情况下您将无法访问派生类变量,但只是基类变量。您始终可以将此虚拟函数设置为在派生类中重写。

3)请注意,在同一个线程中对seed使用相同的$urandom/$urandom_range将创建相同的随机数。