Можно ли использовать posedge в verilog только на часах?

#verilog

#verilog

Вопрос:

Может ли posedge быть обнаружен для переменных, которые не являются часами?

Например, у меня есть кнопка сброса R, которая должна возвращать компьютер в исходное состояние при каждом нажатии.

 always @ (posedge clk, posedge R)
    if(R)
      reset_the_machine();
    else
      use_the_next_state();
  

Комментарии:

1. Это типичный асинхронный активный высокий сброс.

Ответ №1:

В вашем вопросе есть два вопроса:

можно ли использовать posedge в verilog только на часах?

Ответ отрицательный.

Может ли posedge быть обнаружен для переменных, которые не являются часами?

Ответ — да.

В языке verilog нет часов. Каждый сигнал одинаков. Ребра могут быть обнаружены при моделировании для любой переменной. Обнаружение ребер само по себе является артефактом моделирования.

Clock — это всего лишь современный аппаратный артефакт. Программа verilog отражает поведение оборудования, и поэтому ей необходимо программировать часы определенным образом, связанным с оборудованием. Но это всего лишь программный трюк.

Что касается вашего примера, см. Ответ Дейва-59.

Ответ №2:

Использование ребра для сигнала, такого как set или reset, является артефактом инструментов синтеза шаблонов шаблонов, выбранных для представления асинхронной логики в одном always блоке. Если вы не прошли квалификацию R с posedge , то отрицательное ребро ( negedge ) из R выполнит use_next_state() ветку. Таким образом, симуляция будет интерпретировать выпуск reset как posedge clock.

Когда Verilog был впервые разработан, целью было использовать отдельные always блоки для синхронного и асинхронного поведения с использованием процедурного непрерывного присваивания

 always @(R)
  if (R)
     assign state = initial_state;
  else 
     deassign state;

always @(posedge clk)
    state <= next_state;
  

Но современные инструменты синтеза больше не поддерживают этот шаблон, вероятно, из-за путаницы с полностью непрерывным assign оператором.