Верилог временная шкала
Моделирование Verilog зависит от того, как определяется время, потому что симулятор должен знать, что означает № 1 с точки зрения времени. `timescale
директива компилятора указывает единицу времени и точность для следующих за ней модулей.
Синтаксис
`timescale <time_unit>/<time_precision>
// Example
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns
time_unit является измерением задержек и времени моделирования, в то время как time_precision указывает, как округляются значения задержки перед использованием в моделировании.
Используйте следующие конструкции шкалы времени, чтобы использовать разные единицы времени в одном и том же проекте. Помните, что спецификации задержки в проекте не могут быть синтезированы и не могут быть преобразованы в аппаратную логику.
`timescale
для базовой единицы измерения и точности времени- Системная задача $printtimescale для отображения единицы времени и точности
$time
и$realtime
системные функции возвращают текущее время, а формат отчета по умолчанию можно изменить с помощью другой системной задачи$timeformat
.
Символ | Единица |
---|---|
с | секунды |
мс | миллисекунды |
нас | микросекунды |
нс | наносекунды |
ps | пикосекунды |
фс | фемтосекунды |
Целые числа в этих спецификациях могут быть 1, 10 или 100, а строка символов, указывающая единицу измерения, может принимать любое значение, указанное в таблице выше.
Пример №1:1 нс/1 нс
// Declare the timescale where time_unit is 1ns
// and time_precision is also 1ns
`timescale 1ns/1ns
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Первый оператор задержки использует #1, что заставляет симулятор ждать ровно 1 единицу времени, которая указана как 1 нс с помощью `timescale
. директива. Оператор задержки esecond использует 0,49, что меньше половины единицы времени. Однако точность времени указана равной 1 нс, и, следовательно, симулятор не может быть меньше 1 нс, что заставляет его округлять заданный оператор задержки и дает 0 нс. Таким образом, вторая задержка не может увеличить время моделирования.
В третьем операторе задержки используется ровно половина единицы времени [hl]#0.5[/lh], и снова симулятор будет округлять значение, чтобы получить #1, который представляет одну целую единицу времени. Таким образом, это печатается при T=2 нс.
В четвертом операторе задержки используется значение, превышающее половину единицы времени, и он также округляется, что приводит к выводу оператора display при T=3 нс.
Журнал моделированияncsim> run T=1 At time #1 T=1 At time #0.49 T=2 At time #0.50 T=3 At time #0.51 T=8 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
Моделирование выполняется в течение 8 нс, как и ожидалось, но обратите внимание, что форма волны не имеет меньших делений между каждой наносекундой. Это связано с тем, что точность времени такая же, как единица измерения времени.
Пример №2:10 нс/1 нс
единственный изменение, сделанное в этом примере по сравнению с предыдущим, заключается в том, что шкала времени была изменена с 1 нс/1 нс на 10 нс/1 нс. Таким образом, единица времени составляет 10 нс, а точность — 1 нс.
// Declare the timescale where time_unit is 10ns
// and time_precision is 1ns
`timescale 10ns/1ns
// NOTE: Testbench is the same as in previous example
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Фактическое время моделирования получается путем умножения задержки, указанной с помощью #
. с единицей времени, а затем округляется в зависимости от точности. Тогда первый оператор задержки даст 10 нс, а второй — 14,9, которые округляются до 15 нс.
Третье утверждение аналогичным образом добавляет 5 нс (0,5 * 10 нс), и общее время становится равным 20 нс. Четвертый добавляет еще 5 нс (0,51 * 10), чтобы увеличить общее время до 25 нс.
Журнал моделированияncsim> run T=10 At time #1 T=15 At time #0.49 T=20 At time #0.50 T=25 At time #0.51 T=75 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
Обратите внимание, что основная единица формы сигнала измеряется в десятках наносекунд с точностью до 1 нс.
Пример №3:1 нс/1 пс
единственный изменение, сделанное в этом примере по сравнению с предыдущим, заключается в том, что шкала времени была изменена с 1 нс/1 нс на 1 нс/1 пс. Таким образом, единицей измерения времени является 1 нс, а точность — 1 пс.
// Declare the timescale where time_unit is 1ns
// and time_precision is 1ps
`timescale 1ns/1ps
// NOTE: Testbench is the same as in previous example
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Убедитесь, что единицы времени масштабируются в соответствии с новым значением точности 1 пс. Также обратите внимание, что время представлено в наименьшем разрешении, которое в данном случае составляет пикосекунды.
Журнал моделированияncsim> run T=1000 At time #1 T=1490 At time #0.49 T=1990 At time #0.50 T=2500 At time #0.51 T=7500 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
Verilog