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)
一种通过比特流来反转解压缩数组的单线解决方案(请参阅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。有关打包与未打包的更多信息,请参阅这些先前回答的问题: