Директива timescale
Часть раздела Основы путешествия по Verilog на Coddy. Урок 70 из 90.
Директива timescale задаёт единицу времени и точность времени для симуляции. Она сообщает симулятору, как интерпретировать значения задержки, такие как #10.
В предыдущих уроках мы использовали задержки, такие как #10, не уточняя, что означает «10». Это 10 nanoseconds? 10 пикосекунд? Директива timescale отвечает на этот вопрос.
Синтаксис:
`timescale time_unit / time_precision| Часть | Значение | Пример |
|---|---|---|
time_unit | Базовая единица для задержек | 1ns |
time_precision | Точность симуляции | 1ps |
Обратный апостроф ` перед timescale означает, что это директива компилятора.
Пример
`timescale 1ns / 1pstime_unit = 1ns→#10означает 10 наносекундtime_precision = 1ps→ Моделирование округляется до ближайшей пикосекунды
Распространённые значения timescale
| Time Единица | Точность | Вариант использования |
|---|---|---|
1ns / 1ns | Наносекунда | Простые симуляции |
1ns / 1ps | Пикосекунда | Более высокая точность |
1ps / 1ps | Пикосекунда | Высокоскоростные проекты |
1us / 1ns | Микросекунда | Медленные симуляции |
Как это влияет на задержки
`timescale 1ns / 1ps
initial begin
#10 a = 1; // Ожидает 10 наносекунд
endБез timescale некоторые симуляторы используют значение по умолчанию (часто 1ns). Лучше всегда указывать его.
Важные правила
| Правило | Объяснение |
|---|---|
| Должно находиться вне module | Размещается перед любым определением module |
| Символ обратного апострофа | `timescale, а не 'timescale |
| time unit ≥ time precision | 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Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU13Синхронизация и задержки
Что такое задержкиЗадержки вентилейЗадержки присваиванияДиректива timescaleГенерация тактового сигналаПовторение — управление временем5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog