2015-03-17 2 views
0

Если я правильно понимаю защелку, она создается в комбинационном блоке, в котором объявляются не все возможные условия при присвоении переменной значения. Как получить защелку в моем последовательном блоке?Verilog Latch in always @ (posedge clk)

Когда я скомпилировал свой код через Quartus, он убрал 2 Fmax, что указывает на то, что у меня есть защелка.

[email protected](posedge clk or negedge nreset) begin 
     case(counter) 
     0: begin 
      if(state == IDLE) begin 
       // DOES SOMETHING 
      end 
     end 

     1: begin 
      // DOES ASSIGNMENT 
     end // PROLOG 

     81: begin 
      // DOES ASSIGNMENT 
     end // EPILOG 


     82: begin 
      // DOES ASSIGNMENT 
     end // POSTPROC 

     default: begin 
      // DOES ASSIGNMENT 
     end // ROUNDS 

     endcase 

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

Мой код вычисления SHA1

У меня 2 всегда @ (posedge CLK), один вычисляет следующий Wt, и выше, вычисляет следующий A, B, C, D, E значение.

+2

Вы используете nreset в своем блоке всегда? – toolic

+1

@toolic, Nope. Я достал нресет, и защелка ушла. Благодарю. – Sugihara

+0

Этот блок всегда не является комбинационным блоком. Он запускается часовым событием, поэтому синтезатор не будет вызывать защелки, а регистры (триггеры с часами). Если это намеренно является комбинационной частью FSM, список чувствительности будет записан как: 'always @ (*)' –

ответ

1

Нет else в вашем заявлении if. Синтезатор смущен относительно того, что должно произойти дальше, тем самым вызывая защелки.

Если это не предназначено, а вместо этого просто то, что вы написали для примера переполнения стека, тогда проблема может быть в вашем другом всегда блоке.

Защелка - это просто Flip Flop без часов. Причина, по которой синтезаторы считают, что они плохие, заключается в том, что они могут потенциально вызвать ошибки времени. Задвижки также не всегда являются проблемой, ведь иногда, как вы, вероятно, уже знаете, они преднамеренно.

Проверьте свои assign операторы и посмотрите, есть ли у вас какие-либо записи, объявленные вне блока always, который инициализируется значением 0 или некоторым значением.

В этом случае вы можете попробовать начальный блок. Синтаксис:

initial 
begin 

value = 0; 
input = 0; // or something 

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