Verilog
Verilog HDL (англ. Verilog Hardware Description Language) — мова опису апаратури (HDL), що використовується для опису та моделювання електронних систем. Verilog HDL не слід плутати з VHDL (конкуруюча мова), найбільш часто використовується у проектуванні, верифікації і реалізації (наприклад, у вигляді НВІС) аналогових, цифрових та змішаних електронних систем на різних рівнях абстракції. Розробники Verilog зробили його синтаксис дуже схожим на синтаксис мови C, що спрощує його освоєння. Verilog має препроцесор, дуже схожий на препроцесор мови C, і основні керуючі конструкції Слід зазначити, що опис апаратури, написаний мовою 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, придатна для синтезу. Модулі, які написані в межах цієї підмножини, називають Створення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 значення:
Декларація 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 слова пам`яті, кожне слово складається з 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
Нижче наведено опис дискретного автомату для керування світлофором. Для реалізації затримок під час роботи світлофору використовується модель затримок. Затримка в кожній вершині темпороального графу реалізується за допомогою петель, умовою для яких є підрахунок числа тактів. Затримка реалізується за допомогою зациклювання у стані. Зациклювання відбувається доки лічильник тактів не досягне значення затримки. module fsm(input clk, reset, st, onn, output R, Y, G);
localparam [2:0]
a1 = 3'b000,
a2 = 3'b001,
a3 = 3'b010,
a4 = 3'b011,
a5 = 3'b100;
reg [2:0] state, nextState;
reg [2:0] count, count1;
localparam T1 = 3'b010;
localparam T2 = 3'b101;
always@(posedge(clk))
begin
if(reset) begin
state = a1;
count = 3'b000;
end
else
begin
state = nextState;
count = count1;
end
end
always_comb
begin
case(state)
a1: begin
if(count < T1 - 1) begin
nextState = a1;
count1 = count1 + 1'b1;
end
else if(onn) begin
nextState = a2;
count1 = 3'b000;
end
else
begin
nextState = a1;
count1 = 3'b000;
end
end
a2: begin
if(count < T1 - 1) begin
nextState = a2;
count1 = count1 + 1'b1;
end
else if(!onn || !st) begin
nextState = a1;
count1 = 3'b000;
end
else
begin
nextState = a3;
count1 = 3'b000;
end
end
a3: begin
if(count < T2 - 1) begin
nextState = a3;
count1 = count1 + 1'b1;
end
else if(!onn || !st) begin
nextState = a1;
count1 = 3'b000;
end
else
begin
nextState = a4;
count1 = 3'b000;
end
end
a4: begin
if(count < T1 - 1) begin
nextState = a4;
count1 = count1 + 1'b1;
end
else if(!onn || !st) begin
nextState = a1;
count1 = 3'b000;
end
else
begin
nextState = a5;
count1 = 3'b000;
end
end
a5: begin
if(count < T2 - 1) begin
nextState = a5;
count1 = count1 + 1'b1;
end
else if(!onn || !st) begin
nextState = a1;
count1 = 3'b000;
end
else
begin
nextState = a2;
count1 = 3'b000;
end
end
default:
nextState = a1;
endcase
end
ОператориМова програмування Verilog підтримує наступні оператори:
Див. такожПосилання
|