В настоящее время я пытаюсь скомпилировать коммутатор с использованием двух циклов while. Для петель, функция сдвига и функция журнала не могут быть и речи. Однако, когда я пытаюсь его скомпилировать, он выдает ошибку «loop with non-constant loop conditions» в указанной строке. Условиями while в этой строке являются i < j, где j - N-1, N - параметр. Мой вопрос в том, что, поскольку N является параметром, почему он не действует постоянным даже во время компиляции и, следовательно, считается условием постоянного цикла?В то время как цикл с условиями неконстантного контура, но с использованием параметра
Вот код:
module shifter(input logic [0:0] SW0, SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10,
input logic [0:0] KEY0, KEY1,
output logic [0:0] LEDG0, LEDG1, LEDG2, LEDG3, LEDG4, LEDG5, LEDG6, LEDG7);
parameter N=8;
//receive input from switches
logic [7:0] bits = '0;
logic [7:0] out = '0;
logic [0:0] move = '0;
logic [2:0] shift = '0;
logic next = 1;
always_comb
begin
bits[7] = SW7[0];
bits[6] = SW6[0];
bits[5] = SW5[0];
bits[4] = SW4[0];
bits[3] = SW3[0];
bits[2] = SW2[0];
bits[1] = SW1[0];
bits[0] = SW0[0];
shift[2] = SW10[0];
shift[1] = SW9[0];
shift[0] = SW8[0];
end
logic i = 0;
logic k = 0;
logic [31:0] j = N - 1;
[email protected](negedge KEY0)
begin
k <= shift[2:0];
do
begin
move <= bits[0];
do
begin
bits[i] <= bits[next];
i <= i + 1;
next <= i + 1;
end
while (i < j); //<-------indicated line
bits[7] <= move;
k <= k - 1;
end
while(k > 0);
out <= bits;
end
always_comb
begin
LEDG0 = out[0];
LEDG1 = out[1];
LEDG2 = out[2];
LEDG3 = out[3];
LEDG4 = out[4];
LEDG5 = out[5];
LEDG6 = out[6];
LEDG7 = out[7];
end
endmodule
try 'i <(N-1)' вместо 'i
noobuntu
@noobuntu Я попробовал это, он добавил еще одну ошибку, в которой говорилось, что« цикл должен заканчиваться в течение 5000 итераций ». – user7231602
Обычно это делается с помощью for- петля. Почему думаешь, что это не может быть и речи? – toolic