Arrays SystemVerilog:使用变量创建压缩数组
我想在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
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 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食谱中提取了要点,使其更易于理解。我已经按照建议实现了,代码正在运行。