Verilog Моделирование
Verilog — это язык описания оборудования, и разработчикам не требуется моделировать свои RTL-проекты, чтобы иметь возможность преобразовывать их в логические вентили. Так в чем же необходимость симуляции?
Моделирование — это метод применения различных входных воздействий к дизайну в разное время, чтобы проверить, ведет ли RTL-код предполагаемым образом. По сути, моделирование — это проверенный метод проверки надежности проекта. Это также похоже на то, как изготовленный чип будет использоваться в реальном мире и как он реагирует на различные входные данные.
Например, приведенная выше конструкция представляет детектор положительного фронта с входными тактовыми импульсами и сигналом, которые оцениваются через периодические интервалы, чтобы найти выход pe. как показано. Моделирование позволяет нам просматривать временную диаграмму связанных сигналов, чтобы понять, как на самом деле ведет себя описание проекта в Verilog.
Есть несколько компаний EDA, которые разрабатывают симуляторы. способный выяснить выходы для различных входов в дизайн. Verilog определяется с точки зрения отдельного события. Модель выполнения и разные симуляторы могут свободно использовать разные алгоритмы, чтобы предоставить пользователю согласованный набор результатов. Код Verilog разделен на несколько процессов и потоков и может оцениваться в разное время в ходе моделирования, что будет затронуто позже.
Пример
Тестовый стенд под названием tb представляет собой контейнер для модуля дизайна. Однако в этом примере мы не использовали экземпляры проекта. Есть две переменные или сигналы которым можно присвоить определенные значения в определенное время. clk представляет часы, которые генерируются в тестовом стенде. Это делается с помощью always
утверждение, чередуя значение часов через каждые 5 нс. initial
блок содержит набор операторов, которые присваивают разные значения обоим сигналам в разное время.
module tb;
reg clk;
reg sig;
// Clock generation
// Process starts at time 0ns and loops after every 5ns
always #5 clk = ~clk;
// Initial block : Process starts at time 0ns
initial begin
// This system task will print out the signal values everytime they change
$monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
// Also called stimulus, we simply assign different values to the variables
// after some simulation "delay"
sig = 0;
#5 clk = 0; // Assign clk to 0 at time 5ns
#15 sig = 1; // Assign sig to 1 at time 20ns (#5 + #15)
#20 sig = 0; // Assign sig to 0 at time 40ns (#5 + #15 + #20)
#15 sig = 1; // Assign sig to 1 at time 55ns (#5 + #15 + #20 + #15)
#10 sig = 0; // Assign sig to 0 at time 65ns (#5 + #15 + #20 + #15 + #10)
#20 $finish; // Finish simulation at time 85ns
end
endmodule
Симулятор выдает следующий результат после выполнения вышеуказанного тестового стенда.
Журнал моделирования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
Что такое имитационная волна?
Моделирование позволяет нам преобразовать проектные и тестовые сигналы в форму волны, которую можно представить графически для анализа и отладки функциональности проекта RTL. Показанная ниже форма сигнала получена с помощью инструмента EDA и показывает изменение каждого сигнала во времени и совпадает с временной диаграммой, показанной ранее.
Каждое изменение значения переменной или сети называется событием обновления. . А процессы чувствительны к событиям обновления. так что эти процессы оцениваются всякий раз, когда происходит событие обновления, и называется событием оценки. . Из-за возможности произвольной оценки нескольких процессов порядок изменений необходимо отслеживать в так называемой очереди событий. .
Естественно, они упорядочены по времени моделирования. Помещение нового события в очередь называется расписанием. . Время моделирования используется для обозначения значения времени, поддерживаемого симулятором для моделирования фактического времени, которое потребуется для моделируемой схемы. Значения времени для приведенного выше примера показаны в наносекундах ns
на временной диаграмме.
module des;
wire abc;
wire a, b, c;
assign abc = a & b | c; // abc is updated via the assign statement (process) whenever a, b or c change -> update event
endmodule
Обновите Verilog и посмотрите пример!
Области в очереди событий
Очередь событий Verilog логически разделена на пять регионов, и в любой из них можно добавлять события. Однако удалить его можно только из активного региона.
События | Описание |
---|---|
Активный | Происходит в текущее время симуляции и может обрабатываться в любом порядке |
Неактивно | Происходит в текущее время симуляции, но обрабатывается после завершения всех активных событий |
Неблокирующий | Оценивается в какой-то предыдущий момент времени, но назначение выполняется в текущее время моделирования после выполнения активных и неактивных событий |
Монитор | Обрабатывается после выполнения всех активных, неактивных и неблокирующих событий |
Будущее | Происходит в какой-то момент моделирования в будущем |
В цикле моделирования обрабатываются все активные события. Стандарт гарантирует определенный порядок планирования за исключением нескольких случаев и. Например, операторы внутри блока begin-end будут выполняться только в том порядке, в котором они появляются.
module tb;
reg [3:0] a;
reg [3:0] b;
initial begin // Statements are executed one after the other at appropriate simulation times
a = 5; // At time 0ns, a is assigned 5
b = 2; // In the same simulation step (time 0ns), b is assigned 2
#10 a = 7; // When simulation advances to 10ns, a is assigned 7
end
endmodule
очередь событий определяет это назначение для b должно произойти после присваивания a .
Verilog