Введение в Verilog
Стандартные этапы проектирования устройства на FPGA Ввод описания проекта Моделирование, преобразование пользовательского описания в компоненты и примитивы, входящие в состав библиотеки FPGA. RTL – Registr Transport Level (Уровень регистровых пересылок) Размещение полученных вентилей в ячейки Временной анализ Непосредственное размещение на микросхему и разводка связей Временной анализ с учетом параметров микросхемы и пользовательских ограничений Конец разработки Создание файла с конфигурацией устройства Программирование микросхемы Пользовательские ограничения Логический синтез, преобразование файлов в схему соединений Моделирование на логическом уровне САПР
Verilog tutorial ( 3 ) Contents Етапы проектирования Модули Объявление Создание экземпляров Подключение портов Test-bench файлы Adder (разработка сумматора) Проектирование RTL -моделирование Синтез Gate-level моделирование Приложение: создание проекта adder в GUI (ModelSim)
Verilog tutorial ( 4 ) Объявление модуля Модуль – базовая единица проекта. Модуль должен быть задекларирован (объявлен). подготовка Mодуль может быть конкретизирован (создан экземпляр) использование Определение модуля должно вкладывается между ключевыми словами module и endmodule. module module_name (список портов); // in, out, inout объявление портов // signal/wire/reg объявление сигналов // data variable объявление переменных // sub-module создание экземпляров и // подключение // initial, always, function, task функциональные блоки, // описывающие логику работы компонента endmodule module ModF (A, B, C); input A; inout [7:0] B; output [7:0] C; // описания // описания f endmodule ModF f f A B C
Verilog tutorial ( 5 ) Создание экземпляра модуля module ModG (AA, BB, CC); input AA; inout [7:0] BB; output [7:0] CC; wire a; wire [7:0] b; // описание g // создание екземпляра f ModF Umodf (.A(a),.B(b),.C(CC)); endmodule ModG g g AA BB CC f f a b ModF f f A B C создание экземпляра Соединение портов Имя экземпляра Имя модуля
Соединение портов Позиционный принцип – сопоставление портов в объявлении модуля и в его экземпляре: module ModF (A, B, C); ModF Umod f (a, b, cc); Ключевой принцип - явное указание, какой сигнал подключить к какому порту модуля module ModF (A, B, C); ModF Umodf (.A(a),.B(b),.C(CC)); // в любом порядке Порт Сигнал ModG g g AA BB CC f f a b ModF f f A B C
Типы данных Типы данных Verilog Net - соединение (связь, цепь) wire – простой провод wand, wor – монтажное И/ИЛИ tri, tri0, tri1, triand, trior, trireg - соединения с третьим состоянием supply0 – постоянный 0 (GND) supply1 – постоянная 1 (VCC/VDD) Variable - переменная Reg - регистр
Introduction to Verilog Basic ( 8 ) Nets (2/2) A B Y wire Y; // declaration assign Y = A & B; B A Y wand Y; // declaration assign Y = A; assign Y = B; wor Y; // declaration assign Y = A; assign Y = B; AY dr tri Y; // declaration assign Y = (dr) ? A : z; z or Z means high-impedance.
Verilog значения Verilog tutorial ( 9 ) Integer constants Decimal (123, 4d15) Hexadecimal (h12F, 4haBcD) Octal (o763, 3o7) Binary (b1010, 4b1100) // Unsized constant numbers 659 // is a decimal number d659 'h837FF // is a hexadecimal number 'o7460 // is an octal number 4af // is illegal (hexadecimal format requires 'h) – 'h4af // Sized constant numbers 4'b1001 // is a 4-bit binary number 5'D3 // is a 5-bit decimal number 3'b01x // is a 3-bit number with the least significant bit unknown 12'hx // is a 12-bit unknown number 16'hz // is a 16-bit high-impedance number reg [7:0] my_vector_reg; reg [3:0] a, b, c, d;
Verilog tutorial ( 10 ) Правила соединения портов Входной порт модуля должен иметь тип соединение (связь) Выходной порт модуля может иметь тип или соединение или регистр (переменная) Двунаправленные порты должны иметь только тип соединения input output inout reg or net net reg or net
Четырехзначный алфавит Verylog Значение 0Низкий логический уровень или ложно 1Высокий логический уровень или истинно X, x Неопределенный логический уровень Z, z Высокоимпедансный логический уровень, третье состояние Символ «?» так же используется для альтернативного представления «Z» состояния
Verilog tutorial ( 12 ) Test-bench файлы «Тest-bench» это специальный уровень кода, который создает пользовательские входные параметры (stimulus) для тестируемого проекта (DUT, design under test) и определяет, производит ли DUT ожидаемые (golden) выходные сигналы «Тest-vector» установка значений для всех входных портов DUT(stimuli) и ожидаемых значений (образцов) выходных портов тестируемого модуля «Тest-bench», который создает пользовательские входные сигналы, образцы выходных сигналов DUT и сравнивает выходные сигналы с ожидаемыми (golden) результатами называется однородно-проверяющим. Golden model – идеальная модель, на выходе выдает идеальные ожидаемые результаты Reference model – базовая модель, взятая за основу, работает идентично, но может быть создана с помощью других функций, например математических или аппаратная реализация, созданная сторонними разработчиками.
Verilog tutorial ( 13 ) Разработка структурной схемы сумматора Сумматор цифровая схема которая выполняет сложение чисел Одноразрядный полусумматор складывает два однобитных двоичных числа (А и В). На выходе формируется значение суммы (S) и переноса (C). Полный одноразрядный сумматор складывает три однобитный значения (C, A and B). На выходе формируется значение суммы (S) и переноса (C). Многоразрядный сумматор Суммирование с распространением переносов Перенос из младшего полусумматора учитывается старшим полусумматором Picture has been adopted from Wikipedia (
Структура директории adder design sim syn sim.gate Папка с исходными кодами проекта Папка с результатами симуляции Папка с результатами синтеза Папка с результатами Gate-level симуляции
Проект adder - сумматор Содержимое папки design top.v full_adder.v half_adder_gate.v half_adder_rtl.v stimulus.v full_adder_ref.v checker.v
full_adder clk reset Начальные установки Запись входных значений во входные регистры, формирование результата reset clk cin in1 in2 sum cout A B S C half_adder module half_adder (S, C, A, B); output S, C; input A, B; // описание модуля endmodule Модуль full_adder
Verilog tutorial ( 17 ) Модуль full_adder (1/3) module full_adder(sum,cout,in1,in2,cin,clk,resetb); output sum, cout; /выходные сигналы input in1, in2, cin; /входные сигналы input clk, resetb; /входные сигналы / объявление типов связей, сигналов и соединений wire sum, cout; /соединение (проводник) reg rin1, rin2, rcin; /переменная (регистр) wire s1, c1, s2, c2; /соединение (проводник) /процедурный блок - процесс (posedge clk or negedge resetb) begin if (resetb==1'b0) begin rin1
Verilog tutorial ( 18 ) Full adder (2/3) module full_adder(sum,cout,in1,in2,cin,clk,resetb); output sum, cout; input in1, in2, cin; input clk, resetb; wire sum, cout; reg rin1, rin2, rcin; wire s1, c1; wire s2, c2; (posedge clk or negedge resetb) begin if (resetb==1'b0) begin rin1
Verilog tutorial ( 19 ) Full adder (3/3) module full_adder(sum,cout,in1,in2,cin,clk,resetb); output sum, cout; input in1, in2, cin; input clk, resetb; wire sum, cout; reg rin1, rin2, rcin; wire s1, c1; wire s2, c2; (posedge clk or negedge resetb) begin if (resetb==1'b0) begin rin1
Структурная модель полусумматора (gate level) module half_adder_gate (S, C, A, B); output S, C; input A, B; and UAND (C, A, B); xor UXOR (S, A, B); endmodule A B S C Структурное описание – структура объекта, как композиция компонентов, соединенных между собой и обменивающихся сигналами. Структурная модель - создание экземпляров примитивов и модулей (использование библиотечных модулей, или создание собственных) использование библиотечных модулей and и xor
Поведенческое описание объектов Полусумматор. Процессная форма описания поведения (Behavior model) module half_adder_beh1 (S, C, A, B); output S, C; input A, B; wire S, C; (A or B) begin if ((A==0) or (B==1)) and ((A==0) or (B==1)) begin S
Поведенческое описание объектов Полусумматор. Потоковое описание архитектуры (Data-flow model (RTL-модель)) (RTL, Register Transfer Level, Уровень регистровых передач) module half_adder_rtl (S, C, A, B); output S, C; input A, B; wire S, C; assign C = A & B; assign S = A ^ B; endmodule A B S C Data-flow модель – модель потоков данных Описывает поведение архитектуры объекта, потоки данных функционирующие на уровне архитектуры объекта и их преобразование. Поведение архитектуры описывается с помощью операторов непрерывных назначений (присваиваний), которые представляют собой параллельные процессы. Объект представлен архитектурным описанием, где минимальная видимая единица примитив RTL уровня - RTL модель
Модели мультиплексора (Behavior model) (sel or a or b or c or d) if (sel == 2b00) out = a; else if (sel == 2b01) out = b; else if (sel == 2b10) out = d; else out = d; (sel or a or b or c or d) case (sel) 2b00: out = a; 2b01: out = b; 2b10: out = c; default: out = d; endcase assign c = (s) ? b : a; sel[1]sel[0]out 00a 01b 10c 11d MX a b out d c sel[0] sel[1] module mx_beh (sel, a, b, c, d, out); output out; input sel, a, b, c, d; wire a, b, c, d; wire [1:0]sel; / description endmodule
Test-bench: stimulus module stimulus(out1,out2,out3,clk,resetb); output out1,out2,out3; input clk,resetb; reg out1,out2,out3; initial begin out1
Verilog tutorial ( 25 ) Test-bench: full_adder_ref module full_adder_ref(sum,cout,in1,in2,cin,clk,resetb); output sum, cout; input in1, in2, cin; input clk, resetb; wire sum, cout; reg rin1, rin2, rcin; (posedge clk or negedge resetb) begin if (resetb==1'b0) begin rin1
Verilog tutorial ( 26 ) Test-bench: checker module checker(in1,in2,cin,sum,cout,sumr,coutr,clk,resetb); input in1,in2,cin,sum,cout,sumr,coutr,clk,resetb; (clk) begin if ({cout,sum}=={coutr,sumr}) $display($time,,"correct"); else $display($time,,"error result=%b expect=%b", {cout, sum}, {coutr,sumr}); end endmodule Time – системная функция возвращает текущее модельное время, целое 64-битное значение времени, масштабируемое соответственно единице временного масштаба модуля ( timescale ), установленной в нем $time ; Di splay – системная задача, вывод информации с новой строки на экран. $display ( «текст с символами форматирования», list_of_arguments );
Verilog tutorial ( 27 ) Test-bench: top module top; wire in1, in2, cin; wire sum, cout, sumr, coutr; reg clk, resetb; full_adder Ufa (.sum(sum),.cout(cout),.in1(in1),.in2(in2),.cin(cin),.clk(clk),.resetb(resetb)); full_addr_ref Urf (.sum(sumr),.cout(coutr),.in1(in1),.in2(in2),.cin(cin),.clk(clk),.resetb(resetb)); stimulus Ust (.out1(in1),.out2(in2),.out3(cin),.clk(clk),.resetb(resetb)); checker Uck (.in1(in1),.in2(in2),.cin(cin),.sum(sum),.cout(cout),.clk(clk),.resetb(resetb)); / генератор синхроимпульсов с периодом 5ns initial begin clk
Verilog tutorial ( 28 ) Contents Design flow overview Hello world GUI based Command based Module Declaration Instantiation Port Test-bench Adder example What is adder Directory structure Example design Simulation Synthesis Gate-level simulation
Verilog tutorial ( 29 ) Contents Adder example What is adder Directory structure Example design Simulation Synthesis Gate-level simulation Map & PnR Static timing analysis FPGA-based co-simulation Использование САПР
Результаты моделирования
Verilog tutorial ( 32 ) Моделирование с использованием ModelSim GUI Invoking ModelSim form start menu Create new project Add design files Compile Wave setting Simulation Invoking ModeSim project
Verilog tutorial ( 33 ) Invoking ModelSim from start menu
Verilog tutorial ( 34 ) File->New->Project
Verilog tutorial ( 35 ) Specify project name and location
Verilog tutorial ( 36 ) File->Add to Project->Existing File
Verilog tutorial ( 37 ) Add files
Verilog tutorial ( 38 ) After adding files
Verilog tutorial ( 39 ) Compile->Compile All
Verilog tutorial ( 40 ) After compilation
Verilog tutorial ( 41 ) View->Debug Windows->Wave
Verilog tutorial ( 42 ) After adding wave window
Verilog tutorial ( 43 ) Select Library tab
Verilog tutorial ( 44 ) Run simulation with top-level
Verilog tutorial ( 45 ) After simulation
Verilog tutorial ( 46 ) Selecting signals to be view
Verilog tutorial ( 47 ) After selection
Verilog tutorial ( 48 ) Run-All
Verilog tutorial ( 49 ) Create a new project Invoke ModelSim File New Project Specify Project Name and Project Location DIY
Verilog tutorial ( 50 ) Add existing file Add the Verilog design file DIY
Verilog tutorial ( 51 ) Compile DIY
Verilog tutorial ( 52 ) Compile DIY
Verilog tutorial ( 53 ) Compile DIY
Verilog tutorial ( 54 ) Simulation DIY
Verilog tutorial ( 55 ) Quit There should be hello.mpf, which is ModelSim project file. DIY
Схема до лабораторної роботи 4 Verilog tutorial ( 56 )