A VERILOG HARDVER LEÍRÓ NYELV ALKALMAZÁSA A LOGIKAI SZINTÉZISBEN M.D. CILETTI Department of Electrical and Computer Engineering University of Colorado Colorado Springs, Colorado Copyright 1997 No part of these notes may be copied or reproduced in any form without the written permission of the author. A szerző írásbeli engedélye és jóváhagyása alapján átdolgozta és magyarra fordította FEHÉR BÉLA Budapesti Műszaki Egyetem Méréstechnika és Információs Rendszerek Tanszék
TARTALOM 1. rész: Bevezetés, modellek, hierarchikus tervezés, szimuláció 2. rész: Modulok felépítése, adattípusok, logikai operátorok 3. rész: Felhasználói primitívek, késleltetési modellek 4. rész: Működési leírás modellezése Verilog nyelven 5. rész: A Verilog szintézis módszereinek ismertetése
2
MODUL ELEMEK ÉS ADAT TÍPUSOK input ... output ... inout ... w ire ... tri ... .... reg ... integ er ... real ... tim e ...
w ire, re g
w ire
input
output
w ire
w ire, re g
m odul_A
m odul_B w ire
w ire, re g
w ire w ire
w ire
V iselk edési utas ítás _1 alw a ys be gin ... en d
3
A NYELVI ELEMEK ÁTTEKINTÉSE A VERILOG NYELVBEN A MODUL FOGLALJA MAGÁBA A TERV LEÍRÁSÁT • Modul elemek: • Változók • Konstansok
• Adattípusok • Primitívek • Operatorok
• • • • • •
• • • • • •
PORT DEKLARÁCIÓK VÁLTOZÓ DEKLARÁCIÓK KONSTANS DEKLARÁCIÓK ESEMÉNY DEKLARÁCIÓK PRIMITÍV HIVATKOZÁSOK MODULHIVATKOZÁSOK
FOLYTONOS ÉRTÉKADÁS VISELKEDÉSI UTASÍTÁSOK TASZK DEKLARÁCIÓK FÜGGVÉNY DEKLARÁCIÓK I/O IDŐZÍTÉS SPECIFIKÁCIÓK BEÉPÍTETT I/O
4
ADATTÍPUSOK ÉS HARDVER MODELLEK A VERILOG ADATTÍPUSOK TÁMOGATJÁK A HARDVER MODELLEZÉSÉT. • A JELEK JELLEMZŐI AZ ÉRTÉK ÉS IDŐPONT, MELYET BEÁLLÍTHAT • LOGIKAI PRIMITÍV (ELŐRE DEFINIÁLT FUNKCIÓ) • FOLYTONOS ÉRTÉKADÁS (IMPLICIT KOMBINÁCIÓS LOGIKA) • VISELKEDÉSI UTASÍTÁS (ÉRTÉK/IDŐ SZÁMÍTÁS UTJÁN) • KONKURENS HARDVER ELEMEK (primitívek, modulok, viselkedési utasítások, assign) • FIZIKAI JELLEMZŐK MEGADÁSA, pl. késleltetés, meghajtás erősség
5
ADATTÍPUSOK A VERILOG NYELVBEN CSAK ELŐRE DEFINIÁLT ADATTÍPUSOK VANNAK
A VERILOG NYELV A VÁLTOZÓK KÉT ELŐRE DEFINIÁLT CSALÁDJÁT TÁMOGATJA VÁLTOZÓK VEZETÉK VÁLTOZÓK: HUZALOK (WIREs) ADATTÁROLÓ VÁLTOZÓK: REGISZTEREK (REGs) KONSTANSOK
6
ADAT TÍPUSOK - VEZETÉKEK A vezetékek valósítják meg a strukturális kapcsolatokat. PÉLDA:
wire
control_bits;
// Deklarálja a vezetéket
CÉL: • BIZTOSÍTJA A STRUKTURÁLIS KAPCSOLATOT A TERV EGYES OBJEKTUMAI (PRIMITÍVEK ÉS MODULOK) KÖZÖTT • A FOLYTONOS ÉRTÉKADÁS UTASÍTÁSNÁL A KIMENETI JEL VÁLTOZÓJA (IMPLICIT KOMBINÁCIÓS LOGIKA) A vezeték típusú változó logikai értékét az őt meghajtó kimenet szabja meg.
7
PÉLDA: ÖSSZEKÖTŐ VEZETÉK
A
y1
y_out
B
module connect_1 ( y_out, A, B); input A, B; output y_out; wire y1; // Tulajdonképpen opcionális, a nem definiált // változók automatikusan vezetékek not (y1, A); nand (y_out, y1, B); endmodule
8
PÉLDA: A FOLYTONOS ÉRTÉKADÁS UTASÍTÁS KIMENETI VÁLTOZÓJA (IMPLICIT KOMBINÁCIÓS LOGIKA) module connect_2 ( y_out, A, B); input A, B; output y_out; wire y1; assign y1 = !A; assign y_out = y1 ~& B; endmodule • BÁRMELY VÁLTOZÁS A JOBBOLDALI VÁLTOZÓK ÁLLAPOTÁBAN AZ UTASÍTÁS AZONNALI KIÉRTÉKELÉSÉT OKOZZA, MAJD AZ ÚJ ÉRTÉK KIADÁSÁNAK ÜTEMEZÉSÉT ELŐJEGYZI A SZIMULÁTORBAN. • A FOLYAMATOS KIJELÖLŐ UTASÍTÁS (assign) BAL OLDALÁN CSAK VEZETÉK TÍPUSÚ VÁLTOZÓ LEHET.
9
FONTOSABB SZABÁLYOK EGY VEZETÉKET CSAK EGY PRIMITÍV KAPU HAJTHAT MEG VAGY EGY FOLYTONOS KIJELÖLŐ UTASÍTÁS ADHAT ÉRTÉKET NEKI. A B
w_ABC
A w_ABC vezeték változó értékét az A és B jelek állapota és a NOR kapu funkciója határozza meg. wire signal_1; assign signal_1 = signal_2 & signal 3; A signal_1 vezeték változó értékét a signal_2 és signal_3 jelek állapota és a “&” operátor (bitwise and) funkciója határozza meg.
10
ELŐRE DEFINIÁLT VEZETÉK TÍPUSOK A Verilog nyelv a vezeték típusok teljes készletét biztosítja.
VEZETÉK TÍPUSÚ VÁLTOZÓK KÜLÖNBÖZŐ ELEMEI wire tri
Egyszerű huzal az összeköttetésekhez. Huzal háromállapotú busz kapcsolat megvalósításához.
wand wor
Meghajtó huzalozott-ÉS logika realizálásához. Meghajtó huzalozott-VAGY logika realizálásához.
triand trior
WAND háromállapotú kimenettel. WOR háromállapotú kimenettel.
11
ELŐRE DEFINIÁLT VEZETÉK TÍPUSOK (folyt.)
supply0
Logikai “0”, kapcsolat a tápfeszültség GND-hez. Globális hálózat.
supply1
Logikai “1”, kapcsolat a tápfeszültség VCC-hez. Globális hálózat.
tri0 tri1
Buszkapcsolat “0”-ra húzó ellenállással. Buszkapcsolat “1”-re húzó ellenállással.
trireg
Buszkapcsolat a fizikai huzal tároló kapacitását modellezve.
Megjegyzés: Csak az utóbbi tárol értéket, a többit folyamatosan meg kell hajtani.
12
ELŐRE DEFINIÁLT TÁROLÓ TÍPUSOK A Verilog nyelv különböző tároló típusok használatát támogatja.
ADATTÁROLÓ VÁLTOZÓK reg
Logikai értékek tárolásához
integer
Eljárások lokális változóinak tárolásához
time
A szimulációs idő rendszerváltozója
real
Valós értékek (pl. késleltetési idők) tárolásához
A VERILOG NYELV NEM TÁMOGAT FELHASZNÁLÓ ÁLTAL DEFINIÁLT ADATTÍPUSOKAT. A regiszter változók csak viselkedési utasításokban kaphatnak értéket.
13
PÉLDA: LOGIKAI ÉRTÉK TÁROLÁSA A regiszter típusú változók csak viselkedési leírások eljárásaiban (initial, always) kaphatnak értéket, a megfelelő szekvenciális utasítás végrehajtása során. A felvett értéket megtartják, amíg egy másik utasítás azt nem módosítja. module value_storage ( ... ); reg [2:0] hold_something; // 3 bit ... initial begin hold_something = ... ; ... end ... endmodule
// Értékadás eljárásban
14
PÉLDA: A SZEKVENCIÁLIS SZÁMÍTÁSOK TÁMOGATÁSA A regiszter típusú változók támogatják a procedurális (szekvenciális) számítást egy viselkedési leíráson belül. module procedural_comp ( A, num_one); input [15:0] A; output num_one; integer counter; reg [4:0] num_one; ... always @ (A) begin for ... counter = ... // ciklusszámláló num_one = ...; end endmodule
15
A KAPUK MEGHAJTÁS ERŐSSÉGÉNEK DEFINIÁLÁSA A Verilog primitívekhez (opcionálisan) különböző meghajtáserősségeket rendelhetünk. Strength Strength Element Declaration Printed Name Level Modeled Abbreviation Abbreviation --------------------------------------------------------------------------------------------------------------Supply Drive 7 Power supply supply Su Strong Drive
6
Default gate and assign output strength
strong
St
Pull drive
5
Gate and assign output strength
pull
Pu
Large Capacitor
4
Size of trireg net capacitor
large
La
Weak Drive
3
Gate and assign output strength
weak
We
16
A KAPUK MEGHAJTÁS ERŐSSÉGÉNEK DEFINIÁLÁSA (folyt.) Strength Strength Element Declaration Printed Name Level Modeled Abbreviation Abbreviation ---------------------------------------------------------------------------------------------------------------Medium 2 Size of trireg medium Me Capacitor net capacitor Small Capacitor
1
Size of trireg net capacitor
small
Sm
High Impedance
0
Not applicable
highz
Hi
Megjegyzés:
1. A meghajtáserősség alapértéke a strong drive. 2. Meghajtáserősséget a következő primitívekhez rendelhetünk: and
or
xor
buf
bufif0
bufif1
pullup
nand
nor xnor not
notif0
notif1
pulldown
17
A VERILOG NYELV LOGIKAI RENDSZERE
18
NÉGY ÉRTÉKŰ LOGIKAI RENDSZER A Verilog nyelv egy négyértékű, előre definiált logikai rendszert valósít meg A VERILOG NYELV ELŐRE DEFINIÁLT LOGIKAI ÉRTÉKEI 0
Logikai 0, vagy HAMIS (FALSE) feltétel
1
Logikai 1, vagy IGAZ (TRUE) feltétel
x
Határozatlan, nem definiált logikai érték (0 vagy 1)
z
Nagyimpedanciás állapot
A VEZETÉKEK LOGIKAI ÉRTÉKÉT AZ ŐKET MEGHAJTÓ PRIMITÍV KAPU KIMENETE VAGY A FOLYTONOS KIJELÖLŐ UTASÍTÁS ÉRTÉKE HATÁROZZA MEG.
19
PÉLDA: VEZETÉKEK LOGIKAI ÉRTÉKE enable A B
5 ns
y1
1 ns
y2
module ... ... nand #5 (y1, A, B); bufif1 #1 (y2, enable, y1); endmodule Működés: Ha A = 1 és B = 1 akkor 5 ns múlva y1 = 0 Ha enable = 0 akkor 1 ns múlva y2 = z (Kikapcsol) A szimulációk során minden változó kezdeti értéke x (t=0-ban). 20
VEZETÉKTÍPUSOK DEKLARÁCIÓJÁNAK SZINTAKTIKÁJA Vezeték_típus töltéserősség indextartomány késleltetés nevek listája; Megjegyzés: 1. Töltéserősség csak a trireg primitívhez adható meg. 2. A vezeték késleltetés megadása opcionális. 3. A vezetékek alapértelmezésben skalárok. 4. Az indextartomány megadása: [3:7]. 5. Az indexértékek megadása kifejezésekkel is lehetséges. 6. A baloldali érték definiálja a legnagyobb helyiértéket (MSB), függetlenül a két érték relatív nagyságától.
21
PÉLDA: VEZETÉK DEKLARÁCIÓK wire [7:0] data_bus ; wire [0:word_size -1] control_bus; wire y1, z_5, ...; wand A,B,C; trior [31:0] Abus1, Abus2; wire #5 x_sig1;
// Vezeték deklaráció késleltetéssel
trireg (medium) node1, node2, node3;
22
VÁTOZÓK DEKLARÁCIÓJA wire tri [7:0] supply1 supply0 wand
y1, z_5; some_bus; Pwr; Gnd; A,B,C;
// y1 és z_5 skalár vezetékek delarációja // Háromállapotú 8 bites busz delarációja. // Tápfesz (logikai 1) delarációja. // Föld (logikai 0) delarációja. // Három "huzalozott ÉS" vezeték delarációja.
wire [7:0] wire [0:3] reg reg [31:0]
data_bus; control_bus; A_Bit_Register; A_Word;
// 8-bites vektor, ahol data_bus[7] az MSB. // 4-bites vector, ahol control_bus[0] az MSB. // 1-bites tároló regiszter. // 32-bites adat tároló regiszter.
23
VEKTORVÁLTOZÓK HASZNÁLATA A Verilog nyelv változói azonosítójukkal érhetők el. data_bus[5]
// A data_bus 5-ös indexü bitje. (Bit-kiválasztás)
data_bus[3:5]
// A data_bus 3-5-ig terjedő bitjei. (Tartomány kiválasztás)
data_bus[k+2]
// Bit kiválasztás, ahol k+2 kifejezés a bit indexe. // k fordításidejű konstans!
24
NYELVI ESZKÖZÖK A TÖBBSZÖRÖS MEGHAJTÁS REALIZÁLÁSÁRA Helyes megoldás wand C; nor (C, A, B); not (C, X1);
A B C X1
ROSSZ megoldás (Compiler Error Message) wire C; nor (C, A, B); not (C, X1); ERROR/WARNING: MULTIPLE DRIVERS ON NET OF TYPE WIRE
25
A VEZETÉKEK TÍPUSÁNAK ALAPBEÁLLÍTÁSA SZABÁLY: A NEM DEKLARÁLT AZONOSÍTÓK (IMPLICIT) VEZETÉKEK. PÉLDA module Nand_Latch(q, qbar, preset, clear); output q, qbar; input preset, clear; wire preset, clear, q, qbar; // Opcionális nand # 1 g1 (q, preset, qbar), g2 (qbar, clear, q); endmodule MEGJEGYZÉS: Az alapérték a fordításnál esetleg beállítható (direktíva).
26
TÁROLÓ ADATÍPUSOK FUNKCIÓ: A HARDVER TÁROLÓELEMEK ABSZTRAKCIÓJA. PÉLDA reg A_Bit_Register; reg [7:0] A_Word;
Megjegyzés: A reg típusú változó ezen kívül használható a viselkedési leírások eljárásaiban értékek átmeneti tárolására. Ezeket az átmeneti tároló elemeket a szintézis eszközök többnyire automatikusan elhagyják.
27
TÁROLÓ ADATTÍPUSOK SZABÁLYOK • REGISZTER VÁLTOZÓK CSAK ELJÁRÁS UTASÍTÁSOKBAN, TASZKOKON BELÜL, VAGY FÜGGVÉNYEKBEN KAPHATNAK ÚJ ÉRTÉKET. • A reg TÍPUSÚ VÁLTOZÓK KEZDETI DEFAULT ÉRTÉKE 'X', HATÁROZATLAN. • A reg VÁLTOZÓ NEM LEHET KÖZVETLENÜL ELŐRE DEFINIÁLT PRIMITÍV KIMENETE. • A REGISZTEREK MEGTARTJÁK ÉRTÉKÜKET A KÖVETKEZŐ ÉRTÉKADÁSIG. • A VÁLTOZÓ MÉRET ALAPÉRTÉKE 1 BIT. • EGY MODUL BEMENETI PORTJA NEM LEHET reg TÍPUSÚ. • EGY MODUL BE-/KIMENETI (I/O) PORTJA NEM LEHET reg TÍPUSÚ. .
28
VEKTOR VÁLTOZÓK HASZNÁLATA SZABÁLYOK 1. MINDIG A TARTOMÁNY KIVÁLASZTÁS BAL OLDALI ELEME AZ MSB, A JOBB OLDALI AZ LSB. 2. A DEFINIÁLT HATÁRON KÍVÜLI ELEMEK ÉRTÉKE 'x'. 3. A TARTOMÁNY KIJELÖLÉSRE KONSTANS KIFEJEZÉSEK HASZNÁLHATÓK. PÉLDA vect[7:0]
0
0 1
0 0
1 0 0 vect[7:0] értéke 36
0 1 0 1
0 0 1 0
0 vect[3:0] értéke 4 vect[5:1] értéke 18
0 0 1 0 vect[0:3] értéke 2
Vect[addr] értéke “x”, ha az addr a definiált tartományon kívül esik.
29
MEMÓRIÁK: KÉTDIMENZIÓS ADATTÖMBÖK A VERILOG NYELV (KORLÁTOZOTTAN) TÁMOGATJA A KÉTDIMENZIÓS ADATTÖMBÖKET ÁLTALÁNOS FORMÁTUM reg szószélesség azonosító memóriaméret
...
word_size 0
1023
0 array_depth
31
...
... reg [31:0] cache_memory [0:1023]; reg [31:0] a_word_register; reg [7:0] instr_register; ...
KORLÁTOZÁS: A MEMÓRIÁBAN KÖZVETLENÜL BIT VAGY BITTARTOMÁNY KIVÁLASZTÁS NEM LEHETSÉGES.
30
MEMÓRIÁK: KÉTDIMENZIÓS ADATTÖMBÖK SZABÁLYOK: 1. BIT ÉS TARTOMÁNYKIVÁLASZTÁS NEM LEHETSÉGES 2. CSAK TELJES MEMÓRIASZAVAK HOZZÁFÉRHETŐK.
PÉLDA HELYES HASZNÁLATRA
a_word_register = cache_memory[17]; ... instr_register[k] = a_word_register [k+4]; ...
15
...
0
...
0
a_word_register[k+4]
cache_memory[17]
...
reg [15:0] cache_memory [0:1023]; reg [15:0] a_word_register; reg [7:0] instr_register; ... // az aktív eljárás utasításai
1023
31
MEMÓRIÁK: KÉTDIMENZIÓS ADATTÖMBÖK NEM MEGENGEDETT HASZNÁLAT
instr_register = cache_memory [0:4]; 15
...
0
...
0
a_word_register[k+4]
...
cache_memory[17]
1023
32
AZ EGÉSZ (INTEGER) ADATTÍPUS FUNKCIÓ:
AZ ELJÁRÁSOK LOKÁLIS VÁLTOZÓINAK MEGVALÓSÍTÁSA INTEGER A rendszer 32 bites változóként tárolja Operátorai kettes komplemens aritmetikát realizálnak MSB egyúttal az előjelet is jelzi PÉLDÁK integer A1, K, Size_of_Memory; integer loop_index [1:100]; // A változó nincs inicializálva
33
AZ IDŐ (TIME) ADATTÍPUS FUNKCIÓ: AZ ELJÁRÁSOKBAN SZÜKSÉGES IDŐFÜGGŐ MŰVELETEK MEGVALÓSÍTÁSÁT TÁMOGATJA. CSAK SZIMULÁCIÓBAN!! PÉLDÁK time T_samples [1:100]; // implicit méret 64 bit time A_Time_Value; … A_Time_Value = $time; … T_samples[42] = $time; FONTOS AZ IDŐ (time) TÍPUSÚ VÁLTOZÓ NEM LEHET SEM MODUL PORT, SEM PRIMITIVE KAPU KI-/ BEMENETE
34
VÁLTOZÓK ÉRTÉKADÁSA ÉRTÉKADÁS MÓDJA VÁLTOZÓ TÍPUSA
PRIMITÍV FOLYTONOS KAPU KIJELÖLÉS KIMENETE UTASÍTÁS
ELJÁRÁS UTASÍTÁS
FOLYTONOS KIJELÖLÉS ELJÁRÁSBAN NEM
VEZETÉK VÁLTOZÓ
IGEN
IGEN
NEM
REGISZTER VÁLTOZÓ
NEM
NEM
YES
assign ... deassign
IGEN assign ... deassign
A VERILOG NYELVBEN MINDEN VÁLTOZÓ STATIKUS VÁLTOZÓ.
35
ADATTÍPUSOK HASZNÁLATA MODUL PORTOKON
PORT MÓD VÁLTOZÓ TÍPUS
input
output
inout
VEZETÉK VÁLTOZÓ
IGEN
IGEN
IGEN
REGISZTER VÁLTOZÓ
NEM
IGEN
NEM
36
VÁLTOZÓK ÉRVÉNYESSÉGE MINDEN VÁLTOZÓ LOKÁLIS ÉRVÉNYŰ, ARRA A MODULRA, TASZKRA, FÜGVÉNYRE VAGY ELNEVEZETT BLOKKRA, AHOL DEKLARÁLTÁK .
parent_module NET or REGISTER
NET
NET
NET
NET or REGISTER
NET
child_module
37
VÁLTOZÓK ÉRVÉNYESSÉGE Add_full formal
formal
actual c_in
a
a a
sum Add_half
b
b
b
(a ⊕ b)
c_out
w3
(a ⊕ b) c_in
c_out
M2
c_out M1
sum
sum Add_half
w1
(a ⊕ b) ⊕ c_in
(a + b) c_in + ab
w2
module Add_full (sum, c_out, a, b, c_in); input a, b, c_in; output c_out, sum; wire w1, w2, w3, w4;
ab
module Add_half (sum, c_out, a, b); input a, b; output c_out, sum; assign {c_out, sum} = a + b; endmodule
Add_half M1 (w1, w2, a, b); Add_half M2 (sum, w3, w1, c_in); or (c_out, w2, w3); endmodule 38
HIERARCHIKUS HIVATKOZÁSOK A változók vagy konstansok a terv hierarchia bármely pontjáról hivatkozhatók. Hivatkozható: PARAMÉTER, REGISZTER, EGÉSZ, VEZETÉK, VALÓS, IDŐ, ESEMÉNY • •
VÁLTOZÓK ÉRVÉNYESSÉGE LOKÁLIS.
HIERARCHIKUS HIVATKOZÁS A NÉVVEL ELLÁTOTT BLOKKOKBAN . PÉLDA TOP_MODULE_1.CHILD_MODULE_1.child_block_1.register_A TOP_MODULE_1 CHILD_MODULE_1 begin: child_block_1 ... end
A hierarchikus hivatkozást általában jelek megfigyelésekor használjuk.
SZÁMOK DEFINIÁLÁSA PÉLDÁK Szám
Bitek
Alap
Érék
Tárolt formátum
2'b10 3'd5 3'o5 8'o5 8'ha 3'b5 3'b01x 12'hx 8'hz 8'b0000_0001 8'b001 8'bx01 'bz
2 3 3 8 8 Érvénytelen! 3 12 8 8 8 8 nem definiált
Binary Decimal Octal Octal Hex
2 5 5 5 10
10 101 101 00000101 00001010
Binary Hex Hex Binary Binary Binary Binary
1 1 -
01x xxxxxxxxxxxx zzzzzzzz 00000001 00000001 xxxxxx01 zzzzz ....zzzzzz (32 bit)
10H = 16D
10B = 2D
10O = 8D
40
KONSTANS ADATTÍPUS A VERILOG NYELV TÁMOGATJA A reg, integer, real ÉS time TÍPUSÚ KONSTANSOKAT. parameter MS_BIT = 15; parameter j = 5, k=10; parameter mask = 8'b1100_1100; parameter byte_size = 8, byte_max = byte_size -1; parameter r = 5.7; parameter av_delay = (min_delay + max_delay)/2;
Megjegyzés: A paraméter deklaráció jobb oldalán csak korábban már definiált értékek szerepelhetnek.
41
KONSTANSOK HASZNÁLATA module Param_Examp (y_out, a, b); parameter size = 8, delay = 15; output [size-1:0] y_out; input [size-1:0] a, b; wire [size-1:0] #delay y_out; // Vezeték késleltetése // Egyéb utasítások …. endmodule
A Verilog nyelv megengedi a paraméterek felülírását közvetlenül a modul hívásakor és közvetve teljes hierarchikus hivatkozást használva.
42
PARAMÉTER ÁTADÁS KÖZVETLENÜL, MODUL HÍVÁSKOR
module modXnor (y_out, a, b); parameter size = 8, delay = 15; output [size-1:0] y_out; input [size-1:0] a, b; wire [size-1:0] #delay y_out = a~^b; endmodule module Your_Design; modXnor M1 (y1_out,b1,c1); modXnor #(4,5) M2 (y2_out,b2,c2);
// lokális definició // komplex deklaráció, xnor funkció // késleltetés definiálásával // Modulhívás default paraméterekkel // Modulhívás módosított paraméterekkel // A size=4, delay = 5 értékek érvényesek
endmodule
Megjegyzés: A paraméterek a listában sorban egymás után helyettesítődnek, a nem használt paraméter helye dupla (,,) vesszőkkel átugorható.
43
PARAMÉTER ÁTADÁS KÖZVETETT, HIERARCHIKUS HIVATKOZÁSSAL
module Your_Design; modXnor M1 (y1_out, b1, c1), M2 (y2_out, b2, c2); endmodule
// Felső színtű modul // Almodulok hívása
module modXnor (y, a, b); parameter size = 8, delay =15; output [size-1:0] y_out; input [size-1:0] a, b; wire [size-1:0] #delay y_out = a^b; endmodule
// Az almodul definiálása // Paraméterek deklarációja
module annotate; defparam Your_Design.M2.size = 4, Your_Design.M2.delay = 5; endmodule
// Független "paraméterátadó" modul // Parameter azonosítás név szerinti // hierarchikus hivatkozással
44
A VERILOG NYELV ELŐRE DEFINIÁLT NYELVI OPERÁTORAI
45
OPERÁTOROK FUNKCIÓ: MŰVELETI TÁMOGATÁS A FOLYTONOS ÉRTÉKADÁS UTASÍTÁSOK ÉS REGISZTER MÓDOSÍTÁSOK VÉGREHAJTÁSÁHOZ. {} +, -, *, / % >, >=, <, <= ! && || == != === !==
concatenation arithmetic (includes unary +, -) modulus (remainder) relational logical negation logical and logical or logical equality (ambiguity results in x) logical inequality (ambiguity results in x) case equality (includes x, z match) case inequality (includes x, z match)
46
OPERÁTOROK ~ & | ^ ~| ~^ or ^~
bit-wise negation bit-wise and bit-wise inclusive or bit-wise exclusive or bit-wise nor equivalence (bit-wise exclusive nor)
& ~& | ~| ^ ~^ or ^~
reduction and reduction nand reduction or reduction nor reduction xor reduction xnor
<< >>
left shift right shift
?:
conditional
47
OPERÁTOROK - VHDL és VERILOG VHDL
VERILOG
& same mod, rem same not and, nand1 or, nor, xor1 = /=
{} +, -, *, / % >, >=, <, <= ! && || == != === !==
concatenation arithmetic (includes unary +, -) modulus (remainder) relational negation logical and logical or logical equality (ambiguity results in x) logical inequality (ambiguity results in x) case equality (includes x, z match) case inequality (includes x, z match)
1 Csak a VHDL standard BIT, BOOLEAN típusokhoz.
48
OPERÁTOROK - VHDL és VERILOG VHDL and, nand1 or1 xor1
&(010101) = 0 |(010101) = 1
&(010x10) = 0 |(010x10) = 1
VERILOG ~ & | ^ ~& ~|
bit-wise negation bit-wise and bit-wise inclusive or bit-wise exclusive or bitwise nand bitwise nor
~^, ^~
equivalence (bit-wise exclusive nor)
& | ~| ^ ~^, ^~
reduction and reduction or reduction nor reduction xor reduction xnor
<< >> ?:
left shift right shift conditional
abs 1 Korlátozva az egy dimenziós BIT és BOOLEAN tömbökre
49
OPERANDUSOK •
VEZETÉKEK
•
REGISZTEREK
•
• •
KONSTANSOK
•
VEZETÉK VEKTOR EGY BITJE
•
•
REGISZTER VEKOR EGY BITJE
•
VEZETÉK VEKTOR BITTARTOMÁNYA REGISZTER VEKTOR BITTARTOMÁNYA MEMÓRIA CÍM FENTI ELEMEKBŐL ÖSSZEKAPCSOLÁSSAL KÉPEZETT ÚJABB VEKTOR
50
KIFEJEZÉSEK A kifejezések az operandusok előre definiált operátorok, felhasználói függvények és rendszer függvények segítségével formált kombinációi. A KIFEJEZÉSEK AZ ÉRTÉKADÁSOKHOZ ÉS A FELTÉTEL KIÉRTÉKELÉSEKHEZ KAPCSOLÓDNAK. PÉLDÁK assign THIS_SIG = a_SIG ^ b_SIG; if (A != B) Y = 10; // Két kifejezés @(SET or RESET) begin ... end if (non_zero_value) execute_statement; ha a non_zero_value kiértékelése “true”
A kifejezések mindig egy vagy több bitből álló értéket adnak vissza. 51
PÉLDÁK OPERÁTOROK HASZNÁLATÁRA ~(101011) = 010100 (010101) & (001100) = 000100
Bitwise Negation Bitwise And
(010101) | (001100) = 011101 (010101) ^ (001100) = 011001
Bitwise Or Bitwise Xor
&(010101) |(010101)
=0 =1
Reduction And Reduction Or
&(010x10) |(010x10)
=0 =1
Reduction And Reduction Or
LOGIKAI KAPCSOLATOK (a < size -1) && (b != c) && (index != last_one) if (! inword)
if (inword == 0) 52
PÉLDÁK OPERÁTOROK HASZNÁLATÁRA module shift; reg [1:0] start, result; initial begin start = 1; // Alapértelmezésben decimális result = (start << 1); end endmodule
53
SZINTAKTIKA KORLÁTOZÁSOK A && B
legal
A || B
legal
A & &B
illegal
A | |B
illegal
A & (&B)
legal
A | (|B)
legal
54
EGYENLŐSÉG OPERÁTOROK
a === b
a egyenlő b, az 'x' és 'z' értékeket is beleértve
a !== b
a nem egyenlő b, az 'x' és 'z' értékeket is beleértve
a == b
a egyenlő b, az eredmény lehet ismeretlen*
a != b
a nem egyenlő b, az eredmény lehet ismeretlen* MEGJEGYZÉSEK
•
•
•
*az ismeretlen eredmény azt jelenti, hogy lehet 'x' is AZ ÖSSZEHASONLÍTÁS BITENKÉNT TÖRTÉNIK, A RÖVIDEBB OPERANDUST NULLÁKKAL KIEGÉSZÍTVE AZ EREDMÉNY '1' HA IGAZ ÉS '0' HA HAMIS 55
LOGIKAI OPERÁTOROK SZABÁLYOK KIFEJEZÉSEK KIÉRTÉKELÉSE BALRÓL JOBBRA A KIÉRTÉKELÉS LEÁLL, HA AZ IGAZ VAGY HAMIS FELTÉTELEK BÁRMELYIKE TELJESÜL A && OPERÁTOR NAGYOBB PRECEDENCIÁJÚ MINT A || PÉLDÁK A < SIZE-1 && B!= C && INDEX != LASTONE (A < SIZE-1) && (B!= C) && (INDEX != LASTONE) if (!inword)
// gyorsabb, mint: if(inword ==0)
56
PÉLDA - A XOR OPERÁTOR IGAZSÁGTÁBLÁJA Exclusive Or (Bitwise) -------------------------------^ | 0 1 x z ------|------------------------0 | 0 1 x x | 1 | 1 0 x x | x | x x x x | z | x x x x
57
A FELTÉTELES OPERÁTOR ÁLTALÁNOS SZINTAKTIKA céloperandus = feltételkifejezés ? igaz-ág : hamis-ág; PÉLDA wire [15:0] bus_a = drive_bus_a ? data : 'bz; Működés: drive_bus_a =1; // 'data' meghajtja bus_a vonalait drive_bus_a = 0; // bus_a nagy impedanciás marad drive_bus_a = x; // bus_a határozatlan 'x' értékű lesz
58
A FELTÉTELES OPERÁTOR MEGJEGYZÉS: 1.
'z' használata feltételes kifejezésekben
2.
Az operandusokat nullákkal tölti fel, ha eltérő méretűek
3.
Ha a feltételes kifejezés bizonytalan, akor mind az igaz, mind a hamis kifejezés kiértékelésre kerül, majd az eredményt a következő táblázat szerint adja meg: -----------------------------?: | 0 1 x ------|----------------------0 | 0 x x | 1 | x 1 x | x | x x x
59
A SHIFT OPERÁTOR A SHIFT MŰVELET SORÁN FELLÉPŐ ÜRES BITEKET 0-VAL TÖLTI FEL module shifter // Példa a 0-k belépésére reg [1:0] start, result; initial begin start = 1; result = (start << 1); end endmodule PÉLDA start 00 01
result 00 10
60
AZ ÖSSZEKAPCSOLÁS (CONCATENATION) OPERÁTOR FUNKCIÓ: FÜGGETLEN JELEKBŐL LOGIKAI BUSZ KIALAKÍTÁSA.
{A, B[3:0], W, 3'b101} {A, B[3], B[2], B[1], B[0], W, 1'b1, 1'b0,1'b1} MEGJEGYZÉSEK: 1. Az összekapcsolás a Verilog nyelvben sokkal általánosabb, mint a VHDL-ben, ahol ez csak két egydimenziós tömbre vonatkozhat. 2. Az összekapcsolás a Verilog nyelvben támogatja beágyazást és ismétlést. 3. Az összekapcsolásban nem szerepelhetnek konstansok.
61
ISMÉTLŐDŐ ÖSSZEKAPCSOLÁS PÉLDÁK
{ 4 {w}} { A, B, {C,D}}
ugyanaz, mint ugyanaz, mint
{w, w, w, w} {A, B, C, D}
62
KARAKTERLÁNCOK A KARAKTERLÁNCOK TÁROLÁSÁHOZ MEGFELELŐ MÉRETŰ TÖMBÖT KELL DEKLARÁLNI.
•
8 BITES ASCII KÓD KARAKTERENKÉNT
•
reg TÍPUSÚ VÁLTOZÓ A TÁROLÁSHOZ PÉLDA
reg [8 * num_char -1 : 0] string_holder string_holder = "Hello world"; // 11 karakter 88 biten MEGJEGYZÉS: Ha num_char > 11 akkor a tároló balról nullákkal töltődik fel 63
ARITMETIKAI OPERÁTOROK
A VERILOG NYELVBEN A +, -, *, /, % (MODULUS) MŰVELETEK MIND A VEZETÉK, MIND A REGISZTER VÁLTOZÓK KÖRÉBEN ÉRVÉNYESEK PÉLDÁK
wire [31: 0] oper_A, oper_B; wire [32:0] Sum = oper_A + oper_B;
64