Я попытался выполнить операцию ИЛИ уменьшить над массивом. Когда слева от присваивания стоит массив регистров, то все в порядке. Когда в левой части присваивания находится массив wire
, то в сокращении участвует только последний элемент массива. Почему? Как правильно сократить массивы проводов?
Это код, который может помочь вам понять эту проблему:
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, out1
и 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.