如何随机化带符号的多维数组?

How do I randomize a signed multidimensional array?

我声明了一个带符号的多维数组如下:

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);}});

这编译得很好,但是 (mentor graphics) 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,一切都会按预期进行。

随机化这样一个有符号数组的正确方法是什么?

你的问题是 hires_frame_t 是一个带符号的 128 位二维 压缩 数组,select 压缩数组的一部分是 无符号。保持打包维度的部分 select 已签名的一种方法是对要签名的维度使用单独的 typedef

typedef bit signed [31:0] int32_t;
typedef int32_t [3:0] hires_frame_t;
typedef hires_frame_t [3:0] hires_capture_t;

另一种选择是将 signed 转换为比较的左轴。您在 RHS 上签名的演员没有做任何事情,因为裸十进制数字已经被视为签名。如果一侧或两侧无符号,则比较无符号。

 assert(std::randomize(rndpacket) with {
       foreach (rndpacket[channel,subsample])
          {signed'(rndpacket[channel][subsample]) < 32768;
           signed'(rndpacket[channel][subsample]) >= -32768;}});

顺便说一句,我正在展示使用二维 foreach 循环的 LRM 兼容方式。