Директива Timescale
Часть раздела Основы путешествия по Verilog на Coddy — урок 70 из 90.
Директива timescale задает единицу времени и точность времени для симуляции. Она указывает симулятору, как интерпретировать значения задержки, такие как #10.
В предыдущих уроках мы использовали задержки вроде #10 без указания того, что именно означает «10». Это 10 наносекунд? 10 пикосекунд? Директива timescale отвечает на этот вопрос.
Синтаксис:
`timescale time_unit / time_precision| Часть | Значение | Пример |
|---|---|---|
time_unit | Основная единица для задержек | 1ns |
time_precision | Насколько точным должно быть моделирование | 1ps |
Обратный апостроф ` перед timescale означает, что это директива компилятора.
Пример
`timescale 1ns / 1pstime_unit = 1ns→#10означает 10 nanosecondstime_precision = 1ps→ Симуляция округляет до ближайшей пикосекунды
Распространенные значения Timescale
| Единица времени | Точность | Вариант использования |
|---|---|---|
1ns / 1ns | Наносекунда | Простые симуляции |
1ns / 1ps | Пикосекунда | Более точные |
1ps / 1ps | Пикосекунда | Высокоскоростные схемы |
1us / 1ns | Микросекунда | Медленные симуляции |
Как это влияет на задержки
`timescale 1ns / 1ps
initial begin
#10 a = 1; // Ожидает 10 наносекунд
endБез timescale некоторые симуляторы используют значение по умолчанию (часто 1ns). Лучше всегда указывать его явно.
Важные правила
| Правило | Пояснение |
|---|---|
| Должна находиться вне модулей | Размещается перед любым определением module |
| Символ обратной кавычки | `timescale, а не 'timescale |
| Единица времени ≥ точность времени | 1ns / 1ps — допустимо, 1ps / 1ns — нет |
| Влияет на все задержки в файле | Общие задержки, задержки вентилей, задержки присваивания |
Задание
Что нужно сделать:
Добавьте пропущенную директиву timescale, чтобы задержки составляли 10ns, 20ns и 30ns.
Попробуйте сами
// TODO: Добавить директиву timescale (1ns / 1ps)
module timescale_challenge;
initial begin
$display("Time %0t", $time);
#10 $display("Time %0t (10ns = 10000ps)", $time);
#10 $display("Time %0t (20ns = 20000ps)", $time);
#10 $display("Time %0t (30ns = 30000ps)", $time);
$finish;
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU13Тайминг и задержки
Что такое задержкиЗадержки вентилейЗадержки в присваиванияхДиректива TimescaleГенерация тактового сигналаИтоги — управление таймингом5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial