Верилог

Язык описания оборудования

Верилог
ПарадигмаСтруктурированный
РазработаноПрабху Гоэл , Фил Мурби и Чи-Лай Хуан
РазработчикИИЭЭ
Впервые появился1984 ( 1984 )
Стабильный релиз
IEEE 1800-2023 / 6 декабря 2023 г. ; 13 месяцев назад ( 2023-12-06 )
Дисциплина печатиСтатичный , слабый
Расширения имени файла.в, .вх
Веб-сайтhttps://ieeexplore.ieee.org/document/10458102
Диалекты
Verilog-AMS
Под влиянием
Паскаль , Ада , Си , Фортран
Под влиянием
СистемаVerilog
  • Программируемая логика/Verilog на Wikibooks

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 использует begin/end вместо фигурных скобок {}) и множество других незначительных различий. Verilog требует, чтобы переменным был задан определенный размер. В C эти размеры выводятся из «типа» переменной (например, целочисленный тип может быть 32 бита).

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

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

Подмножество операторов в языке Verilog являются синтезируемыми . Модули Verilog, которые соответствуют синтезируемому стилю кодирования, известному как RTL ( уровень передачи регистров ), могут быть физически реализованы программным обеспечением синтеза. Программное обеспечение синтеза алгоритмически преобразует (абстрактный) источник Verilog в netlist , логически эквивалентное описание, состоящее только из элементарных логических примитивов (AND, OR, NOT, триггеры и т. д.), которые доступны в определенной технологии FPGA или VLSI . Дальнейшие манипуляции со списком соединений в конечном итоге приводят к чертежу изготовления схемы (например, набору фотошаблонов для ASIC или файлу битового потока для FPGA ).

История

Начало

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

Verilog — это словосочетание слов «verification» (проверка) и «logic» (логика). [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 может быть более кратко описана одним из встроенных операторов: +, -, /, *, >>>. Конструкция generate–endgenerate (похожая на generate–endgenerate в VHDL) позволяет Verilog-2001 управлять экземплярами и инстанцированием операторов с помощью обычных операторов принятия решений (case–if–else). Используя generate–endgenerate, 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 ;    всегда @ ( сброс положенного или синхронизация положенных часов ) если ( сброс ) начало flop1 <= 0 ; flop2 <= 1 ; конец иначе начало flop1 <= flop2 ; flop2 <= flop1 ; конец конецмодуль                         

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

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

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

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

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

... reg a , b , c , d ; wire e ; ... always @( b or e ) begin a = b & e ; b = a | b ; # 5 c = b ; d = # 6 c ^ e ; end                              

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

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

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

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

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

Примеры:

  • 12'h123 – шестнадцатеричное 123 (используется 12 бит)
  • 20'd44 – Десятичное 44 (используется 20 бит – расширение 0 происходит автоматически)
  • 4'b1010 – Двоичное 1010 (использует 4 бита)
  • 6'o77 – восьмеричное 77 (использует 6 бит)

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

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

// Примеры мультиплексирования — три способа сделать одно и то же.// В первом примере используется непрерывное присваивание wire out ; assign out = sel ? a : b ;        // во втором примере используется процедура // для достижения того же самого.reg out ; всегда @( a или b или sel ) begin case ( sel ) 1 'b0 : out = b ; 1 'b1 : out = a ; endcase end                  // Наконец — вы можете использовать if/else в // процедурной структуре. reg out ; always @( a or b or sel ) if ( sel ) out = a ; else out = b ;               

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

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

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

reg q ; всегда @( posedge clk ) q <= d ;      

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

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

reg q ; всегда @( posedge clk или posedge reset ) if ( reset ) q <= 0 ; else q <= d ;              

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

reg q ; всегда @( posedge clk или posedge reset или posedge set ) if ( reset ) q <= 0 ; иначе if ( set ) q <= 1 ; иначе q <= d ;                      

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

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

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

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

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

Начальный и всегда

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

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

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

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

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

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

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

initial forever // Начать с момента 0 и повторять начало/конец вечно begin clk = 0 ; // Установить clk в 0 # 1 ; // Ожидание 1 единицы времени clk = 1 ; // Установить clk в 1 # 1 ; // Ожидание 1 единицы времени end                

Форк/присоединение

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

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

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

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

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

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

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

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

Операторы

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

Тип оператораСимволы операторовОперация выполнена
Побитовый~Побитовое НЕ (дополнение до 1)
&Побитовое И
|Побитовое ИЛИ
^Побитовое исключающее ИЛИ
~^ или ^~Побитовое исключающее ИЛИ
Логичный!НЕТ
&&И
||ИЛИ
Снижение&Сокращение И
~&Сокращение NAND
|Сокращение ИЛИ
~|Сокращение НОР
^Сокращение XOR
~^ или ^~Сокращение XNOR
Арифметика+Добавление
-Вычитание
-дополнение до 2
*Умножение
/Разделение
**Возведение в степень (*Verilog-2001)
Относительный>Больше чем
<Меньше, чем
>=Больше или равно
<=Меньше или равно
==Логическое равенство (битовое значение 1'bX исключается из сравнения)
!=Логическое неравенство (битовое значение 1'bX исключается из сравнения)
===4-х позиционное логическое равенство (битовое значение 1'bX воспринимается как буквальное)
!==4-х позиционное логическое неравенство (битовое значение 1'bX воспринимается как буквальное)
Сдвиг>>Логический сдвиг вправо
<<Логический сдвиг влево
>>>Арифметический сдвиг вправо (*Verilog-2001)
<<<Арифметический сдвиг влево (*Verilog-2001)
Конкатенация{, }Конкатенация
Репликация{н{м}}Повторить значение m n раз
Условный? :Условный

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

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

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

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

  • $display – вывести на экран строку, за которой следует автоматический перевод строки.
  • $write – вывести на экран строку без перевода строки.
  • $swrite – Вывести в переменную строку без перевода строки.
  • $sscanf – Считывает из переменной строку, заданную форматом. (*Verilog-2001)
  • $fopen – Открыть дескриптор файла (чтение или запись)
  • $fdisplay – Вывести строку из файла с последующим автоматическим переводом строки.
  • $fwrite – Вывести в файл строку без перевода строки.
  • $fscanf – Считать из файла строку, заданную форматом. (*Verilog-2001)
  • $fclose – Закрыть и освободить открытый дескриптор файла.
  • $readmemh – считывает содержимое шестнадцатеричного файла в массив памяти.
  • $readmemb – считывает содержимое двоичного файла в массив памяти.
  • $monitor – вывести все перечисленные переменные при изменении любого значения.
  • $time – Значение текущего времени моделирования.
  • $dumpfile – Объявляет имя выходного файла формата VCD ( Value Change Dump ).
  • $dumpvars – Включить и вывести переменные.
  • $dumpports – включить и выгрузить переменные в формате Extended-VCD.
  • $random – возвращает случайное значение.

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

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

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

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

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

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

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

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

Ссылки

  1. ^ Nielsen AA, Der BS, Shin J, Vaidyanathan P, Paralanov V, Strychalski EA, Ross D, Densmore D, Voigt CA (2016). «Автоматизация проектирования генетических схем». Science . 352 (6281): aac7341. doi : 10.1126/science.aac7341 . PMID  27034378.
  2. ^ ab IEEE 1800-2023, Утвержденный IEEE проект стандарта SystemVerilog — унифицированный язык проектирования, спецификации и верификации оборудования, IEEE , 2023
  3. ^ "Изобретатель Verilog получил премию Кауфмана от EDA". EE Times . 7 ноября 2005 г.
  4. ^ Хуан, Чи-Лай; Су, СЙХ «Подходы к компьютерному проектированию логических систем с использованием языка описания оборудования». Труды Международного компьютерного симпозиума 1980 г., Тайбэй, Тайвань, декабрь 1980 г. , стр. 772–79O. OCLC  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 Boston 2003.
  9. ^ Сазерленд, Стюарт (2002). Verilog — 2001. Бостон, Массачусетс: Springer US. стр. 16. doi :10.1007/978-1-4615-1713-9. ISBN 978-1-4613-5691-2. Начальная процедура в Verilog не выполняется до симуляции. Она начинает выполнение в момент времени ноль, когда начинается симуляция, и выполняется параллельно с другими начальными или всегда процедурами. При наличии нескольких начальных процедур не существует определенного порядка активации процедур.
  10. ^ Миллер, Д. Майкл; Торнтон, Митчелл А. (2008). Многозначная логика: концепции и представления . Лекции по синтезу цифровых схем и систем. Том 12. Морган и Клейпул. ISBN 978-1-59829-190-2.
  11. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . стр. 652(25.38) . Получено 12 ноября 2023 г. .
  12. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . стр. 628(25.28) . Получено 12 ноября 2023 г. .
  13. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . стр. 653(25.39) . Получено 25 ноября 2023 г. .
  14. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . стр. 631(25.21) . Получено 25 ноября 2023 г. .
Примечания
  • Стандарт IEEE для языка описания оборудования Verilog . 2006. doi :10.1109/IEEESTD.2006.99495. ISBN 0-7381-4850-4.
  • Стандартный язык описания оборудования Verilog IEEE . 2001. doi :10.1109/IEEESTD.2001.93352. ISBN 0-7381-2826-0.
  • IEC 61691-4 Ed.1 (IEEE STD 1364(TM)-2001): Поведенческие языки. Часть 4. Язык описания оборудования Verilog(C) . 2004. doi :10.1109/IEEESTD.2004.95753. ISBN 2-8318-7675-3.
  • Стандартный язык описания оборудования IEEE, основанный на языке описания оборудования Verilog(R) . 1996. doi :10.1109/IEEESTD.1996.81542. ISBN 978-0-7381-3065-1.
  • Томас, Дональд Э.; Мурби, Филлип Р. (2013). Язык описания оборудования Verilog® (3-е изд.). Springer. ISBN 978-1475724646.
  • Cornell ECE576 Курс, иллюстрирующий конструкции синтеза
  • Бержерон, Яник (2012). Написание тестовых стендов: функциональная проверка моделей HDL (2-е изд.). Springer. ISBN 978-1-4615-0302-6.(Библия испытательного стенда HDL)

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

  • «Стандарт IEEE для языка описания оборудования Verilog». IEEE STD 1364-2005 (пересмотр IEEE STD 1364-2001) : 1– 590. Апрель 2006 г. doi :10.1109/IEEESTD.2006.99495. ISBN 978-0-7381-4851-9.– Официальный стандарт для Verilog 2005 (платный).
  • IEEE P1364 – Рабочая группа по Verilog (неактивна).
  • IEEE P1800 – Рабочая группа по SystemVerilog (заменяет указанную выше).
  • Синтаксис Verilog – Описание синтаксиса в форме Бэкуса-Наура 1995 года . Это предшествовало стандарту IEEE-1364.

Расширения языка

  • Verilog AUTOs — метакомментарий с открытым исходным кодом, используемый в отрасли интеллектуальной собственности для упрощения поддержки кода Verilog.
Взято с "https://en.wikipedia.org/w/index.php?title=Verilog&oldid=1265546598"