1 / 31

ЛЕКЦИЯ N 26 .0 5 .0 9

ЛЕКЦИЯ 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. Время.

tamira
Download Presentation

ЛЕКЦИЯ N 26 .0 5 .0 9

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ЛЕКЦИЯ N26.05.09 Язык описания аппаратуры Verilog

  2. История создания языка 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)

  3. Коммерческие симуляторы Vxxxx – Verilog-xxxx, SVxxxx – SystemVerilog-xxxx, VHDL = VHDL

  4. Лексические элементы // Идентификаторы reg store; reg _store_; reg 1store; reg store_1; reg Store_1; reg store$; reg $store; /* Расширенные идентификаторы */ reg \1st(*)re ; reg \store1 ; // равно reg store1;

  5. Лексические элементы // Символьные и строковые литералы “A” // символ “0010”// строка из 4 символов “N123FE”// строка из 6 символов “N 1 // переносы не допустимы 2 3 G” // Константы parameter tick=10; // допускается изменение из внешнего модуля `define ONE 1’b1;// изменения не допускаются

  6. Представление чисел /* <разрядность><’основание><число> <разрядность> - длина числа в битах <основание> - основание системы исчисления: b, o, h, d префикс ’s для чисел со знаком <основание><число> <число> <число><степень> */ 12345 ’b10_10 16’hFF34 1’b1111 10’hX 145e4

  7. Алфавит моделирования {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

  8. Типы данных (соединения) • 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;

  9. Типы данных (переменные) • 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;

  10. Арифметические операции `+’ – сложение 2 + 2 = 4 `-’ – вычитание 10 – 9 = 1 `/’ – деление 10 / 3 = 3 `*’ – умножение 5 * 3 = 15 `%’ – модуль 2 % 3 = 2 `**’ – возведение в степень 2 ** 4 = 16 `+’, `-’– унарные операции -4’b1011 = 4’b0101

  11. Логические операции `&&’ –логическое И 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

  12. Поразрядные логические операции `&’ – поразрядное И 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

  13. Операции отношения `<’ – меньше 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

  14. Операции свертки `&’ – И всех разрядов &4’b1101=> 1’b0 `|’ – ИЛИ всех разрядов |4’b1101=> 1’b1 `~|’ – ИЛИ-НЕ всех разрядов ~|4’b1101=> 1’b0 `~&’ – И-НЕ всех разрядов ~&4’b11011’b1 `^’ – исключающее ИЛИ всех разрядов ^4’b1101=> 1’b1 `~^’ – исключающее ИЛИ-НЕ всех разрядов ~^4’b1101=> 1’b0

  15. Операции сдвига `<<’ – логический сдвиг влево 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

  16. Операторы конкатенации и повторения {переменная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}

  17. Операторы выбора <условие>? <результат_успех> : <результат_иначе> Amax = C > D ? C : D; if (<условие>) <утверждение1>else <утверждение2> if (index > 0) if (rega > regb) result = rega; else // относится к ближайшему if result = regb;

  18. Операторы 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

  19. Оператор цикла 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

  20. Оператор цикла 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

  21. Оператор цикла for begin :init_mem reg [7:0] tempi; for (tempi = 0; tempi < memsize; tempi = tempi + 1) memory[tempi] = 0; end

  22. Присваивание значений Виды присваиваний Непрерывные (соединения) Процедурные (соединения, переменные) Не блокирующие `<=’ Блокирующие `=’

  23. Непрерывное присваивание wire [15:0] sum, a, b; wire cin, cout; assign {cout, sum} = a + b + cin;

  24. Процедурное присваивание 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

  25. Процедурное присваивание 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

  26. Управление задержками #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;

  27. Управление задержками a = #5 b; // эквивалентно: begin temp = b; #5 a = temp; end a = @(posedge clk) b; // эквивалентно: begin temp = b; @(posedge clk) a = temp; end

  28. Параллельные и последовательные блоки 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

  29. Системные функции $monitor (“строка форматирования”, список переменных); $monitor(“%h”, output); $display и $write (“строка форматирования”, список переменных); $display(“Output in %h hex and %d decimal”, output, output); $finish #1000 $finish;

  30. Модульная структура // Файл 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

  31. Преимущества и недостатки • + Прост для изучения • + Активно поддерживается сообществом • + Существует богатая инструментальная и библиотечная база • + Подходит для синтеза FPGA и ASIC, т.е. создавался специально • для вентильного уровня • + Функционал языка расширяем при помощи VPI (ранее PLI) • Слабые возможности для проектирования на системном уровне • Сложности в использовании библиотек и вообще больших проектов • Более медленный в сравнении с VHDL, так как является • интерпретируем языком

More Related