Язык Verilog, основные особенности. Сравнение с языком VHDL. Модель логического элемента на Verilog. ЛЕКЦИЯ N
История создания языка Verilog (Gateway Design Automation) Verilog (Cadence Design Systems) Verilog-95 (IEEE , Open Verilog International) Verilog-2001 (IEEE , Open Verilog International) Verilog-2005 (IEEE , Accellera) Время IEEE 1364 IEEE P Язык Verilog был разработан Филом Морби (Phil Morby) в 1985 году в фирме Gateway для внутреннего использования. В 1989 году компания Cadence приобрела Gateway и открыла Verilog для общественного пользования. В 1995 году Verilog стал стандартом IEEE.
Сравнение языков VHDL и Verilog ОсобенностиVHDLVerilog Объем кода100%75% Алфавит моделирования 9 значений {U, X, 0, 1, Z, W, L, H, - } 4 значения {0,1,X,Z} Логическая сила сигналов -8 значений Системные функции контроля временных соотношений assert8 функций Атрибуты сигналов+- Количество ключевых слов 9773 Внешние данные Для расширения языка используются внешние библиотеки и пакеты Не имеет подобных возможностей Различаются переменные и сигналы Только переменные, но разных типов: net или register
Сравнение языков VHDL и Verilog VHDLVerilog Объект проектаПроектный модуль Интерфейс + архитектураИнтегрированное тело модуля Раздел описания и исполняемый раздел не пересекаются Декларации и параллельные операторы размещаются в модуле произвольном порядке Пользователь может вводить свои типы данных Язык не позволяет создавать пользователем новые типы данных Язык строгой типизации Данные разных типов совместимы в одном выражении processalways Можно задать несколько архитектур- Не позволяет описывать одновременно минимальные, типичные и максимальные задержки Позволяет описывать все виды задержек
Структурная организация HDL – модели VHDL – объект проекта состоит из двух частей: интерфейса и архитектурного тела Verilog – проектный модуль объединяет интерфейс и исполняемый раздел в одном блоке, называемом телом модуля. library IEEE; use IEEE.STD_LOGIC_1164.all; entity nand2_my is -- интерфейс port( A : in STD_LOGIC; B : in STD_LOGIC; Y : out STD_LOGIC ); end nand2_my; architecture nand2_my of nand2_my is begin Y
Моделирование задержек library IEEE; use IEEE.STD_LOGIC_1164.all; entity nand2_my is -- интерфейс port( A : in STD_LOGIC; B : in STD_LOGIC; Y : out STD_LOGIC ); end nand2_my; architecture nand2_my of nand2_my is begin Y
Моделирование разных задержек library IEEE; use IEEE.STD_LOGIC_1164.all; entity nand2_my is -- интерфейс port( A : in STD_LOGIC; B : in STD_LOGIC; Y : out STD_LOGIC ); end nand2_my; architecture nand2_my of nand2_my is begin Y
Моделирование разных задержек
Модель D - триггера D R Q С DFF
Модель сумматора VHDL LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.std_logic_unsigned.all; entity adderN_B is generic (n : integer := 10); port (a, b: in std_logic_vector (n downto 1); cin: in std_logic; sum: out std_logic_vector (n downto 1); cout: out std_logic); end adderN_B; architecture behavior of adderN_B is begin process variable vsum, a1: std_logic_vector(n+1 downto 1); begin wait on a, b, cin; a1 := 0 & a; vsum :=a1 + b + cin; sum
Алфавит моделирования {0, 1, Z, X} 0 – логический ноль или результат сравнения false 1 – логическая единица или результат сравнения true Z – состояние высокого импеданса Х – неопределенное состояние Strength1: supply1, strong1, pull1, large1, weak1, medium1, small1, highz1 Strength0: supply0, strong0, pull0, large0, weak0, medium0, small0, highz0 Силы сигналов
Присваивание значений Виды присваиваний Непрерывные (соединения) Процедурные (соединения, переменные) Блокирующие `= Не блокирующие `
Непрерывное присваивание wire [15:0] sum, a, b; wire cin, cout; assign {cout, sum} = a + b + cin;
Процедурное присваивание module block; reg a, b, c, d, e, f; initial begin a = #10 1; // модельное время = 10 b = #2 0; // модельное время = 12 c = #4 1; // модельное время = 16 end initial begin d
Процедурное присваивание module block; reg a, b, c, d, e, f; initial begin #10 a = 1; // модельное время = 10 #2 b = 0; // модельное время = 12 #4 c = 1; // модельное время = 16 end initial begin #10 d
Управление задержками #10 rega = regb; #d rega = regb; // d определен как параметр #((d+e)/2) rega = regb; #regr regr = regr + 1; // задержка равна содержимому regr reg enable, a, b; initial begin wait (!enable) #10 a = 1; // модельное время = 110 #10 b = 1; // модельное время = 120 end initial #100 enable = 0;
Управление задержками a = #5 b; // эквивалентно: begin temp = b; #5 a = temp; end a clk) b; // эквивалентно: begin temp = clk) a = temp; end
Параллельные и последовательные блоки begin #10 a = 1; // #10 #20 a = 0; // #30 end r = 1; #250 r = 0; end clock) q = 0; // posege clock) q = 1; // следующий end // posege fork #30 a = 0; // #30 #10 a = 1; // #10 join clock) q = clock) w = 1; join join areg = breg; end
Системные функции $monitor (строка форматирования, список переменных); $monitor(%h, output); $display и $write (строка форматирования, список переменных); $display(Output in %h hex and %d decimal, output, output); $finish #1000 $finish;
Модульная структура // Файл lazy.v: module lazy (out, in, clk); parameter size = 1, delay = 1; input [0:size-1] in; input clk; output [0:size-1] out; reg [0:size-1] out; clk) #delay out = in; endmodule // Файл main.v: `include lazy.v module main; reg clk; wire [1:10] out_a, in_a; wire [1:5] out_b, in_b; lazy #(10, 15) mod_a (out_a, in_a, clk); lazy mod_b (out_b, in_b, clk); #800 $finish; always #100 clk = ~clk; initial begin clk = 0; in_a = 10b11111_01011; in_b = 5b10101; end endmodule
Преимущества и недостатки + Прост для изучения + Активно поддерживается сообществом + Существует богатая инструментальная и библиотечная база + Подходит для синтеза FPGA и ASIC, т.е. создавался специально для вентильного уровня + Функционал языка расширяем при помощи VPI (ранее PLI) - Слабые возможности для проектирования на системном уровне - Сложности в использовании библиотек и вообще больших проектов - Более медленный в сравнении с VHDL, так как является интерпретируем языком