Android-приложение для поиска дешевых авиабилетов: play.google.com
Главная -> Verilog

0 1 2 [3] 4

function [7:0] swap; input [7:0] byte: begin

swap = {byte[3:0].byte[7:4]}; end

endfunction

Вызов функции осуществляется следующим образом: a=swap(b):

Прежде чем рассматривать процедуры, рассмотрим иерархическую структуру Verilog-модели и области видимости объектов. Локальные переменные (сигналы или параметры) могут объявляться внутри модуля, именованного блока, процедуры или функции. Если в локальной области видимости симулятору не удается обнаружить переменную, то поиск продолжается в более "высокой" области видимости до тех пор, пока не дойдет дело до переменных, сигналов, параметров, объявленных внутри модуля. Если внутри модуля переменная не обнаружена, то выдается сообщение об ощибке. Таким образом, модуль является высшим элементом иерархии областей видимости. Для доступа к объектам в других модулях, собранных в иерархическую структуру, служит операция разрешения контекста. Эта операция задается с помощью имен модулей или именованных блоков внутри модуля (процедур или функций), разделенных точкой. Так, в примере с делителем частоты (первая часть статьи) для доступа к внутреннему регистру асе модуля NCO syn из модуля верхнего уровня testbench нужно воспользоваться такой конструкцией «имя включения (instance)>.acc.

always @(negedge elk) $write("Time %t elk %b rst %b fi %b f2 %b p .s-1 %b phase2 %b\n, $time, elk, rst, f1, f2, ncol.acc, nco2.acc );

При этом на печать будут выдаваться значения фазы (из области видимости модулей NCO syn)

Time 112000 elk О rst О f1 Time 113000 elk О rst О f1 Time 114000 elk 0 rst Ofl Time 115000 elk 0 rst Ofl Time 116000 elk 0 rst Ofl Time 117000 elk 0 rst Of1 Time 118000 elk 0 rst Ofl

1 f2 1 phasel 1 f2 1 phasel

0 f2 0 phasel

1 f2 1 phasel 1 f2 0 phasel

0 f2 1 phasel

1 f2 1 phasel

0000 phase2 0000 1011 phase2 1101 0110phase2 1010

0001 phase2 0111 1100 phase2 0100 0111 phase2 0001 0010phase2 1110

Также можно двигаться вверх или вниз по иерархии включения, используя абсолютные (начинающиеся с модуля выс-шепэ уровня), либо относительные имена, что очень похоже на методы работы с файловой системой

Такой механизм доступа создает ограничение, налагаемое на локальные переменные. Также следует вспомнить о параллельно1« исполнении и о том. что процедуры в языках HDL не "вызываются", а "разрешаются" Такое название свидетельствует о том, что одновременно может исполняться несколько копий, так как в процедуре разрешен временной и/или событийный контроль. Но при этом память для локальных переменных не выделяется, то есть копии одной и той же процедуры, работающие параллельно, будут "портить" друг другу локальные переменные. Иллюстрацией является практическая невозможность рекурсивных процедур или функций. С этим может столкнуться программист, работавший ранее с процедурными языками.

Синтаксис процедур следующий:

task my task;

input а, b;

inout e;

output d, e;

reg fool, foo2, foo3;

begin

<statements> the set of statements that performs the work of the

task

с = fool; the assignments that initialize d = foo2; the results variables e = foo3; end

endtask

При этом любое число параметров может передаваться в/из процедуры. Вызов (или "разрешение") процедуры производится следующим образом

my task (v, w, х, у, z);

Функция не имеет права вызывать процедуру, а процедура может разрешать другие процедуры и вызывать себя рекурсивно (см. локальные переменные) или вызывать функции.

Системные функции

В примерах данной статьи неоднократно использовались системные функции Smonitor, Sdisplay, Swrite, $finish, Stime. Это малая часть средств, которые предоставляются Verilog системой программисту для анализа результатов моделирования. Благодаря наличию механизма PLI, обеспечивающего подключение исполняемого кода (написанного либо пользователем, либо третьей стороной), число системных функций и задач, которые выполняются с их помощью, очень велико. Основное назначение - это сбор/анализ информации и взаимодействие с системой. Признак системной функции - $. Остановимся на наиболее популярных системных функциях:

$finish - завершение моделирования;

Sstop - переход в интерактивный режим;

Sdisplay, Swrite - вывод данных в stdout (дублируется в лог-файл); ведет себя либо как С функция printf с формат строкой (поддерживаются дополнительные форматы, например %Ь - бинарный), либо как паскалевская процедура write с разделенными запятой аргументами; Sdisplay завершает вывод "переводом строки";

Smonitor - отслеживает изменения аргументов, в конце каадого временного шага печатает при обнаружении изменения значения; формат как у Sdisplay;

Sreadmemb, Sreadmemh - обеспечивают считывание данных (в бинарном или шестнадцатиричном представлении) из файла в память (см. первую часть статьи); формат файла очень простой: в каждой строке либо слово требуемой разрядности, либо конструкция @<адрес загрузки>; очень удобно применять для моделирования ПЗУ;

Ssystem - выполняет команду ОС (вызов С функции systemO);

Sfopen, Sfclose, Sfwrite, Sfmonitor - файловые операции, позволяют производить запись в файлы;

Sdumpfile, Sdumpvars - запись дамп-файлов; позволяют записать изменения сигналов модуля, всего проекта или отдельных в специальном формате для последующего изучения; очень полезный и сильный механизм;

Stime - возвращает время симуляции;

Sitor, Srandom - численные функции, выполняют преобразования или возвращают результат математической функции.

Это малая часть стандартных функций. Полный список следует искать в документации к симулятору. Также есть функции, которые не являются стандартными (в настоящий момент времени), но поставляются в виде отдельных объектных модулей или С кода. Примером таких функций является SutConnectivity, записывающая список соединений модели для последующего просмотра с помощью Undertow (http:/ /www.veritools.com/), или $toggle count, служащая для сбора статистики переключения сигналов

Продолжение следует



(Окончание, начало №1-3/2001)

Verilog - инструмент разработки цифровых электронных схем

Параметры

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

module parity (bus, out); parameter width=8, typ delay=1, modul delay=typ delay*2; wire [width-1:0] bus; wire out;

assign #modul delay out=*bus; endmodule

Данный модуль описывает логику генерации бита четности и может применяться с различной шириной шины и различными задержками. При подключении модуля может сообщаться либо типовая задержка (по которой вычисляется задержка модуля), либо задержка модуля (в случае, когда моделируется нетипичная ситуация).

Включать модуль в иерархию можно следующим образом:

parity U1(bus1,out1); будут использованы значения по умолчанию (width=8, typ delay=1

iodul delay=typ delay*2)

parity #(4,0.5) U2(bus2,out2); ширина шины - 4 бита, типовая задержка 0.5 (задержка в модуле 0.5*2=1)

parity #(16. 1, 5) U3(bus3.out3); ширина шины - 16 бит, типовая задержка 1 (игнорируется), задержка в модуле 5

Иными слезами, конструкция #(фак-тический параметр, фактический параметр, ...) соответствует конструкции тар generic языка VHDL. Может возникнуть путаница между конструкциями временного контроля и параметрами, но. во-первых, зременной контроль и привязка параметров происходит в разных конструкциях языка, и по контексту видно значение знака #, а во-вторых, параметры, как правило, определяют временные задержки внутри модуля. Кроме такого механизма установки параметров, существует механизм

defparam и иерархические имена, позволяющие сгруппировать все фактические параметры в модулях в одном месте вышестоящего модуля. То есть пример можно переписать следующим образом:

module top; модуль верхнего уровн-

parity U1(bus1,out1) parity U2(bus2,out2) parity U3(bus3,out3)

defparam

top.U2.width=4;

top.U2.typ delay=G.5;

top.U3.width=16;

top.U3.modul delay=5;

endmodule

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

Препроцессор языка Verilog (директивы компилятора)

Наряду с механизмом параметров, описанным выше, в языке Verilog существует механизм, сходный с текстовым препроцессором языка С. Этот механизм (по аналогии с С назовем его препроцессором) позволяет проводить предварительную обработку текста до того, как данные будут обработаны симулятором или средством синтеза. Данный механизм обеспечивает условную компиляцию, выполнение макроподстановок, интерфейс с внешней средой. Аналогом условной компиляции Verilog является конструкция if-generate языка VHDL. Для работы препроцессора, а также других директив компилятора, используется символ апострофа "" (не путать с кавычкой в литералах). Наиболее часто применяемые директивы препроцессора -define, include, ifdef, else, endif Таким же образом задаются директивы компилятора не являющиеся директи-вами препроцессора, например "timescale.

Для включения текста из одного файла в другой используется include "Имя Файла" (например, include "dumppins.v"). Следует помнить, что Verilog модули не могут объявляться внутри модуля (не могут быть вложенными), поэтому include можно использовать либо вне модуля, либо включать в модуль код, не содержащий модулей (module.... endmodule).

Использование define для описания текстового макроса можно проиллюстрировать таким образом:

define пс @(negedge elk)

Далее в коде профаммы данный макрос может использоваться следующим образом: always пс ... или а<= пс Ь.

Пример директив условной компиляции может быть следующим-

ifdef teste •define CPUTESTO include "fault/tesTO" else

define CPUTEST1 include "fault/testi" endif

Так как определить макрос можно из командной строки компилятора (опция +define+ NAME ), то данный механизм позволяет использовать конфигурационные скрипты. В настоящее время существуют средства синтеза как не поддерживающие препроцессор (старые или недоделанные версии), так и расширяющие стандартный набор директив. Например, средство синтеза может поддерживать директиву for, что позволяет реализовать конструкцию for-generate языка VHDL.

Конструкции, применяемые для симулирования библиотечных ячеек

Данная статья направлена на то, чтобы осветить поведенческое моделирование и написание такого поведенческого кода, который может быть синтезирован средством синтеза. Кроме этого, в языке существуют предопределенные модули, которые могут быть использованы как структурные элементы нижнего уровня. Однако некоторые их них практически никогда не используются, поскольку они неприменимы для задач разработки СБИС или ПЛИС. Это, например, описания транзисторных ключей, nmos, pmos, mmos, фтоз, cmos. rcmos.

Также существуют предопределенные логические ячейки: and, nand, nor, or, xor, xnor, buf, not, bufifO, bufifl, notifl, notiro. Они совпадают по названию с булевыми функциями и являются двух-входовыми элементами, выполняющими соответствующую функцию: not -инвертор, buf - буфер. Последние четыре элемента имеют вход разрешения и состояние высокого импеданса (z). Но так как любой из этих элементов может быть описан с использованием операторов языка, то смьюл применения данных конструкций определяется предпочтением разработчика.

Например, and U1(out,in1,in2) то же самое, что и out=in1&in2; bufifl U2 (out, in, control) и то же самое, что и ее out=control?in:1bz.

Следует заметить, что для облегчения записи элементы могут подключаться на шину или иметь неименованные включения (instance), но все же использование операторов кажется предпочтительнее, а результат синтеза или поведение модели будут в обоих случаях одинаковые.



Для моделирования библиотечных элементов может применяться табличный механизм UDP (User Defined Primitive). Это несинтезируемая конструкция, похожая по описанию на модуль, но подчиняющаяся более строгим правилам. Назначение UDP - моделировать логику, заданную таблицей истинности. При этом с помощью UDP можно описывать как комбинаторную, так и последовательную логику. UDP может иметь только один выход

primitive and or(out, a1 ,а2,аЗ, Ы ,Ь2); output out;

input а1,а2,аЗ, Ы,Ь2; table

state table information goes here

endtable endprimitive

Как видно, основным элементом UDP является таблица истинности. Ее элементы могут принимать значения представленные в таблице 1.

Количество пробельных символов в описании таблицы не играет роли важен порядок. Пример комбинаторного UDP (мультиплексора);

primitive

multiplexer(mux,control,dataA,dataB ); output mux;

input control, dataA, dataB; table

control dataA dataB mux 01 ?: 1; ? = 0,1,x

0 0?:0;

1 ?1:1; 1 ?0:0;

x 0 0:0;

xi 1:1; endtable endprimitive

Пример последовательного UDP:

primitive srff (q,s,r); output q; input s,r; reg q:

initial q = 1b1; initial statement specifies that output terminal q has a value of 1 at the start of the simulation

Таблица 1

table s r q q+ 10 : ? : 1; fO: 1 Or:? Of :0; 1 1 :? endtable endprimitive

0; 6:

Синтезируемое подмножество языка

Прежде чем вести разговор о синтезируемом подмножестве языка следует остановиться на общих принципах разработки СБИС или ПЛИС с использованием языков высокого уровня. Производитель микросхемы ПЛИС или фабрика, производящая СБИС, предоставляет модель библиотечных элементов, которые могут быть использованы в схеме. Эти библиотеки предназначены для использования в различных областях проектирования (моделирование, синтез, топология кристалла и т. д.) и могут быть выполнены в различных форматах. Один из форматов представляет собой библиотеку элементов, описанных на языке высокого уровня и предназначенных для моделирования. В данной библиотеке содержатся элементы, описанные посредством несин-тезируемых конструкций. В описании библиотечных элементов встречаются не рассмотренные в статье конструкции для описания сквозных задержек распространения (path delay) и механизмы контроля временных параметров (setup, hold time). Сквозные задержки позволяют описать задержку модуля, не вдаваясь в его внутреннюю структуру, и поддерживаются специальными словами языка (specify, specparam, endspecify) и специальным синтаксисом (например, (a,b,c*>x,y,z) = Tin; (d+=>x) = Tout;). A системные функции контроля используются для проверки того, происходят ли изменения сигналов в нухоные моменты времени, например, для того чтобы последовательная логика не попадала в метастабильное состояние. IVIbi не останавливались подробно на этих элементах, поскольку пользователю средств синтеза не нужно описывать библиотечные элементы, а в текстовом описании библио-

Логический 0

Логическая 1

Не определено

Любое значение из 0 1 и х

Не может использоваться в качестве выходного значения

Итерация 0 и 1

Не может использоваться в качестве выходного значения

Без изменения

Может использоваться на выходе только последовательного UOP

Значение, изменяющееся от v до w

V и W могут быть 0, 1, X, ? или b

То же, что и ??

Любое изменение значения на входе

То же, что и 01

Прямой фронт на входе

То же, что и 10

Обратный фронт на входе

Итерация (01), (Ох) и (х1)

Положительный фронт на входе

Итерация (10), (1х)и(хО)

Отрицательный фронт на входе

теки обычно содержится информация о поведении элемента и его временной диаграмме. Можно сказать, что при разработке проекта СБИС или ПЛИС возможно даже не придется вручную подключать/отключать эти элементы в структурном описании и вообще знать об их существовании.

Следующие два элемента разработки предоставляются пользователем -это синтезируемое описание на языке HDL и набор директив для средства синтеза. Также нужен набор средств разработки, включающий в себя симулятор и средство синтеза. Следует остановиться на отличиях синтеза от компиляторов поведенческих языков. Компилятор языка (например, С) детерминированным образом переводит операторы языка в команды машинного языка Синтез переводит последовательные операторы языка HDL в структурную схему, состоящую из библиотечных элементов. Данный процесс больше похож на перебор вариантов и выбор наилучшего, удовлетворяющего временным ограничениям и занимаемой площади. Следствием этого является то, что синтез - это итеративный процесс, в котором результаты предыдущего шага используются для коррекции директив для следующего шага. Методология написания директив синтеза и подход к синтезу схемы, имеющей минимальное количество вентилей и максимальную тактовую частоту, является отдельным вопросом и в статье не рассматривается. Но, в любом случае, предоставляемое пользователем описание на языке HDL должно быть правильным, т е. работоспособным и синтезируемым.

Рассмотрим операции, которые необходимо выполнить для разработки прибора на СБИС или ПЛИС:

1) подготовка синтезируемого поведенческого описания схемы (этому шагу может предшествовать моделирование на С, в среде MatLab или с использованием специализированных средств);

2) написание тестовой оболочки -испытательного стенда (testbench) - в которой проводится полное тестирование всех режимов модели;

3) итеративная процедура синтеза поведенческой модели, результатом которой является структурная схема (netlist) с использованием библиотечных элементов и файл задержек распространения (SDF standard delay file);

4) проверка работоспособности netlista, при этом обычно используется тот же testbench, что и для п. 2. Нарушение работоспособности может быть связано с нарушениями допустимых времен библиотечных элементов, гонками фронтов и пр. В зависимости от опыта разработчика, происходит возврат к п.п. 1-3 или переход к п. 5; также полезно на этом шаге проверить результаты работы средств временного анализа (static timing report) для выяснения "узких мест" - критических путей проекта;

5) процедура размещения и трассировки, которая выполняется специ-



0 1 2 [3] 4



0.0521
Яндекс.Метрика