【问题标题】:system verilog - implementation of randomize()系统verilog - randomize() 的实现
【发布时间】:2016-11-30 12:55:09
【问题描述】:

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

我该如何实现?

【问题讨论】:

    标签: random constraints system-verilog


    【解决方案1】:

    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) 如果您希望所有类都访问此函数,请创建一个具有随机化功能的基类,然后从中派生所有类。尽管在这种情况下您将无法访问派生类变量,只能访问基类变量。你总是可以把它作为一个虚函数来覆盖你的派生类。

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

    【讨论】:

    • @noobuntu- 1. 函数如何“知道”类的成员(如 data_xi。我希望用户可以通过类 name.randomize() 调用它并且函数将随机相关成员 2. 关于 3- 我怎样才能防止这种情况发生?我也应该把种子放在一边吗?
    • 1.在您的类中,创建一个名为randomize 的函数。然后,该函数将有权访问类变量。 2. 是的,您可以随机化种子或添加一些其他随机性。每次运行模拟时,我曾经使用 $system("date") 来获取随机变量。
    • @noobuntu- 我想要一个静态函数,它可以在来自不同类的实例 var 上“工作”。
    • 你需要为每个类实现一个函数
    • 可以选择将此函数设为静态。我确定 systemVerilog randomize 是静态函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多