Как НЕ использовать циклы while () в verilog (для синтеза)? - PullRequest
2 голосов
/ 02 марта 2010

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

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

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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 11 марта 2010

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

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

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

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

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

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

1 голос
/ 02 марта 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).

1 голос
/ 02 марта 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;
...