Я написал код на Verilog, который циклически перебирает активные каналы. Идея состоит в том, чтобы пропустить каналы, отмеченные 0 в векторе активности.
Я протестировал код в симуляторе, снимок экрана из симулятора, он работает и работает так, как ожидалось. .
Когда я пытаюсь синтезировать код с помощью Synplify Pro, я получаю сообщение об ошибке: «E CS162 Превышен предел итераций цикла 4000 — добавьте ‘// synchronous loop_limit 8000’ перед созданием цикла test1.v (11)».
Ошибка указывает на состояние цикла (i < 6'b100000
).
В поисках ошибки в Google я обнаружил распространенную ошибку в аналогичном коде, когда i
имеет ту же длину, что и channel
, что заставляет цикл работать бесконечно, потому что 11111 + 1 = 00000
.
Кроме того, в программном обеспечении Xilinx есть ошибка, но я ею не пользуюсь.
Любая идея, почему я получаю эту ошибку или почему она отличается от моделирования? Есть ли способ реализовать эту функцию без цикла?
Это код:
module test1 (
input wire [31:0] activity,
input wire RESET,
input wire CLK);
reg [4:0] channel, next_channel;
reg [5:0] i,j;
always @(activity, channel) begin
next_channel = 5'b0;
for (i = 6'b0; i < 6'b100000 ; i = i + 6'b1) begin
j = i + {1'b0, channel} + 6'b1;
if (j>6'b011111)
j = j - 6'b100000;
if (activity[j[4:0]]) begin
next_channel = j[4:0];
i = 6'b101111;
end
end
end
always @(posedge CLK, negedge RESET) begin
if (RESET == 1'b0)
channel = 5'b0;
else
channel = next_channel;
end
endmodule
i = 47
? Вы пытаетесь выйти из цикла раньше? Я думаю, вы сбиваете с толку компилятор, который считает (правильно), что теперь у вас есть переменный счетчик итераций. Я не думаю, что Synplify достаточно умен, чтобы справиться с переменным лимитом. Подумайте об аппаратном обеспечении — работающая симуляция не гарантирует, что вы сможете синтезировать. - person EML   schedule 17.03.2019