hdl - 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]
根据我对流媒体运营商的了解,这应该可行。这可能是工具错误吗?
解决方案
这是 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
推荐阅读
- flutter - 将列的特定子项添加到底部
- php - Laravel Seeder 类和数组上的第三项给出异常
- android - 使用 ActionBar 中的 SearchView 小部件和片段
- r - 如何在 R 中将日期时间列转换为 dd/mm/yyyy 格式
- angular - 警告:“无法绑定“slidestart”事件,因为 Hammer.JS 未加载且未指定自定义加载程序。
- momentjs - momentjs 相当于 PHP 的 date()
- r - 带有 stat="identity" 的 geom_count 不起作用
- json - JSONDecoder 从字符串中的字符串中提取数据?
- visual-studio-code - 有没有办法收听粘贴事件?
- javascript - 无法在“SourceBuffer”上执行“appendBuffer”:此 SourceBuffer 已从父媒体源中删除