【问题标题】:SystemVerilog: Creating packed arrays using variablesSystemVerilog:使用变量创建打包数组
【发布时间】:2015-12-23 14:37:20
【问题描述】:

我想创建一个在 SystemVerilog 中执行以下操作的任务:

  1. 接收3个输入参数和1个输出参数。
  2. 随机化数据并将数据分配给位变量(输出参数)。

    1. task rand_wr_data(input int size, int data_range_hi, int data_range_lo, output bit [31:0] data);
    2.     bit unsigned [(size - 1):0] rand_data_bits;
    3.     bit unsigned [(data_range_hi - data_range_lo):0] wr_data_bits;
    4.    
    5.     int unsigned rand_data = $urandom();
    6.     wr_data_bits = rand_data;
    7.     data = wr_data_bits << (data_range_lo + 1);
    8. endtask: rand_data
    

上面的代码会给我一个错误,因为 第 2 行和第 3 行的非常量表达式错误 我必须使用一个常量来声明数组的范围。我尝试了以下方法,但无济于事。

    [parameter | localparam | const] int data_size = size;

因此,我有几个查询如下:

  1. 有没有办法使用我的代码中的变量来创建打包数组?
  2. 还有其他方法可以做我想做的上述事情吗?
  3. 我能否接收可变大小数组作为任务参数,而不是必须声明其大小的数组?
  4. 在我的代码的第 6 行中,我想将一个 unsigned int 分配给一个 32 位数组,但之后我收到了不同的结果。我怎样才能做到这一点?

谢谢。

【问题讨论】:

    标签: arrays task system-verilog


    【解决方案1】:

    参考错误:非常数表达式。所有打包变量大小必须在编译时定义。但是在这里,您提供的 run-time 大小是不可行的。从此错误。

    可能有一些有用和不太有用的解决方法,如下所示:

    sizedata_range_hidata_range_lo 声明为参数。由于参数编译/精化时间期间被评估,这应该可以工作。但是您不能在运行时直接更改这些参数。

    task rand_wr_data ( output bit [31:0] data);
      parameter int size=8, data_range_hi=8,data_range_lo=0;
      bit unsigned [(size - 1):0] rand_data_bits;
    

    作为替代和有效的方式,参考SystemVerilog LRM 1800-2012section 13.8:

    参数化子例程允许用户一般性地指定或定义实现。当使用该子程序时,可以提供完全定义其行为的参数。这允许一个定义编写维护,而不是多个子例程具有不同的数组大小、数据类型, 和可变宽度。

    还有以下段落:

    实现参数化子例程的方法是通过在参数化类中使用静态方法(参见 8.10 和 8.25)。

    可以将类声明为虚拟,以防止对象构造并强制方法严格静态使用强>。

    您可以在其中创建参数化的virtual 类和static 任务。将使用 范围解析运算符 (::) 和参数覆盖来调用此任务。可以这样做:

    virtual class wrapper #(parameter int size=8, int data_range_hi=8, int data_range_lo=0);
     static task rand_wr_data(output bit [31:0] data);
     bit unsigned [(size - 1):0] rand_data_bits;
     // ...
     // ...
     endtask
    endclass
    // ...
    // in some module/class, call task
    wrapper #(16,8,0)::rand_wr_data (a);
    // ...
    

    将类声明为virtual 确保不能为该类创建任何对象。 LRM 第 13.8 节中给出的示例也可能有用。

    EDAPlayground here 提供了一个工作示例。

    回答您的问题

    有没有办法使用我的代码中的变量来创建打包数组?

    是的,如上所述。

    还有其他方法可以做我想做的事情吗?

    可能还有其他方式,例如 define 指令,可以由用户在运行时设置,但在整个模拟过程中它们将保持不变。

    我可以接收可变大小数组作为任务参数,而不是必须声明其大小的数组吗?

    是的,如上所述。

    在我的代码的第 6 行,我想将一个 unsigned int 分配给一个 32 位数组,但之后我收到了不同的结果。我怎样才能做到这一点?

    Bit 默认为unsigned,因此无需声明bit unsigned,只需bit 即可;但这不是问题。这里的问题似乎wr_data_bits 被定义为bit unsigned [(data_range_hi - data_range_lo):0] wr_data_bits;rand_data 被定义为int unsigned rand_data。两者的大小可能变化

    如果您将31 作为(data_range_hi - data_range_lo) 传递,则值将匹配。给定的示例代码链接显示相同的值。

    wr_data_bits = 5e23536 rand_data = 5e23536
    

    我试过用谷歌搜索它,但没有找到太多信息。更多信息请参考this链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多