310 likes | 524 Views
ЛЕКЦИЯ N 26 .0 5 .0 9. Язык описания аппаратуры Verilog. История создания языка. Verilog ( Gateway Design Automation ). Verilog ( Cadence Design Systems ). Verilog-2005 ( IEEE 1364- 2005, Accellera). IEEE 1364. IEEE P1800. 2001. 1983. 1985. 1990. 1995. 2005. Время.
E N D
ЛЕКЦИЯ N26.05.09 Язык описания аппаратуры Verilog
История создания языка Verilog (Gateway Design Automation) Verilog (Cadence Design Systems) Verilog-2005 (IEEE 1364-2005, Accellera) IEEE 1364 IEEE P1800 2001 1983 1985 1990 1995 2005 Время Verilog-95 (IEEE 1364-1995, Open Verilog International) Verilog-2001 (IEEE 1364-2001, Open Verilog International)
Коммерческие симуляторы 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 1’b1;// изменения не допускаются
Представление чисел /* <разрядность><’основание><число> <разрядность> - длина числа в битах <основание> - основание системы исчисления: b, o, h, d префикс ’s для чисел со знаком <основание><число> <число> <число><степень> */ 12345 ’b10_10 16’hFF34 1’b1111 10’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;
Арифметические операции `+’ – сложение 2 + 2 = 4 `-’ – вычитание 10 – 9 = 1 `/’ – деление 10 / 3 = 3 `*’ – умножение 5 * 3 = 15 `%’ – модуль 2 % 3 = 2 `**’ – возведение в степень 2 ** 4 = 16 `+’, `-’– унарные операции -4’b1011 = 4’b0101
Логические операции `&&’ –логическое И 4’b1011 && 4’b0010= 1’b1 4’b1011&& 4’b001X= 1’bX `||’ – логическое ИЛИ 4’b1011 || 4’b0010 = 1’b1 4’b101X|| 4’b0010 = 1’bX `!’ – логическое отрицание 4’b1011 = 1’b0
Поразрядные логические операции `&’ – поразрядное И 4’b1011 & 4’b0010 = 4’b0010 `|’ – поразрядное ИЛИ 4’b1011 | 4’b0010 = 4’b1011 `~’ – поразрядная инверсия ~4’b1011 = 4’b0100 `^’ – исключающее ИЛИ 4’b1011 ^ 4’b0010 = 4’b1001 `~^’ или `^~’ – исключающее ИЛИ-НЕ 4’b1011 ^ 4’b0010 = 4’b0110
Операции отношения `<’ – меньше 4’b1011 < 4’b0010 => 1’b0 `>’ – больше 4’b1011 > 4’b0010 => 1’b1 `==’ – равно 10 == 10 => true `!=’ – не равно 10 != 10 => false `>=’ – больше либо равно `<=’ – меньше либо равно `===’ – тождественно равно 4’bX011 === 4’bX010 `!===’ – тождественно не равно 4’bX011 === 4’bX010
Операции свертки `&’ – И всех разрядов &4’b1101=> 1’b0 `|’ – ИЛИ всех разрядов |4’b1101=> 1’b1 `~|’ – ИЛИ-НЕ всех разрядов ~|4’b1101=> 1’b0 `~&’ – И-НЕ всех разрядов ~&4’b11011’b1 `^’ – исключающее ИЛИ всех разрядов ^4’b1101=> 1’b1 `~^’ – исключающее ИЛИ-НЕ всех разрядов ~^4’b1101=> 1’b0
Операции сдвига `<<’ – логический сдвиг влево 4’b11_01 << 2 => 4’b01_00 `>>’ – логический сдвиг вправо 4’b11_01 >> 2 => 4’b00_11 `<<<’ – арифметический сдвиг влево 4’sb1_101 << 1 => 4’sb1_010 `>>>’ – арифметический сдвиг вправо 4’sb1_101 >> 1 => 4’sb1_110
Операторы конкатенации и повторения {переменная1, переменная2, … переменнаяN} {a[3:0], b[10:7]} => вектор длиной 8 бит {3’b100, 2’b11} => 5’b10011 {N{переменная}} {4{2’b01}} => 8’b01010101 {3{a}} => {a, a, a} {4{a,b}} => {a, b, a, b, a, b, a, b}
Операторы выбора <условие>? <результат_успех> : <результат_иначе> Amax = C > D ? C : D; if (<условие>) <утверждение1>else <утверждение2> if (index > 0) if (rega > regb) result = rega; else // относится к ближайшему if result = regb;
Операторы 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, flag; reg [15:0] in0, in1, in2, in3, out; case (sel) 2'b00: out = in0; 2'b01: out = in1; 2'b0x, 2'b0z: out = flag ? 16'bx : 16'b0; 2'b10: out = in2; 2'b11: out = in3; 2'bx0, 2'bz0: out = flag ? 16'bx: 16'b0; default out = 16'bx; endcase 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
Оператор цикла 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; shift_opb = shift_opb >> 1; end 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 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 <= #10 1; // модельное время = 10 e <= #2 0; // модельное время = 2 f <= #4 1; // модельное время = 4 end endmodule
Процедурное присваивание 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 <= 1; // модельное время = 10 #2 e <= 0; // модельное время =12 #4 f <= 1; // модельное время =16 end endmodule
Управление задержками #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 = @(posedge clk) b; // эквивалентно: begin temp = b; @(posedge clk) a = temp; end
Параллельные и последовательные блоки fork #30 a = 0; // #30 #10 a = 1; // #10 join fork @(posedge clock) q = 0; @(posedge clock) w = 1; join begin fork @Aevent; @Bevent; join areg = breg; end begin #10 a = 1; // #10 #20 a = 0; // #30 end begin @trig r = 1; // @trig #250 r = 0; // @trig+250 end begin @(posedge clock) q = 0; // posege clock @(posedge clock) q = 1; // следующий end// posege
Системные функции $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; always @(posedge 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 = 10’b11111_01011; in_b = 5’b10101; end endmodule
Преимущества и недостатки • + Прост для изучения • + Активно поддерживается сообществом • + Существует богатая инструментальная и библиотечная база • + Подходит для синтеза FPGA и ASIC, т.е. создавался специально • для вентильного уровня • + Функционал языка расширяем при помощи VPI (ранее PLI) • Слабые возможности для проектирования на системном уровне • Сложности в использовании библиотек и вообще больших проектов • Более медленный в сравнении с VHDL, так как является • интерпретируем языком