系统 verilog 允许信号的多个打包维度。但是,从另一个形状为 3x2 的信号分配形状为 2x3 的信号时,定义的行为是什么?总位数是相同的,但模拟似乎很乐意接受这种分配。
示例:
module test();
wire [1:0][2:0] x;
assign x[0][0] = 1;
assign x[1][2] = 1'dx;
wire [2:0][1:0] y;
wire [5:0] z;
assign y = x; // <-- Would like an error or lint error to occur
assign z = x; // <-- Would like an error or lint error to occur
wire [2:0][1:0] w;
assign w = 6'd63; // <-- Would like an error or lint error to occur
initial $display("FOOOOO %06b %06b %06b %06b", x, y, z, w);
endmodule
vcs、questa 和 verilator 都运行此代码,不会发出任何警告或错误。它们可以配置为将此检测为错误吗?还有其他可用的 linter 工具吗?
这是打包数组的定义行为,并且是标准所允许的。如果您想要检查数组大小,可以使用解压数组。
以下是标准的相关部分:
出于赋值的目的,压缩数组被视为向量。任何向量表达式都可以分配给任何压缩数组。目标打包数组的打包数组边界不会影响赋值。如果没有显式转换,打包数组不能直接分配给未打包数组。