Verilog
Verilog, Verilog HDL (англ. Verilog Hardware Description Language) — это язык описания аппаратуры, используемый для описания и моделирования электронных систем. Verilog HDL[3], не следует путать с VHDL (конкурирующий язык), наиболее часто используется в проектировании, верификации и реализации (например, в виде СБИС) аналоговых, цифровых и смешанных электронных систем на различных уровнях абстракции[4].
Разработчики Verilog сделали его синтаксис очень похожим на синтаксис языка C, что упрощает его освоение. Verilog имеет препроцессор, очень похожий на препроцессор языка C, и основные управляющие конструкции «if», «while» также подобны одноимённым конструкциям языка C. Соглашения по форматированию вывода также очень похожи (см. printf).
Следует отметить, что описание аппаратуры, написанное на языке Verilog (как и на других HDL-языках) принято называть программами, но в отличие от общепринятого понятия программы как последовательности инструкций, здесь программа задаёт структуру системы. Также для языка Verilog не применим термин «выполнение программы».
Общие сведения
| Verilog | |
|---|---|
| Класс языка | Язык описания аппаратуры |
| Появился в | 1983-1984 |
| Автор | Phil Moorby, Prabhu Goel |
| Расширение файлов | .v |
| Выпуск | |
| Испытал влияние | Си, Паскаль[2] и Ада[2] |
Обзор
Существует подмножество инструкций языка Verilog, называемое синтезируемым. Модули, которые написаны на этом подмножестве, называют RTL (англ. register transfer level — Уровень регистровых передач). Они могут быть физически реализованы с использованием САПР синтеза. Данные САПР по определённым алгоритмам преобразуют абстрактный исходный код на Verilog в netlist — логически эквивалентное описание, состоящее из элементарных логических примитивов (например, AND, OR, NOT, триггеры), которые доступны в выбранной технологии производства СБИС или программирования БМК и ПЛИС. Дальнейшая обработка netlist в конечном итоге порождает фотошаблоны для литографии или прошивку для FPGA.
История
Verilog был создан Phil Moorby и Prabhu Goel зимой 1983—1984 годов в фирме Automated Integrated Design Systems (с 1985 года Gateway Design Automation) как язык моделирования аппаратуры. В 1990 году Gateway Design Automation была куплена Cadence Design Systems. Компания Cadence имеет права на логические симуляторы Gateway’s Verilog и Verilog-XL simulator.
Во время увеличивающейся популярности языка VHDL, Cadence приняла решение добиться стандартизации языка. Cadence передала Verilog в общественное достояние. Verilog был послан в IEEE и принят как стандарт IEEE 1364—1995 (часто называемый Verilog-95).
Дополнения к языку Verilog-95 были приняты как IEEE 1364—2001 (или Verilog-2001).
Verilog-2001 является значительно обновлённым по сравнению с Verilog-95. Во-первых, он добавил поддержку знаковых переменных (в формате дополнительного кода). Прежде авторам кода приходилось реализовывать знаковые операции с использованием большого количества битовых логических операций. Та же функциональность на Verilog-2001 описывается встроенными операторами языка: +, -, /, *, >>> Был улучшен файловый ввод-вывод. Для улучшения читаемости кодов был немного изменён синтаксис, например always @*, переопределение именованных параметров, объявление заголовков функций, задач и модулей в стиле Си.
Verilog-2001 является самым часто используемым диалектом языка и поддерживается в большинстве коммерческих САПР для электроники (см. EDA).
Verilog 2005 (стандарт IEEE 1364—2005) добавил небольшие исправления, уточнения спецификаций и несколько новых синтаксических конструкций, например, ключевое слово uwire.
Отдельная от стандарта часть, Verilog-AMS, позволяет моделировать аналоговые и аналого-цифровые устройства.
SystemVerilog является надмножеством Verilog-2005, с многими новыми возможностями для верификации и моделирования разработок.
Пример
Программа Hello, world! (не является синтезируемой)
module main;
initial
begin
$display("Hello world!");
$finish;
end
endmodule
Verilog 2001 описание: два простых последовательно соединённых триггера:
module toplevel
(input clock,
input reset,
input d,
output reg flop2
);
reg flop1;
always @ (posedge reset, posedge clock)
if (reset)
{flop1,flop2} <= 2'b00;
else
begin
flop1 <= d;
flop2 <= flop1;
end
endmodule //toplevel
Стандарты
- IEEE Std 1364—1995 — первый стандарт
- IEEE Std 1364—2001 — стандарт на Verilog 2001
- IEEE 1364—2005 — обновлённый стандарт
- IEEE 1800—2005, IEEE 1800—2012] — IEEE Standard for SystemVerilog
- IEEE P1364 — рабочая группа 1364 — бывший разработчик Verilog.
- IEEE P1800 — рабочая группа 1800 — разработчик SystemVerilog и преемник рабочей группы 1364.
Конструкции языка
Verilog содержит два базовых типа данных: wire и reg. Оба эти типа могут принимать 4 возможныe значения при симуляции Verilog программы:
- 0
- 1
- Х — «неизвестное значение». Это значение используется только для симуляции, в реальной аппаратуре будет 0 или 1.
- Z — «состояние высокого сопротивления», то есть отсутствие сигнала.
Тип wire используется для описания цепей, reg для регистров и переменных. Оба эти типа могут также быть использованы при описании многобитовых данных:
wire w1;
wire[31:0] bus; // 32-битовая шина
reg r1;
reg[7:0] bitvector; // 8-битовый регистр
Переменные типа reg имеют начальное значение 'X'. Цепи передают значения между регистрами. Если цепь не присоединена ни к какому регистру, она будет иметь значение 'Z'.
Verilog также содержит массивы, которые позволяют моделировать память:
reg[31:0] memory[0:1023]; // 1024 словa памяти, каждое слово содержит 32 бита.
Кроме этого, Verilog содержит ещё следующие типы данных:
- integer — то же самое, что «reg[31:0]», при этом в операциях учитывается знак (старший бит)
- real
- time
- realtime
Verilog содержит два вида блоков, которые могут производить вычисления: «initial»-блок и «always»-блок.
«initial»-блок определяет, какие действия должны быть сделаны при старте программы. Этот блок не является синтезируемым и обычно используется для тестирования. Например:
module testbench;
reg clock;
reg[31:0] in1, in2;
reg[63:0] out;
// Тестируемый модуль
multiplier mult(clock, in1, in2, out);
initial begin
// Тестовые данные.
in1 = 4;
in2 = 20;
// Подождать, пока результат будет готов.
#10;
// Вывести результат вычислений.
$display("result=%d", out);
$finish();
end
endmodule
Программа может содержать несколько «initial»-блоков, все они исполняются параллельно.
| Тип | Символы | Выполняемая операция |
|---|---|---|
| Побитовые | ~ | Инверсия |
| & | Побитовое AND | |
| | | Побитовое OR | |
| ^ | Побитовое XOR | |
| ~^ или ^~ | Побитовое XNOR (EQU) | |
| Логические | ! | NOT |
| && | AND | |
| || | OR | |
| Редукция | & | Редуцированное AND |
| ~& | Редуцированное NAND | |
| | | Редуцированное OR | |
| ~| | Редуцированное NOR | |
| ^ | Редуцированное XOR | |
| ~^ или ^~ | Редуцированное XNOR | |
| Арифметические | + | Сложение |
| - | Вычитание | |
| - | 2’s complement | |
| * | Умножение | |
| / | Деление | |
| ** | Экспонента (*Verilog-2001) | |
| Отношение | > | Больше |
| < | Меньше | |
| >= | Больше либо равно | |
| <= | Меньше либо равно | |
| == | Логическое равенство | |
| != | Логическое неравно | |
| === | 4-state логическое равенство | |
| !== | 4-state логическое неравно | |
| Сдвиг | >> | Логический сдвиг вправо |
| << | Логический сдвиг влево | |
| >>> | Арифметический сдвиг вправо (*Verilog-2001) | |
| <<< | Арифметический сдвиг влево (*Verilog-2001) | |
| Сцепление | { , } | Сцепление |
| Копирование | {n{m}} | Копирует m значение n раз |
| Условие | ? : | Условие |
Открытое аппаратное обеспечение, использующее Verilog
Список приложений, поддерживающих Verilog
- Quartus II — среда моделирования и отладки; работает, как минимум, под Windows.
- Icarus Verilog — open source — приложение для моделирования и синтеза. Работает под Linux, Windows, Mac OS X, FreeBSD и др. страница проекта
- VCS — среда моделирования и отладки; работает как под Unix, так и под Windows.
- LogicSim — среда моделирования и отладки, работает под Windows.
- Incisive HDL — среда моделирования и отладки; работает как под Unix, так и под Windows.
- ModelSim — среда моделирования и отладки; работает как под Unix, так и под Windows.
- Veritak — редактор, интегрированный компилятор/симулятор, транслятор с VHDL в Verilog, работает под управлением Windows.
- Verilator — open-source высокопроизводительный компилятор Verilog.
- Verilog-Perl — набор Perl-модулей для предобработки и построения других инструментов.
- vmodel — open-source средство для моделирования Verilog в MATLAB, основанное на Verilator.
- Verilog for DMS — набор инструментов для реализации произвольных методов анализа и преобразования в Verilog.
- VSPCompiler — инструмент для компилирования синтезируемого RTL-описания в C/C++/SystemC библиотеку.
- VTOC — инструмент для компилирования синтезируемого RTL-описания в C++/SystemC библиотеку.
- Wave VCD Viewer — программа для просмотра VCD-файлов. Verilog-симулятор может порождать VCD-файл, содержащий результаты моделирования. Wave VCD Viewer позволяет разработчику видеть результаты моделирования в виде временных диаграмм. Программа работает под управлением Windows.
- GTKWave — open-source программа для просмотра временных диаграмм, которая среди прочего позволяет просматривать VCD-файлы.
- Design and Verification Tools (DVT) — IDE для SystemVerilog, Verilog, и VHDL на основе Eclipse.
- TkGate — средство моделирования и симуляции, основанное на Verilog.
См. также
- VHDL
- SystemC
- SystemVerilog
- OpenVera
- Specman E
- JHDL
Примечания
Литература
- Соловьёв В. В. Основы языка проектирования цифровой аппаратуры Verilog. — М.: Горячая линия — Телеком, 2014. — 208 с. — ISBN 978-5-9912-0353-1.
Ссылки
- Reusable-code на Verilog Архивная копия от 14 июля 2014 на Wayback Machine — применение принципа повторного использования кода применительно к языку программирования Verilog. fpga.in.ua
- Симулятор Verilog от Tachyon DA — Компания Tachyon DA открыла код полноценного симулятора Verilog.