【问题标题】:How do I randomize a signed multidimensional array?如何随机化有符号多维数组?
【发布时间】: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


【解决方案1】:

您的问题是hires_frame_t 是一个有符号的 128 位二维 压缩 数组,选择压缩数组的一部分是无符号。对打包维度的部分选择进行签名的一种方法是为要签名的维度使用单独的 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 演员表放在比较的 LHS 上。您在 RHS 上的签名演员没有做任何事情,因为裸十进制数已被视为已签名。如果一侧或两侧没有符号,则比较是无符号的。

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

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

【讨论】:

  • 感谢您的回答(我有点惊讶)。这是否意味着使用原始声明我随时都会得到未签名:rndpacket[0] 和 rndpacket[0][0]?或者我只是在选择 rndpacket[0] 时没有签名?
  • 原始代码中唯一选择的签名部分是rndpacket[i]。 rndpacket、rndpacket[i][j] 和 rndpacket[i][j][k] 都是无符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
相关资源
最近更新 更多