Verilog-如何对数组求反?

Verilog-如何对数组求反?,verilog,system-verilog,Verilog,System Verilog,当我用上面的语句尝试modelsim时,它抛出:对未打包类型执行非法操作 有人能指出如何在Verilog中正确地对数组求反吗 编辑:提供更多信息,这是否会改变任何建议 根据以下需要更改导线的注册号: module router_main( input bustorouter_ready[4:0], ); wire inv_bustorouter_ready[4:0]; assign inv_bustorouter_ready = ~bustorouter_ready; //S

当我用上面的语句尝试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.
或者,如果使用“始终”块,则可以将inv_a保留为reg:

reg a[4:0]似乎与reg[4:0]a不一样

reg a[4:0]与reg[0:0]a[4:0]相同:由5个寄存器组成的数组,每个寄存器1位

reg[4:0]a是一个5位寄存器

还原运算符以及一元逆变器运算符这是仅在单个向量寄存器上按位操作的运算符。您的第一个声明声明了5个向量。

尝试在组合过程中使用for循环:

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

always @*
  inv_a = ~a; //This should work.

只能对压缩阵列位向量执行逻辑操作。作为一个整体,在未打包的阵列上允许的唯一操作是复制和比较

如果必须在一行中执行此操作,则可以将未打包的数组转换为打包数组,然后再转换回打包数组

genvar i;
for (i = 0; i <= 4; i++)
  always_comb
    inv_a[i] = ~a[i];
否则,我建议使用foreach循环

typedef logic  ua5[5];
typedef logic bit [4:0] pa5;
ua5 a; // same as reg a[4:0]
ua5 inv_a;

assign inv_a = ua5'(pa'(~a));

可通过位流实现的反汇编阵列的单线解决方案请参阅§;11.4.14流媒体运营商打包/解包以获取完整详细信息

always_comb foreach (a[i]) inv_a[i] = ~a;
一般来说,这取决于您希望如何访问阵列。如果您希望被视为一个数字,请使用压缩数组;仍然允许单个元素访问。如果只想访问数组中的单个元素,请使用Unpacket。有关打包与未打包的更多信息,请参阅前面回答的问题:


您可以使用一个数组对其进行异或运算:

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

assign inv_a = ~a; // pack array

您可以通过使用压缩阵列上的逻辑运算来进行反转

assign inv_a = a ^ {WIDTH{1'b1}};
然后可以将二进制数编辑为输入或寄存器的宽度
如7'B111111或3'b111。

请查看我的更新问题。我试过你的建议,但还是不行。我添加了有关我的代码的更多信息,请查看您的建议是否仍然适用?您不应该始终使用@*,因为关联的块在时间0时不会被调用。如果你使用SystemVerilog,你应该使用always_comb。在我的设计中,我实际上需要一个由5个寄存器组成的阵列,因为信号来自不同的模块。这基本上就是我现在正在做的。我想,如果几天内没有一条班轮来处理这个问题,我会接受你的回答!foreach循环不应该是~a吗?我认为这是迄今为止最清晰的答案。
always_comb foreach (a[i]) inv_a[i] = ~a;
logic a[4:0];
logic inv_a[4:0];

assign {<<{inv_a}} = ~{<<{a}}; // bit streaming
reg [4:0] a;
reg [4:0] inv_a;

assign inv_a = ~a; // pack array
assign inv_a = a ^ {WIDTH{1'b1}};
assign inverted_a = ((a)^(4'b1111));
X (XOR) 1 = ~X