Блок 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 | |
|---|---|---|
| Выполнение | Один раз | Непрерывно (бесконечно) |
| Использование | Тестовые стенды, инициализация | Аппаратное обеспечение (триггеры, счётчики) |
| Поддаётся синтезу? | Только для начальных значений (FPGA) | Да (со списком чувствительности) |
Важные замечания
- Блоки
initialпредназначены в основном для моделирования. Инструменты синтеза не могут преобразовать задержки, такие как#10, или задачи, такие как$display, в аппаратные средства - Используй
initialглавным образом в тестовых стендах. В модуле проекта его используют только инструменты синтеза FPGA и только для задания начального значения регистра или памяти - Если тестовый стенд содержит свободно работающий тактовый сигнал (например,
always #5 clk = ~clk;), моделирование будет выполняться бесконечно, если не вызвать$finish; если есть только блокinitial, симулятор остановится самостоятельно, когда не останется событий, но добавить$finishвсё равно считается хорошей практикой
Задание
Добавь отсутствующий блок initial, который устанавливает a в 0, а затем через 10 единиц времени устанавливает a в 1.
Что нужно сделать:
- Добавь
initial beginиend - Установи
a = 0 - Подожди
#10 - Установи
a = 1 - Добавь $finish, чтобы завершить симуляцию
Попробуйте сами
module test;
reg a;
// TODO: Добавьте здесь блок initial
// Установите a = 0
// Подождите #10
// Установите a = 1
// Добавьте $finish; для завершения моделирования
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog