Охват шкалы времени Verilog
Шкала времени по умолчанию
Хотя ожидается, что модули Verilog будут иметь шкалу времени, определенную перед модулем, симуляторы могут вставлять шкалу времени по умолчанию. Фактическую шкалу времени, которая применяется в любой области в разработанной Verilog иерархии, можно распечатать с помощью системной задачи $printtimescale
. который принимает область действия в качестве аргумента.
module tb;
initial begin
// Print timescale of this module
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
Обратите внимание, что даже несмотря на то, что директива шкалы времени не была помещена перед этим модулем, симулятор в конечном итоге применил значение шкалы времени 1 нс/1 нс.
Журнал моделированияxcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
Стандартная шкала времени
По умолчанию директива шкалы времени, помещенная в файл, применяется ко всем модулям, которые следуют за директивой, до определения другой директивы шкалы времени.
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
module alu;
endmodule
`timescale 1ns/10ps
module des;
endmodule
В приведенном выше примере tb и alu имеют шкалу времени 1 нс/1 нс, а des получает шкалу времени 1 нс/10 пс из-за размещения директивы перед определением модуля des
Журнал моделированияxcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Область между файлами Verilog
Другие файлы могут быть включены в текущий файл с помощью `include
директива, которая является директивой препроцессора и заставляет компилятор помещать содержимое включаемого файла перед компиляцией. Таким образом, это эквивалентно простой вставке всего содержимого другого файла в этот основной файл.
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
`include "file_alu.v"
`include "file_des.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
Посмотрите, что результаты точно такие же, как и в предыдущем примере. alu получает шкалу времени 1 нс/1 пс, потому что это была последняя директива, которая оставалась в силе до тех пор, пока компилятор не нашел определение alu, несмотря на то, что поместил его в другой файл. des получает шкалу времени 1 нс/10 пс, поскольку директива была заменена до ее определения.
Журнал моделированияxcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Обмен файлами может изменить шкалу времени
Порядок включения файлов играет важную роль в переопределении директив временной шкалы, что видно из приведенного ниже примера.
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
// NOTE! Swapped order of inclusion
`include "file_des.v"
`include "file_alu.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
Обратите внимание, что модуль alu теперь получает шкалу времени 1 нс/10 пс.
Журнал моделированияxcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 10ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Это одна из причин наличия директивы шкалы времени в верхней части файлов, чтобы все модули в этом файле принимали правильную шкалу времени независимо от включения файла.
Однако этот подход может затруднить компиляцию с другой точностью шкалы времени (значение после косой черты) без изменения каждого файла. Многие компиляторы и симуляторы также предоставляют возможность переопределить значения шкалы времени по умолчанию, которые будут применяться ко всем модулям.
Verilog