Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебники 60234.doc
Скачиваний:
25
Добавлен:
01.05.2022
Размер:
3.65 Mб
Скачать

Лекция № 2. Описание цифрового устройства на hdl языках

Стили описания, RTL-уровень. Моделирование цифровых устройств. Создание тестового окружения. Логический синтез электрической схемы

Языки описания аппаратуры (HDL – Hardware Description Language) являются языками высокого уровня, которые позволяют создавать модели электронных устройств. В настоящее время распространены два основных языка – VHDL и Verilog.

VHDL (Very High Speed Integrated Circuit Hardware Description Language – язык описания сверхскоростных ИС) был разработан в начале 80-х годов по заданию Министерства обороны США [3]. VHDL строго типизирован и синтаксически напоминает язык Pascal.

Язык Verilog был разработан в 1985 году фирмой Gateway Design Automaton, позднее поглощенной Cadence. Verilog базируется на языке C, не имеет возможности создания новых типов данных, но зато более прост в реализации и лаконичен, что позволяет уменьшить объем описания схем примерно в полтора раза по сравнению с VHDL.

Язык Verilog

Язык Verilog поддерживает три основных уровня абстракции: поведенческий, RTL-уровень (Register Transfer Level – уровень межрегистровых передач) и структурный. Поведенческий уровень описывает функционирование системы в целом без учета внутренней архитектуры. На RTL-уровне поведение схемы определяется в терминах потока данных между регистрами и логических операций над данными (комбинаторная логика). На структурном уровне проект представляется в виде иерархии компонентов. Рис. 2.3 иллюстрирует различные уровни абстракции.

а) б) в)

Рис. 2.3. Уровни абстракции: а) поведенческий; б) RTL-уровень;

в) структурный

Основной структурной единицей проекта на языке Verilog является модуль. Он описывается ключевыми словами module - endmodule, что соответствует entity - end в VHDL. Как правило, модуль содержит список портов — интерфейсных сигналов, которые служат для подключения его к другим модулям. Порты бывают трех типов: input - входы, output - выходы, inout - двунаправленные. Ниже приведен общий синтаксис модуля.

module имя_модуля [список портов];

[output // выходы

inout // двунаправленные порты

input] // входы

// Тело модуля

initial

begin

..

end

always

..

endmodule

Символами // обозначается однострочный комментарий. Verilog также поддерживает многострочный комментарий /* */.

В модуле используются процедурные блоки initial и always. Initial служит для описания действий, которые выполняются один раз (например, при запуске модели), а always обозначает действия, которые выполняются многократно, на протяжении всего времени. Средства синтеза не понимают блок initial. Ключевые слова begin – end служат для объединения последовательно выполняемых операторов в единый с точки зрения синтаксиса оператор (аналогично begin – end в языке Pascal или {} в C). В противоположность последовательному блоку begin – end блок fork – join объединяет параллельные операторы. Значения задержек в нем отсчитываются не относительно предыдущего оператора, а относительно начала блока.

Типы данных

Для моделирования аппаратных средств Verilog поддерживает 4-хзначную логику: 0, 1, z, x. Первые два значения соответствуют логическим уровням, третье – состоянию с высоким импедансом, четвертое означает неопределенное состояние и используется при моделировании неинициализированных сигналов, конфликтов, метастабильных состояний триггеров - во всех случаях, когда симулятор не может определить значение данного сигнала. В реальном приборе такого значения не бывает.

Все типы данных в языке Verilog можно разделить на две основных группы: переменные и цепи. Цепь представляет собой физическое соединение вентилей. Она не сохраняет данные (за исключением trireg): ее значение определяется непрерывным присваиванием (драйвером). Фактически цепь моделирует проводник, который переходит в третье состояние при отключении драйвера. Помимо упомянутой trireg к цепям относятся wire, wand, wor, supply1, supply0. Самой распространенной является wire.

Примеры:

wire net1; // для обычного межсоединения

wor a; // трактует соединение проводников по логике ИЛИ

wand b; // трактует соединение проводников по логике И

trireg c; // хранит последнее значение драйвера

В отличие от цепей переменные сохраняют значение до следующего присваивания. Verilog поддерживает следующие типы переменных:

- reg – беззнаковая переменная (до явного указания signed), самый распространенный тип;

- integer – 32-разрядная переменная со знаком;

- real, realtime – вещественные переменные двойной точности;

- time – 64-разрядная беззнаковая переменная, используется для сохранения времени моделирования.

Переменные reg, time и integer по умолчанию имеют неопределенное значение x, real и realtime – 0.0. Входы и двунаправленные порты модуля должны иметь тип wire, а выходы могут быть как wire, так и reg [2].

Wire и reg могут быть векторными величинами:

- reg [7:0] word; // 8-разрядный регистр, reg[7] - СЗР, reg[0] – МЗР;

- wire [0:4] ack; // 5-разрядная цепь, wire[0] – СЗР, wire[4] - МЗР.

Предпочтительнее задавать векторы в виде [СЗР:МЗР], старший значащий разряд располагать слева.

Цепь управляется непрерывным (continuous) присваиванием, которое задается вне процедурных блоков с помощью ключевого слова assign:

assign d = a & b & c; // d = abc.

Параметры

При описании цифровых схем возникает необходимость задания констант, определяющих какие-либо фиксированные параметры: задержки, разрядность шин. Но в то же время при различных включениях одного и того же модуля в модули верхнего уровня данные константы должны иметь возможность изменяться. Verilog позволяет сделать это с помощью параметров:

module param_example(bus_out, bus_in);

..

parameter bus_width = 32;

wire [width - 1:0] bus_out;

..

endmodule

При подстановке экземпляра модуля параметр можно изменить:

- param_example I1(bus_out, bus_in); // будут использованы значения по умолчанию;

- param_example #(16) I2(bus_out, bus_in); // 16-разрядная шина.

Временной и событийный контроль

Так как Verilog используется для моделирования физических систем, то большое внимание уделено привязке события к определенному моменту времени. Для этого используется механизм задержек. Конструкция # позволяет приостановить исполнение оператора на заданное время. Например, выражение #10 a = b присвоит переменной a значение b спустя 10 временных единиц. Вместо числа могут использоваться параметры, например, при задании тактового сигнала:

parameter real period = 10.0;

..

always @(posedge clk)

#(period / 2) clk = ~ clk;

Конструкция @ (список чувствительности) представляет собой событийный контроль, который задерживает исполнение последующих операторов до тех пор, пока не произойдет событие из списка чувствительности. В качестве событий могут использоваться изменения сигналов – цепей и переменных, положительный (posedge) или отрицательный (negedge) фронт сигнала. В случае использования фронтов сигнал должен быть одноразрядным. Список чувствительности также может содержать особый тип данных event – так называемое именованное событие (named event), срабатывание которого можно задать явно с использованием оператора ->. Использование event в блоках always или параллельных блоках fork - join позволяет эффективно управлять порядком исполнения операторов:

event data_transmitted; // объявление именованного события

always ..

begin

..

-> data_transmitted; // явное срабатывание события

end

always @( data_transmitted); // ожидание срабатывания

..

Оператор wait (expression) позволяет задержать исполнение последующих операторов, пока выражение expression не станет истинным. Если выражение уже истинно, то сразу выполняется следующий оператор.

Конструкции event и wait не поддерживаются средствами синтеза.

Поведенческое моделирование

Для описания устройства на высоком уровне абстракции Verilog предоставляет следующие поведенческие конструкции: условный оператор if-else, оператор выбора case и его разновидности, циклы for, forever, repeat, while.

Операторы if-else и for работают так же, как и в других языках программирования (в языке C). Оператор case (expression) позволяет сделать выбор из нескольких вариантов:

case (sel)

3: y = d;

2: y = c;

1: y = b;

default: y = a;

endcase // sel

Если ни одно из условий не совпадает, выполняется ветвь default. Рекомендуется всегда использовать default для обработки непредвиденных значений.

Цикл forever выполняется на протяжении всего времени моделирования, если не задан список чувствительности:

forever @(interrupt_event); // реагирует на каждое событие interrupt_event.

Цикл repeat исполняет следующий оператор заданное число раз:

repeat (10) @(posedge clk); // ожидаем в течение 10 периодов сигнала clk

Цикл while (expression) выполняет последующий оператор до тех пор, пока выражение expression истинно. Если выражение ложно изначально, то цикл не выполняется ни разу:

while (a > 0)

a <= a – 1;.

После написания RTL-кода устройства его необходимо проверить. Для верификации модели создается тестовое окружение (testbench) – это модуль верхнего уровня, в котором на испытываемое устройство (DUT – device under test или DUV – device under verification) подаются входные воздействия и проверяется реакция на эти воздействия на выходах. Обобщенная модель тестового окружения представлена на рис. 2.4.

Рис. 2.4. Обобщенная модель тестового окружения

В тестовом окружении можно использовать несинтезируемые конструкции: initial, wait, event и т. д.

Моделирование исходных файлов осуществляется с помощью симулятора. Заслуженной популярностью пользуются симуляторы фирмы Cadence - Verilog-XL и NC-Verilog. Оба являются событийными (event-based), то есть проводят вычисления только при изменении состояния схемы.

При моделировании проекта симулятор выполняет следующие шаги: 1) компиляция - симулятор считывает Verilog-описание, обрабатывает директивы и строит иерархию проекта. Этот шаг иногда разделяется на два этапа: собственно компиляцию и проработку (elaboration); 2) инициализация - на этом этапе инициализируются параметры модуля, соответствующие переменные (reg, time и integer) устанавливаются в неизвестное состояние, а неуправляемые цепи – в третье состояние; 3) симуляция - симулятор обрабатывает все события, расписанные на текущий момент времени моделирования, затем увеличивает время (второй параметр директивы `timescale) и продолжает вычисления. Моделирование останавливается, когда в очереди больше нет событий.

Рис. 2.5. Маршрут синтеза в инструменте RTL Compiler

Следующим этапом после написания и отладки проекта является логический синтез - процесс автоматизированного создания логической схемы на базе RTL-описания и библиотек элементов логического уровня от производителя СБИС. Здесь самыми известными продуктами являются RTL Compiler фирмы Cadence и Synopsys Design Compiler. Маршрут синтеза в инструменте RTL Compiler представлен на рис. 2.5.

Результатом логического синтеза является список соединений (netlist) – описание проекта в базовых элементах выбранной технологической библиотеки. Верификацию списка соединений проводят с использованием того же тестового окружения.

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