Как НЕ использовать циклы while() в verilog (для синтеза)?

У меня есть привычка разрабатывать много тестовых стендов и использовать циклы for() и while() для целей тестирования. Хорошо. Проблема в том, что я перенял эту привычку к кодированию схем, которые должны быть синтезируемыми. XST и другие отказываются синтезировать код (без дополнительной модификации параметров синтеза), такой как:

while (num < test_number) 
     begin 
     . 
     . 
     . 
     num = num+1; 
     end

Это плохой стиль кодирования, потому что для синтезатора test_num является целым числом со значением 2^32! или он видит его как неограниченный параметр. В любом случае, это плохая привычка кодирования. Но я так привык делать это на C и тестовых стендах. Что было бы эквивалентно синтезируемому коду вышеуказанного сегмента кода?

Спасибо!


person chester.boo    schedule 02.03.2010    source источник
comment
Зависит от того, что вы делаете. Что обычно входит в ваши while циклы?   -  person Marty    schedule 02.03.2010
comment
Это набор сложения и деления с последующим обновлением счетчика.   -  person chester.boo    schedule 02.03.2010


Ответы (3)


Инструменты синтеза различаются, но, как правило, цикл может быть синтезирован, если инструменту синтеза известно количество итераций. Так,

for ( i = 0; i < 10; i = i + 1 )

в порядке, потому что инструмент знает, что есть 10 итераций цикла. Но

reg [10:0] r;
for ( i = 0; i < r; i = i + 1 )

не в порядке, потому что r является переменной, значение r неизвестно во время синтеза.

Думайте о циклах в RTL-коде как о создании известного фиксированного числа копий логики.

person Steve K    schedule 10.03.2010

Вам нужно иметь часы, чтобы контролировать его, чтобы начать.

always @(posedge clk or negedge rst_n)
  if (!rst_n)
     num <= 32'b0; // or whatever your width is.
  else
     if (num < test_number)
       num <= num + 1'b1;
person Brian Carlton    schedule 02.03.2010
comment
Это кажется хорошим решением. Но цикл while() изначально был в задаче. Если я передам clk задаче, не похоже, что его значение будет обновлено. Но подождите, если я использую задачу, мне вообще нужен порт clk для задачи, или я могу использовать clk, не передавая его в качестве аргумента? - person chester.boo; 02.03.2010
comment
Задачи и функции имеют доступ к переменным, входам и выходам, объявленным в том же модуле, что и задача. Аргументы передаются в задачи и функции по значению (то есть путем копирования) один раз при запуске задачи. Выходные аргументы копируются, когда задача существует. Поэтому не пропускайте часы в задачу. - person Steve K; 11.03.2010

Если ваш инструмент синтеза не поддерживает циклы while или for, не используйте цикл. Просто расширьте свой код.

wire [1:0] addr;
reg  [3:0] wren;

always @(posedge clk) begin
    wren[0] <= (addr == 2'd0);
    wren[1] <= (addr == 2'd1);
    wren[2] <= (addr == 2'd2);
    wren[3] <= (addr == 2'd3);
end

Я не знаком с XST, но некоторые инструменты синтеза поддерживают циклы (например, Synopsys).

person toolic    schedule 02.03.2010