Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
XilinxCourse_v2.0.doc
Скачиваний:
56
Добавлен:
22.04.2019
Размер:
3.26 Mб
Скачать

5.5 Вспомогательные конструкции

Кроме уже описанного минимума, можно также использовать огромное количество конструкций языка, схожих с конструкциями, применяемыми для обычного программирования. В этом разделе мы рассмотрим некоторые из них.

5.5.1 Task и function

С ростом сложности проекта, также растет и сложность тестового окружения. Одним из способов снижения сложности является разбивка всего кода тестового окружения на более мелкие части. В этом нам могут помочь такие конструкции, как task и function.

Конструкция function описывает функцию, принимающую на вход некоторое количество аргументов, осуществляющую заданную операцию и возвращающую некоторое значение. Тело функции не может содержать в своем составе конструкций, относящихся ко времени, например #N. При этом любой вызов функции происходит «мгновенно» и не затрачивает никакого времени моделирования, т. е. реализация функций в языке Verilog HDL, аналогична реализации функции в обычных языках программирования высокого уровня. Функции в свою очередь могут вызывать другие функции. На рисунке 5.5.1 представлен синтаксис описания function.

Рисунок 5.5.1 — Синтаксис описания function

  • [result_type] – Тип возвращаемого значения;

  • [name] – Имя функции;

  • [args] – Список передаваемых аргументов;

  • [local_vars] – Объявление локальных переменных;

  • [proc_statement] – Процедурные операторы.

В свою очередь, конструкция task является более гибкой. Она не возвращает значений, но может содержать любые конструкции языка, относящиеся ко времени, а также может иметь аргументы разных типов, таких как input, output или inout. На рисунке 5.5.2 представлен синтаксис описания task.

Рисунок 5.5.2 — Синтаксис описания task

  • [name] – Имя задания;

  • [args] – Список передаваемых аргументов;

  • [local_vars] – Объявление локальных переменных;

  • [proc_statement] – Процедурные операторы.

Стоит отметить также, что объявление функции возможно только в пределах модуля.

5.5.2 Циклы

Язык Verilog HDL поддерживает следующие циклы: for, while, repeat и forever. Использование циклов возможно только в пределах секция кода, в которых разрешено выполнение процедурных операторов. Например внутри блоков always или initial, а также function и task. Для примера, на рисунке 5.5.3 представлен синтаксис цикла for.

Рисунок 5.5.3 — Синтаксис цикла for

  • [initial_assign] – Присваивание до входа в цикл;

  • [condition] – Условие выхода из цикла;

  • [step_assign] – Присваивание на очередной итерации цикла;

  • [local_vars] – Объявление локальных переменных;

  • [proc_statement] – Процедурные операторы.

5.5.3 Ожидание событий и состояний

В тестовых окружениях нам часто требуется дождаться появления определенных событий или состояний. Для этих целей используются следующие конструкции:

    • @([event]) – Ожидание возникновения определенного события. В роли такого события может выступать фронт (posedge clk) или срез тактового сигнала (negedge clk);

    • wait([condition]) – Ожидание возникновения определенного состояния. В роли условия может выступать любое логическое выражение, результатом которого является 0 или 1.

Эти конструкции языка можно использовать только внутри always или initial блоков. При этом, каждый блок always или initial можно рассматривать как отдельный программный поток. Если в блоке выполнение кода доходит до одного из описанных выше операторов, то дальнейшее выполнение кода в этом блоке будет приостановлено до появления описанного события или состояния. Данное поведение может быть продемонстрировано на рисунке 5.5.4.

Рисунок 5.5.4 — Структура поведения конструкций ожидания языка Verilog HDL

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]