2015-03-16 2 views
0

Я новичок в verilog. Я искал онлайн, и большинство из них предлагают не использовать for-loop в Verilog-кодировании. Так есть ли лучшая альтернатива для замены for-loop? Проблема, с которой я столкнулся сейчас, заключается в том, что мне нужно выполнить 1 или 2 цикла for в case case. И я думал о лучших альтернативах, но не придумал ни одного. Будет здорово, если кто-нибудь из вас может пролить свет на это.Лучшая альтернатива для петли verilog

Пример моего кода:

always @(*) 
case (help) 
4'd1: for (i=A; i<=20;i=i+B) 
     begin temp[i-1]=1; end 
4'd2: for (i=A; i<=20;i=i+B) 
     begin temp[i-1]=1; B=B+1; end 
4'd3: begin 
     for (i=A; i<=20;i=i+B) 
     begin temp[i-1]=1; B=B+1; end 
     for (i=A; i>=1;i=i-B) 
     begin temp[i-1]=1; B=B+1; end 
     end 
default: temp = 0; 
+0

@Ari, к сожалению, мой код занимает очень очень много времени, чтобы компилировать. Я думаю, причина в том, что Грег упомянул ниже, что мои петли не статичны. –

+1

Нет, статический или динамический характер кода не имеет ничего общего с временем компиляции. Однако код с нестатистическим циклом не может быть синтезирован. – Ari

ответ

3

Для петель хороши в Verilog, но они должны иметь возможность статические раскатывают, если вы планируете синтез. Статический разворот означает, что цикл не зависит от каких-либо внешних переменных. Например, for(i=0;i<10;i=i+1) является статическим. for(i=A; i<=20;i=i+B) не является статическим, поскольку он зависит от переменных A и B.

Вы можете сделать цикл статическим, перемещая переменные как условие внутри цикла for. for(i=A; i<=20;i=i+B) становится:

tmp_var = A; 
for (i=0; i<=20;i=i+1) begin 
    if (i==tmp_var) begin 
    // ... your logic here ... 
    tmp_var = tmp_var+B; 
    end 
end 

Вопросы, которые должны быть решены за рамки вопроса:

Они, как вы используете B и temp немного относительно.

  • B, как представляется, вход, но вы также увеличивающиеся его. Для синтеза незаконно манипулировать вводом. Если это вход, то создайте локальную переменную со значением по умолчанию как B, и вы можете изменить это значение позже в пределах того же самого блока. Если это не вход, то он создает логику фиксации; что не очень хорошо, и я расскажу об этом следующим образом: temp.

  • temp - логическая логика. Логика блокировки затруднительна, поскольку время имеет решающее значение; зная, когда защелка прозрачна или закрыта, и соблюдая требования времени удержания. Чем сложнее логика, тем сложнее ее предсказать. В RTL односторонние защелки выводятся по неполным назначениям внутри комбинационных блоков (то есть always @*). Чтобы решить эту проблему, убедитесь, что каждому биту присваивается каждый проход комбинационных блоков. Один из способов безопасности - назначить значения по умолчанию, прежде чем приступать к вашей логике. Пример:

    always @(*) begin 
        temp = 0; // default to a constant 
        temp_B = B; // default to an input value 
    
        // ... your logic ... 
    end 
    
+0

Ох! Я не знал, что переменные в for-loop являются незаконными. Спасибо за этот совет! Кстати, если в выражении if-else внутри цикла нет else, это также создаст защелку? Потому что метод, который вы предлагали, имеет только если без другого. –

+0

Еще один вопрос: вы упомянули, что temp является логикой фиксации, и для ее решения требуется значение по умолчанию перед началом работы. Не привязано ли это к случаю по умолчанию? Как так? –

+0

Вам нужно рассмотреть все возможные пути. Если существует способ, которым какой-либо бит не назначается ни по одному пути, а назначается, по крайней мере, по одному пути, то этот бит является защелкой. Условие по умолчанию в аргументе case является одним из нескольких возможных путей. – Greg

Смежные вопросы