Verilog - 如何否定数组?

Pat*_*ick 0 verilog system-verilog

reg a[4:0];
reg inv_a[4:0];

assign inv_a = ~a; //This doesn't work.
Run Code Online (Sandbox Code Playgroud)

当我用上面的语句尝试modelsim时,它抛出:“对解压类型的非法操作”

有人可以指出如何正确否定 Verilog 中的数组吗?


编辑:提供更多信息,这会改变任何建议吗?

module router_main(
    input bustorouter_ready[4:0],
);

  wire inv_bustorouter_ready[4:0];

  assign inv_bustorouter_ready = ~bustorouter_ready; //Still doesn't work.
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 5

一种通过比特流来反转解压缩数组的单线解决方案(请参阅IEEE Std 1800-2012 & sect; 11.4.14 Streaming operators (pack/unpack)了解完整细节)

logic a[4:0];
logic inv_a[4:0];

assign {<<{inv_a}} = ~{<<{a}}; // bit streaming
Run Code Online (Sandbox Code Playgroud)

位流仅适用于 SystemVerilog。如果您仅限于 Verilog,则必须使用 for-loop 或 generate-for-loop(请参阅 Tudor 的回答)。

要考虑的另一件事是是否需要解压缩数组。压缩数组允许访问整个数组。Verilog 不允许通过端口连接传递未打包的数组,允许使用打包的数组。SystemVerilog 支持打包在未打包的数组中作为端口。

reg [4:0] a;
reg [4:0] inv_a;

assign inv_a = ~a; // pack array
Run Code Online (Sandbox Code Playgroud)

一般归结为您希望如何访问数组。如果您想被视为一个数字,请使用压缩数组;仍然允许访问单个元素。如果您只想访问数组中的单个元素,请使用 unpacked。有关打包与未打包的更多信息,请参阅这些先前回答的问题: