Понимание и печать timescale в Verilog в любой области видимости
Дефолтный timescale
Хотя модулям Verilog ожидается наличие timescale перед модулем, симуляторы могут вставлять дефолтный timescale. Фактический timescale, применяемый в любой области иерархии, можно напечатать системной задачей $printtimescale, принимающей область (scope) как аргумент.
module tb;
initial begin
// Печать timescale этого модуля
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
Даже без директивы timescale перед модулем, симулятор применил 1ns/1ns.
Simulation Log
xcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
Стандартная область видимости timescale
По умолчанию директива timescale в файле применяется ко всем модулям после неё до следующей директивы timescale.
`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 получают 1ns/1ps, а des — 1ns/10ps из-за размещения директивы перед его определением.
Simulation Log
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 получает 1ns/1ps, так как последняя действующая директива до его определения — 1ns/1ps, несмотря на отдельный файл. des получает 1ns/10ps, так как директива переопределена перед его определением.
Simulation Log
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.
Смена порядка файлов меняет timescale
Порядок включения файлов важен для переопределения timescale, как видно ниже.
// 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_des.v"
`include "file_alu.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
Теперь alu получает 1ns/10ps.
Simulation Log
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.
Это одна из причин ставить timescale в начало файлов — все модули в файле получают правильный timescale независимо от порядка включения. Но это может затруднить компиляцию с другой точностью timescale без изменения каждого файла. Многие компиляторы/симуляторы предоставляют опцию переопределения дефолтных значений timescale для всех модулей.
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Иерархические ссылки в Verilog: область видимости и избежание коллизий имен
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени