Открыть сервис

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).

Источники

  1. IEEE Standard for Verilog Hardware Description Language. IEEE Std 1364-2005.
  2. Palnitkar, S. (2003). Verilog HDL: A Guide to Digital Design and Synthesis. Sun Microsystems Press.
  3. Thomas, D., & Moorby, P. (2002). The Verilog Hardware Description Language. Springer.
  4. Ciletti, M. D. (2010). Advanced Digital Design with the Verilog HDL. Pearson.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →