Verilog
Verilog — это язык описания аппаратуры (HDL, Hardware Description Language), используемый для моделирования, проектирования и верификации цифровых электронных систем, таких как интегральные схемы (ASIC) и программируемые логические интегральные схемы (ПЛИС, FPGA). Verilog позволяет разработчикам описывать поведение и структуру цифровых схем на различных уровнях абстракции — от алгоритмического до логического и транзисторного.
История
Язык Verilog был разработан компанией Gateway Design Automation в 1984–1985 годах. Его создателем считается инженер Фил Мурби, который стремился создать более удобный и интуитивно понятный инструмент для описания аппаратуры по сравнению с существовавшим на тот момент языком VHDL (VHSIC Hardware Description Language), который отличался излишней сложностью и многословностью.
В 1989 году компания Gateway Design Automation была приобретена корпорацией Cadence Design Systems. Cadence продолжила развитие языка и сделала его одним из ключевых инструментов в своей линейке программного обеспечения для проектирования электроники. В 1990-х годах Verilog стал фактическим стандартом в индустрии, особенно в США, благодаря своей простоте и близости к языку программирования C, что облегчало его освоение инженерами.
Для стандартизации языка и предотвращения монополии Cadence, в 1993 году была сформирована организация Open Verilog International (OVI). В 1995 году Verilog был принят как стандарт IEEE 1364-1995. Последующие версии стандарта (IEEE 1364-2001 и IEEE 1364-2005) добавили множество расширений, включая поддержку аналоговых и смешанных сигналов (Verilog-AMS) и улучшенные возможности для верификации.
В 2009 году Verilog был объединён с языком SystemVerilog, который стал стандартом IEEE 1800-2009. SystemVerilog является надмножеством Verilog и включает в себя объектно-ориентированные возможности, улучшенные конструкции для тестирования и формальной верификации. Несмотря на появление SystemVerilog, классический Verilog (IEEE 1364) продолжает использоваться в учебных целях, для небольших проектов и в унаследованных (legacy) разработках.
Основные характеристики
Уровни абстракции
Verilog позволяет описывать цифровые схемы на трёх основных уровнях:
- Поведенческий (behavioral) уровень: Описание алгоритма работы схемы без указания её конкретной структуры. Используются конструкции, похожие на языки программирования высокого уровня (циклы, условия, присваивания). Этот уровень удобен для начального моделирования и проверки концепций.
- Уровень регистровых передач (RTL, Register Transfer Level): Описание потока данных между регистрами и логических операций, выполняемых над этими данными. RTL-описание является наиболее распространённым для синтеза — преобразования в физическую схему. Основные конструкции —
alwaysблоки с синхронными или асинхронными сигналами. - Логический (gate) уровень: Описание схемы в виде соединения логических вентилей (AND, OR, NOT, XOR) и триггеров. Этот уровень используется для детального моделирования и проверки временных характеристик.
- Транзисторный (switch) уровень: Описание схемы на уровне отдельных транзисторов (MOSFET). Используется редко, в основном для моделирования аналоговых или специальных цифровых блоков.
Модули и порты
Основной единицей проектирования в Verilog является модуль (module). Модуль представляет собой функциональный блок с определёнными входами, выходами и внутренней логикой. Модули могут быть вложены друг в друга, образуя иерархию проекта. Порты модуля делятся на три типа: input, output и inout (двунаправленный).
Типы данных
Verilog использует два основных типа данных для представления сигналов:
wire(провод): Представляет физическое соединение. Значение наwireопределяется непрерывным присваиванием (assign) или соединением с выходом другого модуля.reg(регистр): Представляет переменную, которая хранит значение. Значениеregприсваивается внутри процедурных блоков (always,initial). Важно отметить, чтоregне обязательно соответствует физическому регистру — он может быть синтезирован как комбинационная логика.
Также существуют типы integer, real, time для моделирования и тестовых стендов.
Параллелизм
В отличие от обычных программных языков, Verilog является языком параллельного описания. Все always блоки, assign операторы и экземпляры модулей выполняются одновременно, имитируя параллельную работу аппаратуры. Для синхронизации используются события (изменение сигналов) и тактовые сигналы.
Синтаксис и основные конструкции
Синтаксис Verilog во многом заимствован из языка C. Операторы заканчиваются точкой с запятой, блоки кода выделяются ключевыми словами begin и end, комментарии обозначаются // (однострочные) и / ... / (многострочные).
Непрерывное присваивание (assign)
Используется для описания комбинационной логики. Значение на левой части (обычно wire) непрерывно обновляется при изменении сигналов в правой части.
``verilog assign sum = a ^ b; // XOR assign carry = a & b; // AND ``
Процедурные блоки (always и initial)
initial: Выполняется один раз в начале моделирования. Используется в основном в тестовых стендах для инициализации сигналов.always: Выполняется непрерывно в течение всего времени моделирования. Запускается при изменении сигналов в списке чувствительности (sensitivity list) или по фронту тактового сигнала.
Пример синхронного D-триггера:
``verilog always @(posedge clk) q <= d; ``
Пример комбинационной логики:
``verilog always @(a or b or sel) begin if (sel) y = a; else y = b; end ``
Блокирующие и неблокирующие присваивания
- Блокирующее присваивание (
=): Выполняется последовательно в рамках одногоalwaysблока. Используется для описания комбинационной логики. - Неблокирующее присваивание (
<=): Выполняется параллельно. Все правые части вычисляются одновременно, а присваивание происходит в конце шага моделирования. Используется для описания последовательностной (синхронной) логики, чтобы избежать гонок данных.
Модули и иерархия
Пример объявления модуля:
``verilog module half_adder ( input a, input b, output sum, output carry ); assign sum = a ^ b; assign carry = a & b; endmodule ``
Пример использования модуля в другом проекте:
```verilog module full_adder ( input a, b, cin, output sum, cout ); wire s1, c1, c2;
half_adder HA1 (.a(a), .b(b), .sum(s1), .carry(c1)); half_adder HA2 (.a(s1), .b(cin), .sum(sum), .carry(c2));
assign cout = c1 | c2; endmodule ```
Применение
Verilog является одним из основных инструментов в современной микроэлектронике. Основные области применения:
- Проектирование ПЛИС (FPGA): Verilog используется для создания цифровых схем, реализуемых на FPGA от компаний Xilinx (ныне AMD), Intel (Altera), Lattice Semiconductor и других.
- Проектирование ASIC: Verilog является стандартом для описания заказных интегральных схем. Весь процесс от RTL-описания до физического синтеза и верификации основан на Verilog.
- Создание тестовых стендов (testbenches): На Verilog пишутся программы для автоматического тестирования проектируемых модулей. Тестовые стенды генерируют входные сигналы, проверяют выходные и сравнивают их с ожидаемыми значениями.
- Формальная верификация: С помощью Verilog (и особенно SystemVerilog) описываются свойства и утверждения (assertions), которые проверяются инструментами формальной верификации для доказательства корректности схемы.
- Образование: Verilog широко преподаётся в технических вузах на курсах по цифровой схемотехнике, архитектуре компьютеров и проектированию СБИС.
Критика и ограничения
Несмотря на широкое распространение, Verilog имеет ряд недостатков:
- Сложность синтеза: Не все конструкции Verilog, допустимые для моделирования, могут быть синтезированы в реальную схему. Начинающие разработчики часто пишут «несинтезируемый» код, который работает в симуляторе, но не может быть реализован в кремнии.
- Неоднозначности: Некоторые конструкции Verilog (например, использование блокирующих присваиваний в синхронной логике) могут приводить к неожиданным результатам при синтезе, так как разные инструменты могут интерпретировать их по-разному.
- Отсутствие строгой типизации: По сравнению с VHDL, Verilog менее строг в отношении типов данных, что может приводить к ошибкам на этапе соединения модулей.
- Устаревшие конструкции: Классический Verilog (IEEE 1364-2005) не поддерживает многие современные возможности, такие как объектно-ориентированное тестирование, пакеты и интерфейсы, которые присутствуют в SystemVerilog.
Инструментарий
Для работы с Verilog используется широкий спектр программного обеспечения:
- Симуляторы: ModelSim (Mentor Graphics/Siemens), VCS (Synopsys), Xsim (Xilinx), Icarus Verilog (открытый).
- Синтезаторы: Design Compiler (Synopsys), Vivado (AMD/Xilinx), Quartus Prime (Intel/Altera), Yosys (открытый).
- Среды разработки (IDE): Vivado, Quartus Prime, Libero SoC (Microchip), Visual Studio Code с плагинами.
- Инструменты формальной верификации: Formality (Synopsys), OneSpin (Siemens).
Источники
- IEEE Standard for Verilog Hardware Description Language. IEEE Std 1364-2005.
- Palnitkar, S. (2003). Verilog HDL: A Guide to Digital Design and Synthesis. Sun Microsystems Press.
- Thomas, D., & Moorby, P. (2002). The Verilog Hardware Description Language. Springer.
- Ciletti, M. D. (2010). Advanced Digital Design with the Verilog HDL. Pearson.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →