#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
оператором.