Відкрити головне меню

Verilog

Мова опису апаратури (для верифікації та синтезу).

Verilog HDL (англ. Verilog Hardware Description Language) — мова опису апаратури (HDL), що використовується для опису та моделювання електронних систем. Verilog HDL не слід плутати з VHDL (конкуруюча мова), найбільш часто використовується у проектуванні, верифікації і реалізації (наприклад, у вигляді НВІС) аналогових, цифрових та змішаних електронних систем на різних рівнях абстракції.

Verilog
Парадигма:структурний
Дата появи:1984
Останній реліз:IEEE1364-2005 (9 листопада 2005; 14 років тому (2005-11-09))
Система типізації:статичний, слабкий тип
Вплинула на:SystemVerilog
Звичайні розширення файлів:.v

Розробники Verilog зробили його синтаксис дуже схожим на синтаксис мови C, що спрощує його освоєння. Verilog має препроцесор, дуже схожий на препроцесор мови C, і основні керуючі конструкції if, while також подібні однойменним конструкціям мови C. Угоди по форматуванню виведення також дуже схожі (див. printf).

Слід зазначити, що опис апаратури, написаний мовою Verilog (як і іншими HDL-мовами) прийнято називати програмами, але, на відміну від загальноприйнятого поняття програми, як послідовності інструкцій, тут програма представляє множину операторів, які виконуються паралельно і циклічно під керуванням об'єктів, названих сигналами. Кожен такий оператор є моделлю певного елемента реальної функціональної схеми апаратури, а сигнал — аналогом реального логічного сигналу. Так само для мови Verilog не застосовується термін «виконання програми». Фактично, виконання Verilog-програми є моделюванням функціональної схеми, яку вона описує, що виконується спеціальною програмою — Verilog-симулятором.

ОглядРедагувати

Розробники мови Verilog хотіли створити її за синтаксисом подібною до мови програмування C, яка уже широко використовувалася при розробці програмного забезпеченні. Як і C, Verilog чутливий до регістру і має базовий препроцесор (хоча не такий складний як у ANSI C/C++). Його ключові слова для керування потоком (такі як if/else, for, while, case, та інші) є еквівалентними, а Черговість операцій сумісна із C. До синтаксичних відмінностей відносяться: необхідність вказувати ширину в бітах при декларації змінних, демаркація процедурних блоків (Verilog використовує ключові слова begin/end замість фігурних дужок {}), і багато інших не значних відмінностей. Verilog вимагає, щоб усім змінним визначався розмір. В C ці розміри визначаються 'типом' змінної (наприклад, цілий тип може мати розмір в 8 біт).

Структура програми на Verilog складається із ієрархії модулів. Модулі інкапсулюють ієрархію дизайну, і комунікують з іншими модулями через множину оголошених входів, виходів і двонаправлених портів.

Існує підмножина інструкцій мови Verilog, придатна для синтезу. Модулі, які написані в межах цієї підмножини, називають RTL (англ. register transfer level — рівень регістрових передач). Вони можуть бути фізично реалізовані з використанням САПР синтезу. САПР за певними алгоритмами перетворить абстрактний вихідний Verilog-код на перелік зв'язків (англ. netlist) — логічно еквівалентний опис, що складається з елементарних логічних примітивів (наприклад, елементи AND, OR, NOT та тригери), які доступні у вибраній технології виробництва НВІС або програмування БМК чи ПЛІС. Подальша обробка переліку зв'язків в кінцевому підсумку породжує фотошаблони для літографії або прошивку для FPGA.

СтворенняРедагувати

Verilog створили Phil Moorby і Prabhu Goel взимку 1983–1984 років у фірмі Automated Integrated Design Systems (з 1985 року Gateway Design Automation) як мову моделювання апаратури. У 1990 році Gateway Design Automation була куплена Cadence Design Systems. Компанія Cadence має права на логічні симулятори Gateway's Verilog і Verilog-XL simulator.

Типи данихРедагувати

У Verilog існує дві основних групи типів даних: net та variable. Обидві групи відрізняються способами призначення та зберігнная значення. Також ці групи представляють різні структури під час синтезу. Екземпляри об'єктів обох груп під час моделювання Verilog опису можуть приймати 4 значення:

  • 0.
  • 1.
  • x - невідоме значення. Дане значення використовується лише під час моделювання. Під час роботи реальної апаратури завжди буде "0" або "1".
  • z - стан високого імпендансу, тобто відсутність сигналу. Прикладом використання даного значення є опис тристабільних буферів.

Декларація net об'єктівРедагувати

Тип даних net буду представляти фізичні з'єднання між блоками дизайну, наприклад, логічними вентилями. Об'єкти даного типу не будуть зберігати значення (окрім тристабільних буферів). Значення такого об'єкту буде визначатися значеннями його драйверів. Якщо до net об'єкту не приєднано драйверів, то він матиме значення високого імпендансу (z).

wire w1; // 1-бітовий сигнал
wire[31:0] bus; // 32-бітова шина

Декларація зміннихРедагувати

Змінні являються абстракцією елемегту для зберігання даних. Змінна має зберігати значення від одного присвоєння до іншого. Конструкція просвоєння діє як тригер, який збуджує зміну значення в елементі збереженння даних. Початковим значення для типів reg, time та integer є невідоме значення - x. Початковим значення для типів real та realtime є значення - 0.0

reg [7:0] bus; // декларація 8-бітної шини
reg [31:0] memory[0:1023]; // 1024 словa пам`яті, кожне слово складається з 32 бітів.

Поведінкова модельРедагувати

Існує декілька способів задання Verilog процесів.

initialРедагувати

Конструкція initial використовується для задання певного блоку коду, що буде виконано рівно один раз. Варто зазначити, що дана конструкція не належить до синтезованої підмножини мови. Типовим використанням initial конструкції є ініціалізація певних змінних під час початку моделювання. Нижче наведено приклад генерації синхросигналу c періодом period у тестовому модулі.

module testbench();
    initial
    	begin	
    		clk = 1'b0;  
    		forever #(period/2) clk = ~clk;
    	end
endmodule

alwaysРедагувати

Конструкція always представляє собою блок коду, який повторно виконується під час моделювання. always складається з двох частин - списку чутливості та блоку операторів. Список чутливості представляє собою набір певних сигналів або виразів. Зміна значення будь-якого елементу зі списку чутливості ініцією виконання блоку операторів конструкції. Декілька always-блоків виконуються паралельно. У наступному прикладі наведено спосіб використання даної конструкції для реалізацї функції бітове АБО. Кожен раз, коли сигнал A чи B отримують нове значення вираховується значення сигналу C.

always @ ( A or B ) begin
    C = A & B ;
end


ПрикладРедагувати

Програма Hello world! на мові Verilog (не синтезується):

module main;
  initial
    begin
      $display("Hello world!");
      $finish;
    end
endmodule

Два простих послідовно з'єднаних тригери:

module toplevel(clock,reset);
  input clock;
  input reset;

  reg flop1;
  reg flop2;

  always @ (posedge reset or posedge clock)
    if (reset)
      begin
        flop1 <= 0;
        flop2 <= 1;
      end
    else
      begin
        flop1 <= flop2;
        flop2 <= flop1;
      end
endmodule

Нижче наведено опис дискретного автомату для керування світлофором. Для реалізації затримок під час роботи світлофору використовується модель затримок. Затримка в кожній вершині темпороального графу реалізується за допомогою петель, умовою для яких є підрахунок числа тактів. Затримка реалізується за допомогою зациклювання у стані. Зациклювання відбувається доки лічильник тактів не досягне значення затримки.

  1 module fsm(input clk, reset, st, onn, output R, Y, G);
  2 	
  3   	localparam [2:0]
  4       a1 = 3'b000,
  5       a2 = 3'b001,
  6       a3 = 3'b010,
  7       a4 = 3'b011, 
  8       a5 = 3'b100;
  9   
 10   	reg [2:0] state, nextState;
 11 	reg [2:0] count, count1;
 12 	
 13 	localparam T1 = 3'b010;
 14 	localparam T2 = 3'b101;
 15 	
 16 	
 17 	always@(posedge(clk))
 18 		begin
 19 			
 20 			if(reset) begin
 21 					state = a1;
 22 					count = 3'b000;
 23 				end
 24 			else 
 25 				begin
 26 					state = nextState;
 27 					count = count1;
 28 					
 29 				end
 30 			
 31 		end	
 32 	
 33 	always_comb 
 34 	begin
 35 		case(state)
 36 			
 37 			a1: begin
 38 					if(count < T1 - 1) begin
 39 							nextState = a1;
 40 							count1 = count1 + 1'b1;
 41 						end						
 42 					else if(onn) begin
 43 							nextState = a2;
 44 							count1 = 3'b000;			
 45 						end	
 46 					else 
 47 						begin				
 48 							nextState = a1;
 49 							count1 = 3'b000;		
 50 						end	
 51 				end
 52 			
 53 			a2: begin
 54 					if(count < T1 - 1) begin
 55 							nextState = a2;
 56 							count1 = count1 + 1'b1;
 57 						end						
 58 					else if(!onn || !st) begin
 59 							nextState = a1;
 60 							count1 = 3'b000;			
 61 						end	
 62 					else 
 63 						begin				
 64 							nextState = a3;
 65 							count1 = 3'b000;		
 66 						end	
 67 				end	
 68 			   
 69 			a3: begin
 70 					if(count < T2	 - 1) begin
 71 							nextState = a3;
 72 							count1 = count1 + 1'b1;
 73 						end						
 74 					else if(!onn || !st) begin
 75 							nextState = a1;
 76 							count1 = 3'b000;			
 77 						end	
 78 					else 
 79 						begin				
 80 							nextState = a4;
 81 							count1 = 3'b000;		
 82 						end	
 83 				end		
 84 			
 85 			a4: begin
 86 					if(count < T1 - 1) begin
 87 							nextState = a4;
 88 							count1 = count1 + 1'b1;
 89 						end						
 90 					else if(!onn || !st) begin
 91 							nextState = a1;
 92 							count1 = 3'b000;			
 93 						end	
 94 					else 
 95 						begin				
 96 							nextState = a5;
 97 							count1 = 3'b000;		
 98 						end	
 99 				end		
100 			
101 			a5: begin
102 					if(count < T2 - 1) begin
103 							nextState = a5;
104 							count1 = count1 + 1'b1;
105 						end						
106 					else if(!onn || !st) begin
107 							nextState = a1;
108 							count1 = 3'b000;			
109 						end	
110 					else 
111 						begin				
112 							nextState = a2;
113 							count1 = 3'b000;		
114 						end	
115 				end		
116 				
117 			default:
118 				nextState = a1;
119 			
120 		endcase	
121 		
122 	end

ОператориРедагувати

Мова програмування Verilog підтримує наступні оператори:

Тип операторів Символ Операція
Побітові ~ Побітова інверсія
& Побітова AND
| Побітова OR
^ Побітова XOR
~^ or ^~ Побітова XNOR
Логічні ! NOT
&& AND
|| OR
Редукція (Reduction) & Reduction AND
~& Reduction NAND
| Reduction OR
~| Reduction NOR
^ Reduction XOR
~^ or ^~ Reduction XNOR
Арифметичні + Додавання
- Віднімання
- доповнення до 2
* Множення
/ Ділення
** Піднесення до степеня (*Verilog-2001)
Відносні > Більше
< Менше
>= Більше або дорівнює
<= Менше або дорівнює
== Логічна рівність
!= Логічна нерівність
=== 4-state логічна рівність
!== 4-state логічна нерівність
Зсув >> Логічний зсув вправо]]
<< Логічний зсув вліво
>>> Арифметичний зсув вправо (*Verilog-2001)
<<< Арифметичний зсув вліво (*Verilog-2001)
Конкатенація {, } Конкатенація
Реплікація {n{m}} Реплікація значення m n разів
Умовні ? : Умова

Див. такожРедагувати

ПосиланняРедагувати