Понимание семантики планирования в Verilog: тайминг, события и порядок выполнения
Verilog дизайны и тестбенчи содержат много строк кода: блоки always, initial, непрерывные назначения и другие процедурные операторы, активирующиеся в разное время симуляции.
Каждое изменение значения сигнала — update event. Процессы (always, assign), чувствительные к этим событиям, оцениваются в произвольном порядке — evaluation event. Поскольку события происходят в разное время, их управляют через event queues (очереди событий), упорядоченные по времени симуляции.
module tb;
reg a, b, c;
wire d;
// 'always' процесс оценивается при обновлении 'a' или 'b'
// Изменение 'a' или 'b' — 'update event'
// Срабатывание 'always' — 'evaluation event'
always @ (a or b) begin
c = a & b;
end
// 'assign' процесс оценивается при обновлении 'a', 'b' или 'c'
assign d = a | b ^ c;
endmodule
Очередь событий (Event Queue)
Шаг симуляции сегментируется на четыре региона. Активная очередь — набор процессов для выполнения в текущее время, может запланировать новые процессы в активную или другие очереди. События можно добавлять в любые регионы, но удалять только из active.
- Active — события в текущее время, обрабатываются в любом порядке
- Inactive — события в текущее время, обрабатываются после всех active
- Nonblocking assign — вычислены ранее, назначение в текущем времени после active и inactive
- Monitor — обрабатываются после active, inactive и nonblocking
Когда все активные события текущего time step выполнены, симулятор продвигает время к следующему шагу и выполняет его активную очередь.
module tb;
reg x, y, z;
initial begin
#1 x = 1; y = 1;
#1 z = 0;
end
endmodule
Симуляция стартует в 0, первый оператор планируется на 1 единицу времени — назначаются x и y = 1. Это активная очередь для времени 1. Затем планируется следующий оператор через 1 единицу — z = 0.
Что делает симуляцию недетерминистичной?
Могут возникнуть race conditions, дающие разные выходы для одного дизайна и тестбенча. Одна причина — active события могут извлекаться из очереди и обрабатываться в любом порядке.
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени
- Понимание и печать timescale в Verilog в любой области видимости