SystemVerilog:打包,然后使用流运算符解压缩会给出错误:Vivado中的“解压缩数组并置中的元素类型错误”

问题描述

我正在尝试打包一个2D解压缩的数组,将其通过Verilog包装器传递,然后将其解压缩到另一个模块(或测试台)中。最简单的代码如下:

module a_tb();
  timeunit 10ns;
  timeprecision 1ns;

  localparam N     = 4;
  localparam WIDTH = 8;

  logic [N*N*WIDTH-1:0] A_flat_1;
  logic [WIDTH-1:0] A_1 [N][N];

  logic [N*N*WIDTH-1:0] A_flat_2;
  logic [WIDTH-1:0] A_2 [N][N];

  assign {<<{A_flat_1}} = A_1;
  assign A_flat_2 = A_flat_1;
  assign A_2 = {<<{A_flat_2}};    // Line 13

  initial begin
    foreach (A_1[i,j]) begin
      A_1[i][j] = 10*i+j;
    end

    #10;
    $display("%p",A_1);
    $display("%p",A_2);
    assert(A_1==A_2);
  end
endmodule

在Vivado 2018.2 Simulator中出现以下错误:

ERROR: [VRFC 10-1571] wrong element type in unpacked array concatenation [U:/path/array_test.tb.sv:13]

据我对流运算符的了解,这应该可行。这可能是工具错误吗?

解决方法

这是Vivado Simulator中的错误。该语法可在Synposis VCS(EDA游乐场)中使用。

经过几天的实验,我在Vivado Simulator中发现,{<<{A_flat_2}}只是在保持位压缩的同时反转了位,因此返回了logic [N*N*WIDTH-1:0]向量。

作为一种解决方法,我发现{>>{{<<{A_flat_2}}}}返回类型为logic [WIDTH-1:0] A_2 [N][N]的解压缩向量。

解决方法(在VCS和Vivado中均适用)

module a_tb();
  timeunit 10ns;
  timeprecision 1ns;
  
  localparam N     = 4;
  localparam WIDTH = 8;

  logic [N*N*WIDTH-1:0] A_flat_1;
  logic [WIDTH-1:0] A_1 [N][N];
  logic [N*N*WIDTH-1:0] A_flat_2;
  logic [WIDTH-1:0] A_2 [N][N];

  assign {<<{A_flat_1}} = A_1;
  assign A_flat_2 = A_flat_1;
  assign A_2 = {>>{{<<{A_flat_2}}}};

  initial begin
    foreach (A_1[i,j]) begin
      A_1[i][j] = 10*i+j;
    end
    #10;
    $display("%p",A_1);
    $display("%p",A_2);
    assert(A_1==A_2);
  end
endmodule

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...