【发布时间】:2021-10-05 15:08:49
【问题描述】:
我已经声明了一个有符号的多维数组,如下所示:
typedef logic signed [3:0][31:0] hires_frame_t;
typedef hires_frame_t [3:0] hires_capture_t;
hires_capture_t rndpacket;
我想随机化这个数组,使每个元素的值在 -32768 到 32767 之间,采用 32 位二进制补码。
我尝试了以下方法:
assert(std::randomize(rndpacket) with
{foreach (rndpacket[channel])
foreach (rndpacket[channel][subsample])
{rndpacket[channel][subsample] < signed'(32768);
rndpacket[channel][subsample] >= signed'(-32768);}});
这编译得很好,但是(指导图形)modelsim 在模拟声明中失败
randomize() failed due to conflicts between the following constraints:
# clscummulativedata.sv(56): (rndpacket[3][3] < 32768);
# cummulativedata.sv(57): (rndpacket[3][3] >= 32'hffff8000);
这显然与有符号向量的使用有关。我感觉一切都应该没问题,因为数组被声明为signed 以及randomize 调用中的阈值,但显然不是。如果我将范围替换为 0-65535,一切都会按预期进行。
随机化这种有符号数组的正确方法是什么?
【问题讨论】:
-
32'hffff8000未签名;32'shffff8000已签名。你需要签名的。 -
@Serge
32'hffff8000是从该工具输出的。它将 RHS 视为未签名,因为 LHS 未签名。请看我的回答。
标签: multidimensional-array random system-verilog