Поиск…


замечания

Verilog - это язык аппаратного описания (HDL), который используется для проектирования, моделирования и проверки цифровой схемы на уровне поведения или регистрации. Примечательно по причинам, отличающим его от «традиционных» языков программирования:

  • Существует два типа назначения, блокировка и неблокирование, каждый из которых имеет свои собственные применения и семантику.
  • Переменные должны быть объявлены как однобитовые или с явной шириной.
  • Конструкции являются иерархическими, с возможностью создания модулей, которые имеют желаемое поведение.
  • В симуляции (не типично в синтезе) переменные wire могут находиться в одном из четырех состояний: 0, 1, плавающие ( z ) и неопределенные ( x ).

Версии

Версия Дата выхода
Verilog IEEE-1364-1995 1995-01-01
Verilog IEEE-1364-2001 2001-09-28
Verilog IEEE-1364.1-2002 2002-12-18
Verilog IEEE-1364-2005 2006-04-07
SystemVerilog IEEE-1800-2009 2009-12-11
SystemVerilog IEEE-1800-2012 2013-02-21

Установка или настройка

Подробные инструкции по установке или установке Verilog зависят от инструмента, который вы используете, поскольку существует множество инструментов Verilog.

Вступление

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

  • жесткость
    Электронная схема - физический объект, имеющий фиксированную структуру, и Verilog приспособлен для этого. Модули (модуль), порты (вход / выход / вход), соединения (провода), блоки (@ всегда), регистры (рег) фиксируются во время компиляции. Количество объектов и межсоединений не изменяется динамически. На верхнем уровне всегда присутствует «модуль», представляющий структуру микросхемы (для синтеза) и один на уровне системы для проверки.
  • параллелизм
    Собственные одновременные операции в физическом чипе имитируются на языке всегда (большинство commmon), начальных и fork / join блоков.
  module top();
  reg r1,r2,r3,r4; // 1-bit registers
    initial
    begin
      r1 <= 0 ;
    end
    initial
    begin
      fork
         r2 <= 0 ;
         r3 <= 0 ;
      join
    end
     always @(r4)
        r4 <= 0 ;
 endmodule

Все приведенные выше операторы выполняются параллельно в одном и том же блоке времени.

  • Синхронизация и синхронизация
    Verilog поддерживает различные конструкции для описания временного характера схем. Сроки и задержки в схемах могут быть реализованы в Verilog, например, конструкциями #delay. Точно так же Verilog также подходит для синхронных и асинхронных схем и компонентов, таких как flops, latches и комбинаторная логика, используя различные конструкции, например «всегда». Набор блоков также может быть синхронизирован через общий тактовый сигнал, или блок может запускаться на основе определенного набора входов.

    #10   ;                 // delay for 10 time units
    always @(posedge clk )  // synchronous 
    always @(sig1 or sig2 ) // combinatorial logic  
    @(posedge event1)       // wait for post edge transition of event1
    wait (signal  == 1)     // wait for signal to be 1
    
  • неопределенность
    Verilog поддерживает некоторую неопределенность, присущую электронным схемам. «X» используется для представления неизвестного состояния схемы. «Z» используется для представления неуправляемого состояния схемы.

    reg1 = 1'bx;
    reg2 = 1'bz;
    
  • абстракция
    Verilog поддерживает проектирование на разных уровнях абстракции. Наивысшим уровнем абстракции для дизайна является уровень передачи Resister (RTL), следующий из которых - уровень ворот и самый низкий уровень ячейки (User Define Primitives), наиболее часто используемая абстракция RTL. Verilog также поддерживает поведенческий уровень абстракции без учета структурной реализации дизайна, в основном используемой для проверки.

 // Example of a D flip flop at RTL abstraction
module dff (
 clk    , // Clock Input
 reset  , // Reset input
 d       , // Data Input
 q        // Q output
 );
 //-----------Input Ports---------------
 input d, clk, reset ;

 //-----------Output Ports---------------
 output q;

 reg q;

 always @ ( posedge clk)
 if (~reset) begin
   q <= 1'b0;
 end  else begin
   q <= d;
 end

endmodule


// And gate model based at Gate level abstraction 
module and(input x,input y,output o);

wire  w;
// Two instantiations of the module NAND
nand U1(w,x, y); 
nand U2(o, w, w); 

endmodule

// Gate modeled at Cell-level Abstraction
primitive udp_and(
a, // declare three ports
b,
c 
);
output a;   // Outputs
input b,c;  // Inputs 

// UDP function code here
// A = B & C;
table
 // B  C    : A 
    1  1    : 1;
    0  1    : 0;
    1  0    : 0;
    0  0    : 0;
endtable

endprimitive

Для Verilog существует три основных варианта использования. Они определяют структуру кода и его интерпретацию, а также определяют используемые наборы инструментов. Все три приложения необходимы для успешной реализации любого проекта Verilog.

  1. Физический дизайн / Back-end
    Здесь Verilog используется, чтобы в первую очередь рассматривать дизайн как матрицу взаимосвязанных ворот, реализующих логический дизайн. RTL / logic / Design проходит через различные этапы синтеза -> размещение -> построение дерева часов -> маршрутизация -> DRC -> LVS -> на ленту. Точные этапы и последовательности варьируются в зависимости от точного характера реализации.
  2. моделирование
    В этом прецеденте основной задачей является создание тестовых векторов для проверки дизайна в соответствии со спецификацией. Код, написанный в этом случае, не обязательно должен быть синтезирован, и он остается в сфере проверки. Код здесь более похож на общие программные структуры, такие как / while / do loops и т. Д.
  3. дизайн
    Дизайн включает в себя реализацию спецификации схемы, как правило, на уровне абстракции RTL. Затем передается код Verilog для проверки, и полностью проверенный код предоставляется для физической реализации. Код написан с использованием только синтезируемых конструкций Verilog. Определенный стиль кодирования RTL может привести к симуляции и несоответствию синтеза, и необходимо избегать осторожности, чтобы избежать этого.

Существует два основных потока реализации. Они также повлияют на то, как написан и реализован код Verilog. Определенные стили кодирования и определенные структуры более подходят в одном потоке над другим.

  • ASIC Flow (специализированная интегральная схема)
  • FPGA Flow (программируемая по полю матрица) - включает FPGA и CPLD

Привет, мир

В этом примере используется компилятор icarus verilog.

Шаг 1. Создайте файл с именем hello.v

module myModule();

initial
  begin
    $display("Hello World!");   // This will display a message
    $finish ; // This causes the simulation to end.  Without, it would go on..and on.
  end

endmodule

Шаг 2. Мы скомпилируем файл .v с помощью icarus:

>iverilog -o hello.vvp hello.v

Переключатель -o назначает имя выходному объекту. Без этого переключателя выходной файл будет называться a.out. Hello.v указывает исходный файл для компиляции. Когда вы компилируете этот исходный код, не должно быть практически никакого выхода, если не будут ошибки.

Шаг 3. Вы готовы имитировать программу Hello World verilog. Чтобы сделать это, вызовите как таковой:

>vvp hello.vvp 
Hello World!
>

Установка компилятора Icarus Verilog для Mac OSX Sierra

  1. Установите Xcode из App Store.
  2. Установите инструменты для разработчиков Xcode
> xcode-select --install

Это обеспечит основные инструменты командной строки, такие как gcc и make

  1. Установите Mac-порты https://www.macports.org/install.php

Установочный пакет OSX Sierra предоставит открытый метод установки и обновления дополнительных пакетов программного обеспечения на платформе Mac. Подумайте, yum или apt-get для Mac.

  1. Установка icarus с использованием портов Mac
> sudo port install iverilog
  1. Проверьте установку из командной строки
$ iverilog
iverilog: no source files.

Usage: iverilog [-ESvV] [-B base] [-c cmdfile|-f cmdfile]
                [-g1995|-g2001|-g2005] [-g<feature>]
                [-D macro[=defn]] [-I includedir] [-M depfile] [-m module]
                [-N file] [-o filename] [-p flag=value]
                [-s topmodule] [-t target] [-T min|typ|max]
                [-W class] [-y dir] [-Y suf] source_file(s)

See the man page for details.
$

Теперь вы готовы скомпилировать и смоделировать свой первый файл Verilog на Mac.

Установите GTKWave для графического отображения данных моделирования на Mac OSx Sierra

GTKWave - полнофункциональный графический пакет для просмотра, который поддерживает несколько графических стандартов хранения данных, но также поддерживает VCD, который является форматом, который будет выводить vvp . Итак, чтобы забрать GTKWave, у вас есть пара вариантов

  1. Загрузите http://gtkwave.sourceforge.net/gtkwave.zip и загрузите его. Эта версия, как правило, самая последняя.
  2. Если вы установили MacPorts ( https://www.macports.org/ ), просто запустите sudo port install gtkwave . Это, вероятно, захочет установить на зависимостях. Обратите внимание, что этот метод обычно будет иметь более старую версию. Если у вас нет MacPorts, для этой работы на этой странице приведен пример установки. Да! Вам понадобятся все инструменты для разработчиков xcode, так как эти методы «построят» вам GTKWave из исходного кода.

Когда установка будет завершена, вас могут попросить выбрать версию python. У меня уже было 2.7.10, поэтому я никогда не «выбрал» новый.

На этом этапе вы можете запустить gtkwave из командной строки с помощью gtkwave . При запуске вас могут попросить установить или обновить XQuarts. Сделай так. В моем случае установлен XQuarts 2.7.11.

Примечание. Мне действительно нужно было перезагрузить, чтобы правильно получить XQuarts, затем я снова набрал gtkwave и приложение появилось.

В следующем примере я создам два независимых файла, testbench и модуль для тестирования, и мы будем использовать gtkwave для просмотра дизайна.

Использование Icarus Verilog и GTKWaves для моделирования и просмотра графического дизайна

В этом примере используются Icarus и GTKWave. Инструкции по установке этих инструментов на OSx приведены в других разделах этой страницы.

Давайте начнем с дизайна модуля. Этот модуль представляет собой дисплей с BCD до 7 сегментов. Я закодировал дизайн тупым способом просто для того, чтобы дать нам что-то, что легко сломается, и мы можем потратить когда-нибудь графически. Таким образом, у нас есть часы, сброс, 4 ввода данных, представляющих значение BCD, и 7-битный вывод, который представляет семисегментный дисплей. Создайте файл с именем bcd_to_7seg.v и поместите в него источник.

module bcd_to_7seg (
   input clk,
   input reset,
   input [3:0] bcd,
   output [6:0] seven_seg_display

);
   parameter TP = 1;
   reg seg_a;
   reg seg_b;
   reg seg_c;
   reg seg_d;
   reg seg_e;
   reg seg_f;
   reg seg_g;

   
   always @ (posedge clk or posedge reset)
      begin
      if (reset)
         begin
            seg_a <= #TP 1'b0;
            seg_b <= #TP 1'b0;
            seg_c <= #TP 1'b0;
            seg_d <= #TP 1'b0;
            seg_e <= #TP 1'b0;
            seg_f <= #TP 1'b0;
            seg_g <= #TP 1'b0;
         end
      else
         begin
            seg_a <= #TP  ~(bcd == 4'h1 || bcd == 4'h4);
            seg_b <= #TP  bcd < 4'h5 || bcd > 6;
            seg_c <= #TP   bcd != 2;
            seg_d <= #TP   bcd == 0 || bcd[3:1] == 3'b001 || bcd == 5 || bcd == 6 || bcd == 8;
            seg_e <= #TP  bcd == 0 || bcd == 2 || bcd == 6 || bcd == 8;
            seg_f <= #TP  bcd == 0 || bcd == 4 || bcd == 5 || bcd == 6 || bcd > 7;
            seg_g <= #TP  (bcd > 1 && bcd < 7) || (bcd > 7);
         end
    end
 
    assign seven_seg_display = {seg_g,seg_f,seg_e,seg_d,seg_c,seg_b,seg_a};
endmodule

Затем нам нужен тест, чтобы проверить, работает ли этот модуль правильно. Дело в заявке на тестовом стенде на самом деле легче читать по моему мнению и более ясно, что он делает. Но я не хотел ставить один и тот же пример дела в дизайне И в тесте. Это плохая практика. Для проверки одного другого используются два независимых проекта.

С учетом приведенного ниже кода вы заметите две строки $dumpfile("testbench.vcd"); и $dumpvars(0,testbench); , Эти строки - это то, что создает выходной файл VCD, который будет использоваться для выполнения графического анализа дизайна. Если вы оставите их, вы не получите файл VCD. Создайте файл testbench.v и поместите в него источник.

`timescale 1ns/100ps
module testbench;
reg clk;
reg reset;
reg [31:0] ii;
reg [31:0] error_count;
reg [3:0] bcd;
wire [6:0] seven_seg_display; 
parameter TP = 1;
parameter CLK_HALF_PERIOD = 5;
 
   // assign clk = #CLK_HALF_PERIOD ~clk;  // Create a clock with a period of ten ns
   initial
   begin
     clk = 0;
     #5;
     forever clk = #( CLK_HALF_PERIOD )  ~clk;
   end

   initial
     begin
       $dumpfile("testbench.vcd");
       $dumpvars(0,testbench);
       // clk  = #CLK_HALF_PERIOD ~clk; 
       $display("%0t, Reseting system", $time);
       error_count = 0;
       bcd  = 4'h0;
       reset = #TP 1'b1;
       repeat (30) @ (posedge clk);
       reset  = #TP 1'b0;
       repeat (30) @ (posedge clk);
       $display("%0t, Begin BCD test", $time); // This displays a message


       for (ii = 0; ii < 10; ii = ii + 1)
          begin
          repeat (1) @ (posedge clk);
          bcd  = ii[3:0];
          repeat (1) @ (posedge clk); 
          if (seven_seg_display !== seven_seg_prediction(bcd)) 
             begin
                $display("%0t, ERROR: For BCD %d, module output 0b%07b does not match prediction logic value of 0b%07b.",$time,bcd, seven_seg_display,seven_seg_prediction(bcd));
                error_count = error_count + 1;
             end
          end
       $display("%0t, Test Complete with %d errors", $time, error_count);
       $display("%0t, Test %s", $time, ~|error_count ? "pass." : "fail.");
       $finish ; // This causes the simulation to end.
     end


parameter SEG_A = 7'b0000001;
parameter SEG_B = 7'b0000010;
parameter SEG_C = 7'b0000100;
parameter SEG_D = 7'b0001000;
parameter SEG_E = 7'b0010000;
parameter SEG_F = 7'b0100000;
parameter SEG_G = 7'b1000000;

function [6:0] seven_seg_prediction;
   input [3:0] bcd_in;

   //    +--- A ---+
   //    |         |
   //    F         B
   //    |         |
   //    +--- G ---+
   //    |         |
   //    E         C
   //    |         |
   //    +--- D ---+

   begin
      case (bcd_in)
         4'h0: seven_seg_prediction = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F;
         4'h1: seven_seg_prediction = SEG_B | SEG_C;
         4'h2: seven_seg_prediction = SEG_A | SEG_B | SEG_G | SEG_E | SEG_D;
         4'h3: seven_seg_prediction = SEG_A | SEG_B | SEG_G | SEG_C | SEG_D;
         4'h4: seven_seg_prediction = SEG_F | SEG_G | SEG_B | SEG_C;
         4'h5: seven_seg_prediction = SEG_A | SEG_F | SEG_G | SEG_C | SEG_D;
         4'h6: seven_seg_prediction = SEG_A | SEG_F | SEG_G | SEG_E | SEG_C | SEG_D;
         4'h7: seven_seg_prediction = SEG_A | SEG_B | SEG_C;
         4'h8: seven_seg_prediction = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G;
         4'h9: seven_seg_prediction = SEG_A | SEG_F | SEG_G | SEG_B | SEG_C;
         default: seven_seg_prediction = 7'h0;
      endcase
   end
endfunction


bcd_to_7seg u0_bcd_to_7seg (
.clk               (clk),
.reset             (reset),
.bcd               (bcd),
.seven_seg_display (seven_seg_display)
);


endmodule

Теперь, когда у нас есть два файла - testbench.v и bcd_to_7seg.v, нам нужно скомпилировать его, используя Icarus. Сделать это:

$ iverilog -o testbench.vvp testbench.v bcd_to_7seg.v

Затем нам нужно смоделировать

$ vvp testbench.vvp 
LXT2 info: dumpfile testbench.vcd opened for output.
0, Reseting system
6000, Begin BCD test
8000, Test Complete with          0 errors
8000, Test pass. 

На этом этапе, если вы хотите проверить, действительно ли файл проверен, перейдите в файл bcd_2_7seg.v и переместите часть логики и повторите эти первые два шага.

В качестве примера я изменяю строку seg_c <= #TP bcd != 2; to seg_c <= #TP bcd != 4; , Перекомпилировать и имитировать делает следующее:

$ iverilog -o testbench.vvp testbench.v bcd_to_7seg.v
$ vvp testbench.vvp 
LXT2 info: dumpfile testbench.vcd opened for output.
0, Reseting system
6000, Begin BCD test
6600, ERROR: For BCD  2, module output 0b1011111 does not match prediction logic value of 0b1011011.
7000, ERROR: For BCD  4, module output 0b1100010 does not match prediction logic value of 0b1100110.
8000, Test Complete with          2 errors
8000, Test fail.
$

Итак, теперь давайте посмотрим на моделирование с помощью GTKWave. Из командной строки выполните

gtkwave testbench.vcd &

Когда появится окно GTKWave, вы увидите в левом верхнем поле имя testbench. Нажмите на нее. Это покажет подмодули, задачи и функции, связанные с этим файлом. Провода и регистры также появятся в нижнем левом боксе.

Теперь перетащите, clk, bcd, error_count и seven_seg_display в поле ввода рядом с окном формы волны. Теперь будут отображаться сигналы. Error_count покажет вам, какой конкретный вход BCD генерировал неправильный вывод seven_seg_display.

Теперь вы готовы устранить ошибку Verilog графически.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow