Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Техники симуляции в 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

  1. Освоение Verilog: полное руководство по проектированию цифровых схем
  2. Освоение конкатенации в Verilog: практическое руководство
  3. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  4. Блокирующие и неблокирующие назначения в Verilog: ключевые различия
  5. Мастерство функций в Verilog для эффективного RTL дизайна
  6. Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
  7. Условная компиляция в Verilog: `ifdef, `ifndef, `elsif
  8. Понимание семантики планирования в Verilog: тайминг, события и порядок выполнения
  9. Генератор тактового сигнала в Verilog: проектирование и реализация
  10. Мастерство задач отображения в Verilog: эффективная отладка и логирование