Verilog - Verilog

Verilog
Парадигма Структурированный
Впервые появился 1984  ( 1984 )
Стабильный выпуск
IEEE 1364-2005 / 9 ноября 2005 г . ; 15 лет назад  ( 2005-11-09 )
Печатная дисциплина Статичный , слабый
Расширения имени файла .v, .vh
Диалекты
Verilog-AMS
Под влиянием
Паскаль , Ада , C , Фортран
Под влиянием
SystemVerilog

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

Обзор

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

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

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

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

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

История

Начало

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

Verilog - это сочетание слов «проверка» и «логика».

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

Verilog 2001

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

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

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

Verilog 2005

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

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

SystemVerilog

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

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

Пример

Ниже приводится простой пример двух триггеров :

module toplevel(clock,reset);
  input clock;
  input reset;

  reg flop1;
  reg flop2;

  always @ (posedge reset or posedge clock)
    if (reset)
      begin
        flop1 <= 0;
        flop2 <= 1;
      end
    else
      begin
        flop1 <= flop2;
        flop2 <= flop1;
      end
endmodule

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

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

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

module Div20x (rst, clk, cet, cep, count, tc);
// TITLE 'Divide-by-20 Counter with enables'
// enable CEP is a clock enable only
// enable CET is a clock enable and
// enables the TC output
// a counter using the Verilog language

parameter size = 5;
parameter length = 20;

input rst; // These inputs/outputs represent
input clk; // connections to the module.
input cet;
input cep;

output [size-1:0] count;
output tc;

reg [size-1:0] count; // Signals assigned
                      // within an always
                      // (or initial)block
                      // must be of type reg

wire tc; // Other signals are of type wire

// The always statement below is a parallel
// execution statement that
// executes any time the signals
// rst or clk transition from low to high

always @ (posedge clk or posedge rst)
  if (rst) // This causes reset of the cntr
    count <= {size{1'b0}};
  else
  if (cet && cep) // Enables both  true
    begin
      if (count == length-1)
        count <= {size{1'b0}};
      else
        count <= count + 1'b1;
    end

// the value of tc is continuously assigned
// the value of the expression
assign tc = (cet && (count == length-1));

endmodule

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

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

Всегда пункт выше иллюстрирует другой тип способа использования, т.е. он выполняет каждый раз , когда какой - либо из объектов в списке ( б или е ) изменения. Когда одно из этих изменений, 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 - Octal 77 (с использованием 6 бит)

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

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

// Mux examples — Three ways to do the same thing.

// The first example uses continuous assignment
wire out;
assign out = sel ? a : b;

// the second example uses a procedure
// to accomplish the same thing.

reg out;
always @(a or b or sel)
  begin
    case(sel)
      1'b0: out = b;
      1'b1: out = a;
    endcase
  end

// Finally — you can use if/else in a
// procedural structure.
reg out;
always @(a or b or sel)
  if (sel)
    out = a;
  else
    out = b;

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

// Transparent latch example

reg latch_out;
always @(gate or din)
  if(gate)
    latch_out = din; // Pass through state
    // Note that the else isn't required here. The variable
    // latch_out will follow the value of din while gate is
    // high. When gate goes low, latch_out will remain constant.

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

reg q;
always @(posedge clk)
  q <= d;

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

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

reg q;
always @(posedge clk or posedge reset)
  if(reset)
    q <= 0;
  else
    q <= d;

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

reg q;
always @(posedge clk or posedge reset or posedge set)
  if(reset)
    q <= 0;
  else
  if(set)
    q <= 1;
  else
    q <= d;

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

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

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

// Basic structure with an EXPLICIT feedback path
always @(posedge clk)
  if(gate)
    q <= d;
  else
    q <= q; // explicit feedback path

// The more common structure ASSUMES the feedback is present
// This is a safe assumption since this is how the
// hardware compiler will interpret it. This structure
// looks much like a latch. The differences are the
// '''@(posedge clk)''' and the non-blocking '''<='''
//
always @(posedge clk)
  if(gate)
    q <= d; // the "else" mux is "implied"

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

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

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

//Examples:
initial
  begin
    a = 1; // Assign a value to reg a at time 0
    #1; // Wait 1 time unit
    b = a; // Assign the value of reg a to reg b
  end

always @(a or b) // Any time a or b CHANGE, run the process
begin
  if (a)
    c = b;
  else
    d = ~b;
end // Done with this block, now return to the top (i.e. the @ event-control)

always @(posedge a)// Run whenever reg a has a low to high change
  a <= b;

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

always
  begin // Always begins executing at time 0 and NEVER stops
    clk = 0; // Set clk to 0
    #1; // Wait for 1 time unit
    clk = 1; // Set clk to 1
    #1; // Wait 1 time unit
  end // Keeps executing — so continue back at the top of the begin

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

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

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

initial forever // Start at time 0 and repeat the begin/end forever
  begin
    clk = 0; // Set clk to 0
    #1; // Wait for 1 time unit
    clk = 1; // Set clk to 1
    #1; // Wait 1 time unit
  end

Вилка / присоединение

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

initial
  fork
    $write("A"); // Print char A
    $write("B"); // Print char B
    begin
      #1; // Wait 1 time unit
      $write("C"); // Print char C
    end
  join

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

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

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

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

initial
  a = 0;

initial
  b = a;

initial
  begin
    #1;
    $display("Value a=%d Value of b=%d",a,b);
  end

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

Операторы

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

Тип оператора Символы оператора Операция выполнена
Побитовое ~ Побитовое НЕ (дополнение до 1)
& Побитовое И
| Побитовое ИЛИ
^ Побитовое исключающее ИЛИ
~ ^ или ^ ~ Побитовое исключающее ИЛИ
Логический ! НЕТ
&& А ТАКЖЕ
|| ИЛИ ЖЕ
Снижение & Уменьшение И
~ & Уменьшение NAND
| Снижение ИЛИ
~ | Сокращение NOR
^ Уменьшение 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 с девятью уровнями.

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

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

  • $ 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() и tf_getlongp() которые используются для записи и чтения аргумента текущей задачи или функции Verilog соответственно.

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

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

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

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

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

Генераторы Verilog

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

Заметки

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

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

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

  • Verilog AUTOs - мета-комментарий с открытым исходным кодом, используемый отраслевыми IP для упрощения поддержки кода Verilog.