Язык описания аппаратуры 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
Коммерческие симуляторы СимуляторКомпанияПоддерживаемые HDL Active-HDL/RivieraAldecVHDL-2002, V2001, SV2005 ISE SimulatorXilinxVHDL-93, V2001 ModelSimMentor GraphicsVHDL-2002, V2001, SV2005 NC-Verilog/Incisive Cadence Design Systems VHDL-2002, V2001, SV2005 Quartus II SimulatorAlteraVHDL-1993, V2001, SV2005 VCSSynopsysVHDL-2002, V2001, SV2005 Verilogger Extreme, Verilogger Pro SynaptiCADV2001, V1995 Verilog-XLCadenceV1995 VeritakSugawara SystemsV2001 Vxxxx – Verilog-xxxx, SVxxxx – SystemVerilog-xxxx, VHDL = VHDL
Лексические элементы // Идентификаторы reg store; reg _store_; reg 1store; reg store_1; reg Store_1; reg store$; reg $store; /* Расширенные идентификаторы */ reg \1st(*)re ; reg \store1 ; // равно reg store1;
Лексические элементы // Символьные и строковые литералы A // символ 0010 // строка из 4 символов N123FE // строка из 6 символов N 1 // переносы не допустимы 2 3 G // Константы parameter tick=10; // допускается изменение из внешнего модуля `define ONE 1b1; // изменения не допускаются
Представление чисел /* - длина числа в битах - основание системы исчисления: b, o, h, d префикс s для чисел со знаком */ b10_10 16hFF34 1b hX 145e4
Алфавит моделирования {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 или tri – простой провод (соединение, связь, цепь); wor или trior – монтажное ИЛИ; wand или triand – монтажное И; tri0 – привязка к 0 в третьем состоянии; tri1 – привязка к 1 в третьем состоянии; supply0 – постоянный 0 (сила источника питания); supply1 – постоянный 1 (сила источника питания); trireg – сохранение последнего значения сигнала на шине при установлении драйверов в третье состояние. wire a, e, d; wire [3:0] b; wire (strong1, weak0) [32:0] c;
Типы данных (переменные) reg – вектор любого размера; integer – 32-разрядная переменная со знаком; time – 64-разрядная переменная со знаком, применяется встроенными функциями для моделирования времени; real или realtime – переменная с плавающей запятой. reg A; reg [100:0] B; reg [31:0] mem[0:255]; // память, 32 слова по 256 бит integer C; real D;
Арифметические операции `+ – сложение = 4 `- – вычитание 10 – 9 = 1 `/ – деление 10 / 3 = 3 `* – умножение 5 * 3 = 15 `% – модуль 2 % 3 = 2 `** – возведение в степень 2 ** 4 = 16 `+, `- – унарные операции -4b1011 = 4b0101
Логические операции `&& – логическое И 4b1011 && 4b0010 = 1b1 4b1011 && 4b001X = 1bX `|| – логическое ИЛИ 4b1011 || 4b0010 = 1b1 4b101X || 4b0010 = 1bX `! – логическое отрицание 4b1011 = 1b0
Поразрядные логические операции `& – поразрядное И 4b1011 & 4b0010 = 4b0010 `| – поразрядное ИЛИ 4b1011 | 4b0010 = 4b1011 `~ – поразрядная инверсия ~4b1011 = 4b0100 `^ – исключающее ИЛИ 4b1011 ^ 4b0010 = 4b1001 `~^ или `^~ – исключающее ИЛИ-НЕ 4b1011 ^ 4b0010 = 4b0110
Операции отношения `< – меньше 4b1011 1b0 `> – больше 4b1011 > 4b0010 => 1b1 `== – равно 10 == 10 => true `!= – не равно 10 != 10 => false `>= – больше либо равно `
Операции свертки `& – И всех разрядов &4b1101 => 1b0 `| – ИЛИ всех разрядов |4b1101 => 1b1 `~| – ИЛИ-НЕ всех разрядов ~|4b1101 => 1b0 `~& – И-НЕ всех разрядов ~&4b1101 1b1 `^ – исключающее ИЛИ всех разрядов ^4b1101 => 1b1 `~^ – исключающее ИЛИ-НЕ всех разрядов ~^4b1101 => 1b0
Операции сдвига `> – логический сдвиг вправо 4b11_01 >> 2 => 4b00_11 `> – арифметический сдвиг вправо 4sb1_101 >> 1 => 4sb1_110
Операторы конкатенации и повторения {переменная1, переменная2, … переменнаяN} {a[3:0], b[10:7]} => вектор длиной 8 бит {3b100, 2b11} => 5b10011 {N{переменная}} {4{2b01}} => 8b {3{a}} => {a, a, a} {4{a,b}} => {a, b, a, b, a, b, a, b}
Операторы выбора ? : Amax = C > D ? C : D; if ( ) else if (index > 0) if (rega > regb) result = rega; else // относится к ближайшему if result = regb;
reg [31:0] instruction; reg [2:0] aluOp; casez (instruction[31:26]) 6'b00????: aluOp = 3'b000; 6'b100???: aluOp = 3'b001; 6'b101???: aluOp = 3'b010; 6'b1100??: aluOp = 3'b001; 6'b11010?: aluOp = 3'b100; 6'b110110: aluOp = 3'b101; endcase Операторы case, casex, casez reg [1:0] sel; reg [15:0] in0, in1, in2, in3, out; case (sel) 2'b00: out = in0; 2'b01: out = in1; 2'b10: out = in2; 2'b11: out = in3; default out = 16'bx; endcase reg [1:0] sel, ag; reg [15:0] in0, in1, in2, in3, out; case (sel) 2'b00: out = in0; 2'b01: out = in1; 2'b0x, 2'b0z: out = ag ?16'bx : 16'b0; 2'b10: out = in2; 2'b11: out = in3; 2'bx0, 2'bz0: out = ag ? 16'bx: 16'b0; default out = 16'bx; endcase
Оператор цикла repeat parameter size = 8, longsize = 16; reg [size:1] opa, opb; reg [longsize:1] result; begin: mult reg [longsize:1] shift_opa, shift_opb; shift_opa = opa; shift_opb = opb; result = 0; repeat (size) begin if (shift_opb[1]) result = result + shift_opa; shift_opa = shift_opa > 1; end
Оператор цикла while begin: count1s reg [7:0] tempreg; count = 0; tempreg = rega; while (tempreg) begin if (tempreg[0]) count = count + 1; tempreg = tempreg >> 1; end
Оператор цикла for begin :init_mem reg [7:0] tempi; for (tempi = 0; tempi < memsize; tempi = tempi + 1) memory[tempi] = 0; end
Присваивание значений Виды присваиваний Непрерывные (соединения) Процедурные (соединения, переменные) Блокирующие `= Не блокирующие `
Непрерывное присваивание 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, так как является интерпретируем языком