我尝试对数组执行或reduce操作。当赋值左边是寄存器数组时就可以了。当赋值左侧是一个连线数组时,则只有数组的最后一个元素参与归约。为什么?如何正确减少线阵?
这是一段可以帮助你理解这个问题的代码:
module tst_reduction;
parameter DATA_WIDTH = 3;
parameter SIZE = 4;
reg [DATA_WIDTH-1:0] m [SIZE-1:0];
wire [DATA_WIDTH-1:0] m1 [SIZE-1:0];
wire [DATA_WIDTH-1:0] out1;
wire [DATA_WIDTH-1:0] out2;
assign m1 = m;
assign out1 = m.or(); // m is a reg, all right
assign out2 = m1.or(); // m1 is a wire, problem
integer i, j;
initial begin
m = {0, 0, 0, 0};
for (i = 0; i < SIZE; i = i + 1) begin
for (j = 0; j < 2**DATA_WIDTH; j = j + 1) begin
#10;
m[i] = j;
end;
#10;
m[i] = 0;
end
#10;
end
endmodule
我希望
out1
和 out2
相等,但事实并非如此。
本例仿真输出波形:
当我在 Cadence 模拟器上运行您的代码时,
out
和 out2
彼此相等。
当我在 Synopsys 模拟器上运行它时,我收到如下编译错误:
Error-[SV-FNYI] Feature not yet implemented
SystemVerilog feature not yet implemented. Array manipulation method as the
RHS of a continuous assignment. Expression: m.or
也许Quartus没有正确实现这个功能。 将此报告给他们的支持人员。
在 EDA Playground 的不同模拟器上尝试您的代码。