stringtranslate.com

Верилог

Verilog , стандартизированный как IEEE 1364 , представляет собой язык описания аппаратного обеспечения (HDL), используемый для моделирования электронных систем . Чаще всего он используется при проектировании и проверке цифровых схем на уровне абстракции передачи регистров . [ нужна цитация ] Он также используется при проверке аналоговых схем и схем со смешанными сигналами , а также при проектировании генетических схем . [1] В 2009 году стандарт Verilog (IEEE 1364-2005) был объединен со стандартом SystemVerilog , в результате чего был создан стандарт IEEE 1800-2009. С тех пор Verilog официально стал частью языка SystemVerilog. Текущая версия соответствует стандарту IEEE 1800-2023. [2]

Обзор

Языки описания аппаратного обеспечения, такие как Verilog, похожи на языки программирования программного обеспечения , поскольку они включают способы описания времени распространения и силы сигнала (чувствительности). Существует два типа операторов присваивания ; блокирующее присвоение (=) и неблокирующее (<=) присвоение. Неблокирующее присвоение позволяет разработчикам описывать обновление конечного автомата без необходимости объявлять и использовать переменные временного хранения . Поскольку эти концепции являются частью семантики языка Verilog, разработчики могут быстро писать описания больших схем в относительно компактной и лаконичной форме. На момент появления Verilog (1984 г.) Verilog представлял собой огромное повышение производительности для разработчиков схем, которые уже использовали программное обеспечение для графического захвата схем и специально написанные программы для документирования и моделирования электронных схем .

Разработчики Verilog хотели создать язык с синтаксисом, похожим на язык программирования C , который уже широко использовался при разработке инженерного программного обеспечения . Как и C, Verilog чувствителен к регистру и имеет базовый препроцессор (хотя и менее сложный, чем у ANSI C/C++). Ключевые слова потока управления (if/else, for, while, case и т. д.) эквивалентны, а приоритет операторов совместим с C. Синтаксические различия включают в себя: требуемую разрядность для объявлений переменных, разграничение процедурных блоков (Verilog использует начало /end вместо фигурных скобок {}) и множество других незначительных отличий. Verilog требует, чтобы переменным был задан определенный размер. В C эти размеры выводятся из «типа» переменной (например, целочисленный тип может быть 32 бита).

Проект Verilog состоит из иерархии модулей . Модули инкапсулируют иерархию дизайна и взаимодействуют с другими модулями через набор объявленных входных, выходных и двунаправленных портов. Внутри модуль может содержать любую комбинацию следующих элементов: объявления сетей/переменных (wire, reg, целочисленные и т. д.), блоки параллельных и последовательных операторов и экземпляры других модулей (подиерархии). Последовательные операторы помещаются внутри блока начала/конца и выполняются в последовательном порядке внутри блока. Однако сами блоки выполняются одновременно, что делает Verilog языком потоков данных .

Концепция «провода» Verilog состоит как из значений сигналов (4 состояния: «1, 0, плавающий, неопределенный»), так и из уровней сигнала (сильный, слабый и т. д.). Эта система позволяет абстрактно моделировать общие сигнальные линии, когда несколько источников управляют общей сетью. Если провод имеет несколько драйверов, (читаемое) значение провода определяется функцией исходных драйверов и их мощности.

Подмножество операторов языка Verilog является синтезируемым . Модули Verilog, соответствующие синтезируемому стилю кодирования, известному как RTL ( уровень передачи регистров ), могут быть физически реализованы с помощью программного обеспечения синтеза. Программное обеспечение синтеза алгоритмически преобразует (абстрактный) источник Verilog в список соединений , логически эквивалентное описание, состоящее только из элементарных логических примитивов (И, ИЛИ, НЕ, триггеры и т. д.), которые доступны в конкретной технологии FPGA или СБИС . Дальнейшие манипуляции со списком соединений в конечном итоге приводят к созданию схемы изготовления схемы (например, набора фотомаски для ASIC или файла битового потока для FPGA ).

История

Начало

Verilog был создан Прабху Гоэлем , Филом Мурби и Чи-Лай Хуангом в период с конца 1983 по начало 1984 года. [3] Чи-Лай Хуанг ранее работал над описанием аппаратного обеспечения LALSD, языком, разработанным профессором СИХ Су для своей докторской работы. [4] Правообладателем этого процесса, который на тот момент являлся собственностью компании, была компания «Automated Integrated Design Systems» (позже переименованная в 1985 году в Gateway Design Automation ). Gateway Design Automation была приобретена Cadence Design Systems в 1990 году. Теперь Cadence обладает полными правами собственности на Verilog компании Gateway и Verilog-XL, HDL-симулятор, который станет фактическим стандартом ( логических симуляторов Verilog ) на следующее десятилетие. Первоначально Verilog предназначался только для описания и моделирования; автоматический синтез подмножеств языка в физически реализуемые структуры (вентили и т. д.) был разработан после того, как язык получил широкое распространение.

Verilog — это сочетание слов «проверка» и «логика». [5]

Верилог-95

В связи с растущим успехом VHDL в то время компания Cadence решила сделать этот язык доступным для открытой стандартизации . Cadence передала Verilog в общественное достояние в рамках организации Open Verilog International (OVI) (теперь известной как Accellera ). Позже Verilog был представлен IEEE и стал стандартом IEEE 1364-1995, обычно называемым Verilog-95.

В то же время Cadence инициировала создание Verilog-A , чтобы обеспечить поддержку стандартов в своем аналоговом симуляторе Spectre . Verilog-A никогда не задумывался как отдельный язык и является подмножеством Verilog-AMS , включающим Verilog-95.

Верилог 2001

Расширения Verilog-95 были отправлены обратно в IEEE, чтобы устранить недостатки, обнаруженные пользователями в исходном стандарте Verilog. Эти расширения стали стандартом IEEE 1364-2001, известным как Verilog-2001.

Verilog-2001 представляет собой значительное обновление Verilog-95. Во-первых, он добавляет явную поддержку цепей и переменных со знаком (дополнения до двух). Раньше авторам кода приходилось выполнять знаковые операции, используя неудобные манипуляции на уровне битов (например, бит выполнения простого 8-битного сложения требовал явного описания булевой алгебры для определения его правильного значения). Эту же функцию в Verilog-2001 можно более кратко описать одним из встроенных операторов: +, -, /, *, >>>. Конструкция генерации-конца генерации (аналогичная конструкции генерации-конца генерации VHDL) позволяет Verilog-2001 управлять созданием экземпляров и операторов с помощью обычных операторов принятия решения (case-if-else). Используя функцию генерации-конца генерации, Verilog-2001 может создавать экземпляры массива экземпляров, контролируя соединение отдельных экземпляров. Файловый ввод-вывод был улучшен за счет нескольких новых системных задач. И, наконец, было внесено несколько синтаксических дополнений для улучшения читаемости кода (например, всегда, @*, переопределение именованного параметра, объявление заголовка функции/задачи/модуля в стиле C).

Verilog-2001 — это версия Verilog, поддерживаемая большинством коммерческих пакетов программного обеспечения EDA .

Верилог 2005

Не путать с SystemVerilog , Verilog 2005 ( стандарт IEEE 1364-2005) состоит из незначительных исправлений, уточнений спецификаций и нескольких новых языковых функций (таких как ключевое слово uwire).

Отдельная часть стандарта Verilog, Verilog-AMS , пытается интегрировать моделирование аналоговых и смешанных сигналов с традиционным Verilog.

СистемаVerilog

Появление языков проверки оборудования, таких как OpenVera и e-язык Verisity, стимулировало разработку Superlog компанией Co-Design Automation Inc (приобретенной Synopsys ). Основы Superlog и Vera были переданы в дар компании Accellera , которая позже стала стандартом IEEE P1800-2005: SystemVerilog.

SystemVerilog — это расширенная версия Verilog-2005 со множеством новых функций и возможностей, облегчающих проверку и моделирование проекта. В 2009 году языковые стандарты SystemVerilog и Verilog были объединены в SystemVerilog 2009 (стандарт IEEE 1800-2009).

обновления с 2009 года

Стандарт SystemVerilog впоследствии обновлялся в 2012, [6], 2017, [7] и последний раз в декабре 2023 года. [2]

Пример

Ниже приведен простой пример двух шлепанцев :

модуль верхнего уровня ( часы , сброс ); входные часы ; сброс входа ;      рег флоп1 ; рег флоп2 ;    всегда @ ( сброс posege или часы posege ), если ( сброс ) start flop1 <= 0 ; флоп2 <= 1 ; конец еще начало флоп1 <= флоп2 ; флоп2 <= флоп1 ; Конечный модуль                         

Оператор <=в Verilog — это еще один аспект того, что он является языком описания аппаратного обеспечения в отличие от обычного процедурного языка. Это известно как «неблокирующее» назначение. Его действие не регистрируется до тех пор, пока не будет выполнен блок Always. Это означает, что порядок присваиваний не имеет значения и даст один и тот же результат: flop1 и flop2 будут менять местами значения каждый такт.

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

Ниже приведен пример схемы счетчика :

модуль Div20x ( rst , clk , cet , cep , count , tc ); // НАЗВАНИЕ 'Счетчик деления на 20 с разрешениями' // включить CEP - это только разрешение часов // включить CET - это разрешение часов и // включить выход TC // счетчик, использующий язык Verilog       размер параметра = 5 ; длина параметра = 20 ;      введите сначала ; // Эти входы/выходы представляют вход clk ; // подключения к модулю. входной набор ; введите cep ;      вывод [ размер - 1 : 0 ] счетчик ; вывод ТК ;   reg [ размер - 1 : 0 ] count ; // Сигналы, назначенные // внутри всегда // (или начального) блока // должны быть типа reg      провод ТК ; // Остальные сигналы относятся к проводному типу  // Оператор Always, представленный ниже, является оператором параллельного // выполнения, который // выполняется каждый раз, когда сигналы // rst или clk переходят от низкого уровня к высокому.всегда @ ( posege clk или posege rst ) if ( rst ) // Это вызывает сброс счетчика cntr < = { size { 1 'b0 }}; else if ( cet && cep ) // Включает оба true start if ( count == length - 1 ) count <= { size { 1 'b0 }}; иначе count <= count + 1 'b1 ; конец                                 // значение tc присваивается непрерывно // значение выражения Assign tc = ( cet && ( count == length - 1 ));       конечный модуль

Пример задержки:

... reg a , b , c , d ; провод е ; ... всегда @( b или e ) Begin a = b & e ; б = а | б ; # 5 с = б ; д знак равно # 6 с ^ е ; конец                              

Предложение Always выше иллюстрирует другой тип использования метода, т.е. он выполняется всякий раз, когда изменяется какой-либо из объектов в списке ( b или e ). При одном из этих изменений a немедленно присваивается новое значение, а из-за назначения блокировки впоследствии b присваивается новое значение (с учетом нового значения a ). После задержки в 5 единиц времени c присваивается значение b , а значение c ^ e скрывается в невидимом хранилище. Затем, спустя еще 6 единиц времени, d присваивается спрятанное значение.

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

Определение констант

Определение констант в Verilog поддерживает добавление параметра ширины. Основной синтаксис:

< Ширина в битах >'< основная буква >< число >

Примеры:

Синтезируемые конструкции

В Verilog есть несколько операторов, не имеющих аналогов на реальном оборудовании, например команда $display. Однако представленные здесь примеры представляют собой классическое (и ограниченное) подмножество языка, имеющее прямое сопоставление с реальными вентилями.

// Примеры мультиплексирования — три способа сделать одно и то же.// В первом примере используется непрерывное присваивание out ; назначить выход = выбрать ? а : б ;        // во втором примере используется процедура , // выполняющая то же самое.зарегистрируйтесь ;всегда @( a или b или sel ) Begin Case ( sel ) 1 'b0 : out = b ; 1 'b1 : out = a ; конец конца                  // Наконец, вы можете использовать if/else в // процедурной структуре. зарегистрируйтесь ;всегда @( a или b или sel ) , если ( sel ) out = a ; еще выход = б ;               

Следующая интересная конструкция — прозрачная защелка ; он передает входной сигнал на выход, когда сигнал стробирования установлен на «сквозной», захватывает входной сигнал и сохраняет его при переходе сигнала стробирования на «удержание». Выходной сигнал будет оставаться стабильным независимо от входного сигнала, пока затвор установлен в положение «удержание». В приведенном ниже примере «сквозной» уровень ворот будет тогда, когда значение предложения if истинно, т.е. ворота = 1. Это читается как «если ворота истинны, сигнал подается на latch_out непрерывно». Если предложение if ложно, последнее значение в latch_out останется и не зависит от значения din.

// Пример прозрачной фиксацииreg latch_out ; всегда @( gate или din ), если ( gate ) latch_out = din ; // Прохождение состояния // Обратите внимание, что else здесь не требуется. Переменная // latch_out будет следовать значению din, пока ворота // находятся на высоком уровне. Когда ворота становятся низкими, latch_out останется постоянным.            

Триггер – следующий важный шаблон; в Verilog D-флоп является самым простым, и его можно смоделировать как:

рег q ; всегда @( posege clk ) q <= d ;      

Важным моментом, на который следует обратить внимание в этом примере, является использование неблокирующего присваивания. Основное практическое правило — использовать <= , когда в предложении Always есть оператор posege или negedge .

Вариант D-флопа — с асинхронным сбросом; существует соглашение, согласно которому состояние сброса будет первым предложением if в операторе.

рег q ; всегда @( posege clk или posege reset ), если ( reset ) q <= 0 ; иначе q <= d ;              

Следующий вариант включает в себя как асинхронный сброс, так и асинхронное условие установки; снова вступает в силу соглашение, т.е. за термином сброса следует установленный термин.

рег q ; всегда @( posege clk или posege reset или posege set ) , если ( reset ) q <= 0 ; иначе , если ( установить ) q <= 1 ; иначе q <= d ;                      

Примечание. Если эта модель используется для моделирования триггера установки/сброса, могут возникнуть ошибки моделирования. Рассмотрим следующую тестовую последовательность событий. 1) сброс становится высоким 2) clk становится высоким 3) set становится высоким 4) clk снова становится высоким 5) сброс переходит в низкий уровень, а затем 6) устанавливается низкий уровень. Предположим, что установка отсутствует, и удерживайте нарушения.

В этом примере оператор Always @ сначала будет выполняться при возникновении нарастающего фронта сброса, что приведет к присвоению q значению 0. В следующий раз, когда блок Always будет выполняться, будет нарастающий фронт clk, который снова будет удерживать q на значении 0. Затем блок Always выполняется, когда set становится высоким, что, поскольку сброс имеет высокий уровень, заставляет q оставаться на уровне 0. Это условие может быть правильным, а может и не быть, в зависимости от фактического триггера. Однако это не главная проблема данной модели. Обратите внимание, что когда значение сброса становится низким, этот набор все еще остается высоким. В реальном триггере это приведет к тому, что выходной сигнал перейдет в 1. Однако в этой модели этого не произойдет, поскольку блок Always запускается нарастающими фронтами установки и сброса, а не уровнями. Для триггеров установки/сброса может потребоваться другой подход.

Последний базовый вариант — это тот, который реализует D-флоп с мультиплексором, подающим на его вход. Мультиплексор имеет d-вход и обратную связь от самого флопа. Это обеспечивает функцию стробируемой нагрузки.

// Базовая структура с ЯВНЫМ путем обратной связи всегда @( posege clk ) if ( gate ) q <= d ; иначе q <= q ; // явный путь обратной связи           // Более распространенная структура ПРЕДПОЛАГАЕТ, что обратная связь присутствует // Это безопасное предположение, поскольку именно так ее // интерпретирует аппаратный компилятор. Эта структура // очень похожа на защелку. Различия заключаются в // '''@(posege clk)''' и неблокирующем '''<=''' // всегда @( posege clk ) if ( gate ) q <= d ; // мультиплексор «else» «подразумевается»       

Обратите внимание, что в этом описании не упоминаются «начальные» блоки. В этой структуре существует разделение между инструментами синтеза FPGA и ASIC. Инструменты FPGA допускают начальные блоки, в которых устанавливаются значения регистров вместо использования сигнала «сброса». Инструменты синтеза ASIC не поддерживают такое утверждение. Причина в том, что исходное состояние FPGA загружается в таблицы памяти FPGA. ASIC — это реальная аппаратная реализация.

Первоначально и всегда

Существует два отдельных способа объявления процесса Verilog. Это ключевые слова всегда и начальные . Ключевое слово всегда указывает на автономный процесс. Начальное ключевое слово указывает , что процесс выполняется ровно один раз. Обе конструкции начинают выполнение во время симулятора 0 и обе выполняются до конца блока. Как только блок Always достиг своего конца, он перепланируется (снова). Распространенным заблуждением является мнение, что начальный блок будет выполняться раньше блока Always. На самом деле, лучше думать о начальном блоке как о частном случае блока Always , который завершается после первого завершения.

//Примеры: начальное начало a = 1 ; // Присвоение значения регистру a в момент времени 0 # 1 ; // Ожидание 1 единица времени b = a ; // Присваиваем значение reg a концу reg b            всегда @( a или b ) // Каждый раз, когда a или b ИЗМЕНЯЕТСЯ, запуск процесса начинается, если ( a ) c = b ; иначе d = ~ b ; end // Закончили с этим блоком, теперь возвращаемся наверх (т.е. к @ event-control)              всегда @( posege a ) // Запускается всякий раз, когда регистр a имеет изменение от низкого к высокому a <= b ;     

Это классическое использование этих двух ключевых слов, но есть и два важных дополнительных применения. Наиболее распространенным из них является ключевое слово всегда без списка чувствительности @(...) . Всегда можно использовать, как показано ниже:

всегда начинать // Всегда начинать выполнение в момент 0 и НИКОГДА не останавливать clk = 0 ; // Установите clk в 0 # 1 ; // Ждем 1 единицу времени clk = 1 ; // Установите clk в 1 # 1 ; // Ждем конца 1 единицу времени // Продолжаем выполнение — поэтому продолжаем с начала                

Ключевое слово Always действует аналогично конструкции языка C while(1) {..} в том смысле, что оно будет выполняться вечно.

Другое интересное исключение — использование ключевого слова «initial» с добавлением ключевого слова «forever» .

Пример ниже функционально идентичен приведенному выше примеру Always .

начальный навсегда // Начинаем в момент времени 0 и повторяем начало/конец вечно. Begin clk = 0 ; // Установите clk в 0 # 1 ; // Ждем 1 единицу времени clk = 1 ; // Установите clk в 1 # 1 ; // Ожидание окончания 1 единицы времени                

Разветвление/присоединение

Пара fork /join используется Verilog для создания параллельных процессов. Все операторы (или блоки) между парой разветвления/объединения начинают выполнение одновременно после того, как поток выполнения достигает разветвления . Выполнение продолжается после соединения после завершения самого продолжительного оператора или блока между разветвлением и соединением .

начальная вилка $write ( "A" ); // Печать символа A $write ( "B" ); // Печать символа B начало # 1 ; // Подождем 1 единицу времени $write ( "C" ); // Печать символа C end join            

Как написано выше, можно распечатать последовательности «ABC» или «BAC». Порядок симуляции между первой $write и второй $write зависит от реализации симулятора и может быть целенаправленно рандомизирован симулятором. Это позволяет моделировать как случайные условия гонки, так и намеренное недетерминированное поведение.

Обратите внимание, что VHDL не может динамически создавать несколько процессов, таких как Verilog. [8]

Условия гонки

Порядок выполнения в Verilog не всегда гарантируется. Лучше всего это можно проиллюстрировать классическим примером. Рассмотрим фрагмент кода ниже:

начальный а = 0 ;   начальный б = а ;   начальное начало 1 ; $display ( "Значение a=%d Значение b=%d" , a , b ); конец    

Что будет распечатано для значений a и b? В зависимости от порядка выполнения исходных блоков это может быть ноль и ноль или попеременно ноль и какое-то другое произвольное неинициализированное значение. Оператор $display всегда будет выполняться после завершения обоих блоков присваивания из-за задержки №1.

Операторы

Примечание. Эти операторы показаны не в порядке приоритета.

Четырехзначная логика

Стандарт IEEE 1364 определяет четырехзначную логику с четырьмя состояниями: 0, 1, Z ( высокое сопротивление ) и X (неизвестное логическое значение). Для конкурирующего VHDL существует специальный стандарт многозначной логики под названием IEEE 1164 с девятью уровнями. [9]

Системные задачи

Доступны системные задачи для выполнения простых операций ввода-вывода и различных функций измерения конструкции во время моделирования. Все системные задачи имеют префикс $ , чтобы отличить их от пользовательских задач и функций. В этом разделе представлен краткий список наиболее часто используемых задач. Это ни в коем случае не полный список.

Программный языковой интерфейс (PLI)

PLI предоставляет программисту механизм передачи управления от Verilog к программной функции, написанной на языке C. Он официально признан устаревшим стандартом IEEE Std 1364-2005 в пользу нового процедурного интерфейса Verilog , который полностью заменяет PLI.

PLI (теперь VPI) позволяет Verilog взаимодействовать с другими программами, написанными на языке C, такими как тестовые программы , симуляторы набора команд микроконтроллера , отладчики и так далее. Например, он предоставляет функции C [10] и [11] , которые используются для записи и чтения 64-битного целочисленного аргумента текущей задачи или функции Verilog соответственно. Для 32-битных целых чисел используются [12] и [13] .tf_putlongp() tf_getlongp()tf_putp()tf_getp()

Программное обеспечение для моделирования

Информацию о симуляторах Verilog см. в списке симуляторов Verilog .

Смотрите также

Дополнительный материал

Похожие языки

Рекомендации

  1. ^ Нильсен А.А., Дер Б.С., Шин Дж., Вайдьянатан П., Параланов В., Стрыхальский Э.А., Росс Д., Денсмор Д., Фойгт CA (2016). «Автоматизация проектирования генетических схем». Наука . 352 (6281): аас7341. дои : 10.1126/science.aac7341 . ПМИД  27034378.
  2. ^ ab IEEE 1800-2023, Утвержденный IEEE проект стандарта для SystemVerilog — унифицированный язык проектирования, спецификации и проверки аппаратного обеспечения, IEEE , 2023 г.
  3. ^ "Изобретатель Verilog получил награду Кауфмана от EDA" . ЭЭ Таймс . 7 ноября 2005 г.
  4. ^ Хуан, Чи-Лай; Су, С.И.Х. «Подходы к проектированию систем автоматизированной логики с использованием языка описания аппаратного обеспечения». Материалы Международного компьютерного симпозиума 1980 г., Тайбэй, Тайвань, декабрь 1980 г. стр. 772–79О. ОСЛК  696254754.
  5. ^ «Устная история Филипа Рэймонда «Фила» Мурби» (PDF) . Музей истории компьютеров. 22 апреля 2013 г. стр. 23–25.
  6. ^ IEEE 1800-2012, IEEE , 2012 г.
  7. ^ IEEE 1800-2017, IEEE , 2017 г.
  8. ^ Каммингс, Клиффорд Э. (2003). «SystemVerilog – это слияние Verilog и VHDL?» (PDF) . SNUG Бостон 2003.
  9. ^ Миллер, Д. Майкл; Торнтон, Митчелл А. (2008). Многозначная логика: понятия и представления . Обобщающие лекции по цифровым схемам и системам. Том. 12. Морган и Клейпул. ISBN 978-1-59829-190-2.
  10. ^ «Стандартный язык описания оборудования Verilog® IEEE» (PDF) . п. 652(25,38) . Проверено 12 ноября 2023 г.
  11. ^ «Стандартный язык описания оборудования Verilog® IEEE» (PDF) . п. 628(25,28) . Проверено 12 ноября 2023 г.
  12. ^ «Стандартный язык описания оборудования Verilog® IEEE» (PDF) . п. 653(25,39) . Проверено 25 ноября 2023 г.
  13. ^ «Стандартный язык описания оборудования Verilog® IEEE» (PDF) . п. 631(25,21) . Проверено 25 ноября 2023 г.
Примечания

Внешние ссылки

Разработка стандартов

Языковые расширения