Блок initial
Часть раздела Основы путешествия по Verilog на Coddy — урок 47 из 90.
Verilog имеет два процедурных блока: initial (выполняется один раз) и always (выполняется непрерывно). Теперь давайте рассмотрим блок initial.
Что такое блок Initial?
Блок initial выполняется только один раз в начале симуляции (момент времени 0). Когда он завершается, он больше не запускается.
Он в основном используется в тестбенчах для:
- Установки начальных значений
- Генерации тестовых сигналов
- Отображения сообщений
- Запуска симуляции
Синтаксис
initial begin
// Операторы выполняются один раз, последовательно
endБазовый пример
initial begin
$display("Simulation started");
$display("This runs once");
$finish;
endВывод:
Simulation started
This runs onceИспользование блока initial для тестовых сигналов
initial begin
a = 0;
#10 a = 1;
#10 a = 0;
#10 $finish;
endЭто изменяет a в моменты времени: 0, 10 и 20.
Initial против Always
initial | always | |
|---|---|---|
| Запуск | Один раз | Непрерывно (всегда) |
| Используется для | Тестбенчи, инициализация | Аппаратное обеспечение (триггеры, счетчики) |
| Синтезируемость? | Нет (только симуляция) | Да (со списком чувствительности) |
Важные примечания
- Блоки
initialне синтезируемы — их нельзя превратить в аппаратное обеспечение - Используйте
initialтолько в тестбенчах - Без
$finishсимуляция будет длиться вечно (нет тактового сигнала, чтобы её остановить)
Задание
Добавьте недостающий блок initial, который устанавливает a в 0, а затем через 10 единиц времени устанавливает a в 1.
Что нужно сделать:
- Добавьте
initial beginиend - Установите
a = 0 - Подождите
#10 - Установите
a = 1 - Добавьте $finish, чтобы завершить симуляцию
Шпаргалка
Блок initial выполняется один раз в момент времени симуляции 0. Используется только в тестбенчах (не синтезируется).
initial begin
a = 0; // устанавливается в момент времени 0
#10 a = 1; // устанавливается в момент времени 10
#10 a = 0; // устанавливается в момент времени 20
$finish; // завершение симуляции
endБез $finish симуляция будет выполняться бесконечно.
initial | always | |
|---|---|---|
| Выполняется | Один раз | Непрерывно |
| Применение | Тестбенчи | Аппаратная логика |
| Синтезируемый? | Нет | Да |
Попробуйте сами
module test;
reg a;
// TODO: Добавьте блок initial здесь
// Установите a = 0
// Подождите #10
// Установите a = 1
// Добавьте $finish; для завершения симуляции
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial