Arrays SystemVerilog:使用变量创建压缩数组

Arrays SystemVerilog:使用变量创建压缩数组,arrays,task,system-verilog,Arrays,Task,System Verilog,我想在SystemVerilog中创建一个执行以下操作的任务: 接收3个输入参数和1个输出参数 随机化数据并将数据分配给位变量(输出参数) 因此,我有以下几个问题: 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

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

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

    因此,我有以下几个问题:

    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);
    // ...
    
  • 有没有一种方法可以使用代码中的变量创建压缩数组
  • 有没有其他方法可以完成我想做的事情
  • 我是否可以接收可变大小数组作为任务参数,而不是必须声明其大小的数组
  • 在我的代码的第6行中,我想将一个无符号int赋值给一个32位数组,但之后会收到不同的结果。我怎样才能做到这一点

  • 谢谢。

    指的是错误:非常量表达式。所有压缩变量的大小必须在编译时定义。但是这里您提供的运行时大小是不可行的。从今以后,错误就来了

    以下是一些有用和不太有用的变通方法:

    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);
    // ...
    
    大小
    数据范围高
    数据范围低
    声明为参数。由于参数编译/精化期间进行了评估,因此这将起作用。但不能在运行时直接更改这些参数

    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;
    
    作为一种替代和有效的方法,参考第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节中给出的示例也可能有用

    最后给出了一个工作实例

    来回答您的问题

    有没有一种方法可以使用代码中的变量创建压缩数组

    是的,如上所述

    有没有其他方法可以完成我想做的事情

    可能还有其他方法,比如
    定义
    指令,用户可以在运行时设置这些指令,但它们在整个模拟中保持不变

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

    是的,如上所述

    在我的代码的第6行中,我想将一个无符号int赋值给一个32位数组,但之后会收到不同的结果。我怎样才能做到这一点

    位默认为
    无符号
    ,因此无需声明
    位无符号
    ,只需
    即可;但这不是问题所在。这里的问题似乎是
    wr\u data\u bits
    被定义为
    bit unsigned[(data\u range\u hi-data\u range\u lo):0]wr\u data\u bits
    rand\u数据
    定义为
    int无符号rand\u数据
    。两者的大小可能有所不同

    如果将
    31
    作为
    (数据范围高-数据范围低)
    传递,则值将匹配。给定的示例代码链接显示相同的值

    wr_data_bits = 5e23536 rand_data = 5e23536
    

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

    非常感谢。您已经从SystemVerilog食谱中提取了要点,使其更易于理解。我已经按照建议实现了,代码正在运行。