首页 > 解决方案 > SystemVerilog:使用流式操作符打包然后解包会给出错误:Vivado 中的“解包数组连接中的元素类型错误”

问题描述

我正在尝试打包一个二维解包数组,将其通过 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]

根据我对流媒体运营商的了解,这应该可行。这可能是工具错误吗?

标签: hdlvivado

解决方案


这是 Vivado 模拟器中的一个错误。该语法适用于 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

推荐阅读