Техники симуляции в Verilog для надежной верификации RTL
Verilog — язык описания аппаратуры, и для преобразования RTL в логические гейты симуляция не обязательна. Зачем тогда симулировать?
Симуляция — техника подачи различных входных стимулов в дизайн в разное время для проверки, ведет ли себя RTL код как задумано. По сути, это проверка надежности дизайна. Это также похоже на то, как изготовленный чип будет использоваться в реальном мире и реагировать на разные входы.
Например, дизайн выше — детектор положительного фронта с входами clock и signal, оцениваемыми периодически для получения выхода pe. Симуляция позволяет увидеть временную диаграмму связанных сигналов и понять, как ведет себя Verilog-описание.
Существует несколько EDA-компаний, разрабатывающих симуляторы, способные вычислять выходы для различных входов. Verilog определен через модель дискретных событий (discrete event execution model), и разные симуляторы могут использовать разные алгоритмы для выдачи согласованных результатов. Verilog-код делится на множественные процессы и потоки, оцениваемые в разное время симуляции.
Пример
Тестбенч tb — контейнер для модуля дизайна. В примере нет инстансов дизайна. Есть две переменные или сигнала, которым назначаются значения в конкретные моменты. clk — тактовый сигнал, генерируемый в тестбенче через always, чередующий значение каждые 5 нс. Блок initial содержит операторы, назначающие разные значения сигналам в разное время.
module tb;
reg clk;
reg sig;
// Генерация тактового сигнала
// Процесс стартует в 0ns и циклится каждые 5ns
always #5 clk = ~clk;
// Initial блок: процесс стартует в 0ns
initial begin
// Системная задача печатает значения сигналов при каждом изменении
$monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
// Стимулы: назначаем разные значения переменным после задержек
sig = 0;
#5 clk = 0; // clk=0 в 5ns
#15 sig = 1; // sig=1 в 20ns (5+15)
#20 sig = 0; // sig=0 в 40ns (5+15+20)
#15 sig = 1; // sig=1 в 55ns
#10 sig = 0; // sig=0 в 65ns
#20 $finish; // Завершение в 85ns
end
endmodule
Симулятор выдает следующий вывод:
Simulation Log
ncsim> run Time = 0 clk = x sig = 0 Time = 5 clk = 0 sig = 0 Time = 10 clk = 1 sig = 0 Time = 15 clk = 0 sig = 0 Time = 20 clk = 1 sig = 1 Time = 25 clk = 0 sig = 1 Time = 30 clk = 1 sig = 1 Time = 35 clk = 0 sig = 1 Time = 40 clk = 1 sig = 0 Time = 45 clk = 0 sig = 0 Time = 50 clk = 1 sig = 0 Time = 55 clk = 0 sig = 1 Time = 60 clk = 1 sig = 1 Time = 65 clk = 0 sig = 0 Time = 70 clk = 1 sig = 0 Time = 75 clk = 0 sig = 0 Time = 80 clk = 1 sig = 0 Simulation complete via $finish(1) at time 85 NS + 0
Что такое волна симуляции (simulation waveform)?
Симуляция позволяет выгрузить сигналы дизайна и тестбенча в волну, которая графически представляется для анализа и отладки RTL. Волна ниже получена из EDA-инструмента и показывает прогресс каждого сигнала во времени — то же, что временная диаграмма.
Каждое изменение значения переменной или net называется update event. Процессы чувствительны к update events и оцениваются при их возникновении — это evaluation event. Из-за возможности множественных процессов, оцениваемых в произвольном порядке, порядок изменений отслеживается в event queue (очереди событий).
Естественно, они упорядочены по времени симуляции. Размещение нового события в очереди — scheduling. Время симуляции — значение времени, поддерживаемое симулятором для моделирования реального времени схемы. В примере выше время в наносекундах ns.
module des;
wire abc;
wire a, b, c;
assign abc = a & b | c;
// abc обновляется через assign (процесс) при изменении a,b,c -> update event
endmodule
Обновите Verilog и посмотрите пример!
Регионы в очереди событий (Regions in event queue)
Verilog event queue логически разделен на пять регионов. События можно добавлять в любые, но удалять только из активного.
| События | Описание |
|---|---|
| Active | Происходят в текущее время симуляции, обрабатываются в любом порядке |
| Inactive | Происходят в текущее время, обрабатываются после всех активных |
| Nonblocking | Вычислены ранее, назначение происходит в текущем времени после active и inactive |
| Monitor | Обрабатываются после active, inactive и nonblocking |
| Future | Происходят в будущее время симуляции |
Цикл симуляции — обработка всех активных событий. Стандарт гарантирует определенный порядок планирования, за исключением нескольких случаев. Например, операторы внутри begin-end выполняются в порядке появления.
module tb;
reg [3:0] a;
reg [3:0] b;
initial begin
a = 5; // В 0ns a=5
b = 2; // В том же шаге (0ns) b=2
#10 a = 7; // В 10ns a=7
end
endmodule
Очередь событий определяет, что назначение b происходит после назначения a.
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Условная компиляция в Verilog: `ifdef, `ifndef, `elsif
- Понимание семантики планирования в Verilog: тайминг, события и порядок выполнения
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство задач отображения в Verilog: эффективная отладка и логирование