Konwencje językowe Verilog

Transkrypt

Konwencje językowe Verilog
Konwencje językowe Verilog-a
APSC
Podstawowe konwencje są takie same jak w C. Elementami języka są:
komentarze, ograniczniki, liczby, ciągi znaków, identyfikatory i słowa
kluczowe. Verilog rozróżnia małe i duże litery. Słowa kluczowe pisane są
małymi literami.
Spacje
Spacje \b, tabulatory \t i zakończenia linii \n. Są ignorowane za wyjątkiem sytuacji gdy
rozdzielają elementy języka. Wewnątrz stringów nie są ignorowane.
Komentarze
Jedna linia – zaczyna się od //
Wiele linii – od /* do */. Nie mogą być zagnieżdżane.
Operatory
Jednoargumentowe, dwuargumentowe, trójargumentowe
a = ~b;
A = b && c;
A = b ? C : d;
Konwencje językowe Verilog-a
APSC
Liczby (1 z 3)
Z wymiarem: <rozmiar>’<format><liczba>
<rozmiar> - liczba dziesiętna określająca ilość bitów w liczbie
<format> - D lub d – dziesiętny
H lub h – szesnastkowy
B lub b – dwójkowy
O lub o – ósemkowy
<liczba> - sekwencja znaków od 1 do f. Małe i duże litery są nierozróżnialne.
4’b111
//czterobitowa liczba dwójkowa
12’habc //dwunastobitowa liczba szesnastkowa
16’d255 //szesnastobitowa liczba dziesiętna
Bez wymiaru:
Jeżeli nie podajemy <rozmiar> to liczba ma 32 bity długości (lub więcej o ile pozwala na
to symulator i maszyna)
Jeżeli nie podajemy <format> to liczba jest dziesiętna.
23456
’habc
’o255
//32-bitowa liczba dziesiętna
//32-bitowa liczba szesnastkowa
//32-bitowa liczba dziesiętna
Konwencja językowe Verilog-a
APSC
Liczby (2 z 3)
Wartości x lub z:
Modelowanie rzeczywistych obwodów wymaga dwóch specjalnych wartości:
x – wartość nieokreślona (nieznana)
z – wartość wysokiej impedancji
Symbole te określają 4-bity w zapisie szesnastkowym, 3 – w ósemkowym, 1 – w dwójkowym.
Jeżeli wartości 0, x, z występują na najbardziej znaczącym miejscu, to liczba jest rozszerzana
na wyższe bity także przez 0, x, z odpowiednio.
12’h13x //12-bitowa liczba szesnastkowa z 4 ostatnimi bitami nieokreślonymi
6’hx
//6-bitowa liczba szesnastkowa nieznanej wartości
32’bz
//32-bitowa liczba o wysokiej impedancji
Ujemne:
Do wyrażenia ujemnej liczby Verilog stosuje notację uzupełnienia do dwóch.
Określa się je przez dodanie znaku minus przed rozmiarem liczby.
Stosowanie znaku minus pomiędzy formatem a liczbą jest niepoprawne.
-6’d3
6’d-2
//6-bitowa liczba ujemna przechowywana jako uzupełnienie do 2 liczby 3
//błędna specyfikacja
Uzupełnienie do dwóch
APSC
Definicja ogólna:
Uzupełnieniem do p dla n-cyfrowej liczby N o podstawie p jest liczba:
n
p -N
Wyrażenie to możemy przepisać w postaci
n
n
p – N = [(p – 1) – N] + 1
Wyrażenie w nawiasie kwadratowym nazywa się uzupełnieniem do
(p – 1) dla n-cyfrowej liczby N o podstawie p.
2
Przykład: Uzupełnienie do p – 1 = 1 dla liczby N = (1001) wynosi:
n
4
(p – 1) – N = (2 – 1) – 1001 = 1111 – 1001 = 0110
Wniosek 1: W celu uzyskania uzupełnienia do 1 dla liczby dwójkowej należy
zanegować wszystkie jej cyfry.
Wniosek 2: W celu uzyskania uzupełnienia do 2 dla liczby dwójkowej należy
zanegować wszystkie jej cyfry a następnie dodać 1.
Uzupełnienie do dwóch
APSC
Uzupełnienie do 2 można również otrzymać, pozostawiając, od prawej strony
do lewej, wszystkie zera i pierwszą jedynkę bez zmian i negując pozostałe cyfry.
Przykład: Uzupełnienie do dwóch dla liczba 10010100 otrzymujemy przez:
10010 100
zanegowanie pozostawienie bez zmian
czyli wynikiem jest 01101100.
Przykład: Odjąć M = (1010)2 i N = (11001)2
M=
1010
Uzupełnienie do dwóch dla N =
Suma =
+00111
10001
Następnie należy wziąć uzupełnienie sumy i poprzedzić je znakiem minus:
(-01111)2 = 1510
Konwencja językowe Verilog-a
APSC
Liczby (3 z 3)
Znaki podkreślenia:
Można stosować w liczbach. Jego rolą jest poprawienie czytelności długich liczb. Jest ignorowany
przez Verilog.
12’b1111_0000_1010
//użycie podkreśleń dla poprawienia czytelności
Znak zapytania:
Są alternatywnym sposobem zapisywania wartości wysokiej impedancji wewnątrz liczb.
4’b10??
//równoważne do 4’b10zz
Konwencja językowe Verilog-a
APSC
Ciągi znaków
Ciąg znaków jest ciągiem jednobajtowych wartości ASCII i zamknięty jest podwójnym
cudzysłowem. Nie może zawierać znaków CR.
”Hello Verilog World”
”a / b”
Identyfikatory
Identyfikatory to nazwy nadawane obiektom w celu odwoływania się do nich z innych miejsc
projektu. Składają się ze znaków alfanumerycznych, podkreślenia(_), dolara ($) i rozróżniają
wielkość liter. Nie mogą się rozpoczynać od znaku ($) gdyż jest to zarezerwowane dla zadań
systemowych. Identyfikatory muszą być różne od słów kluczowych.
reg value;
input clk;
//reg – słowo kluczowe, value - identyfikator
//input – słowo kluczowe, clk - identyfikator
Słowa
kluczowe
Veriloga
Słowa kluczowe to identyfikatory
zarezerwowane do celu definiowania
konstrukcji językowych. Słowa
kluczowe w Verilogu pisane są
małymi literami.
package
endpackage
rtran
rtranif0
module
macromodule
rtranif1
tran
endmodule
primitive
tranif0
tranif1
endprimitive
parameter
strong0
strong1
input
output
pull0
pull1
inout
reg
weak0
weak1
integer
time
highz0
highz1
real
event
small
medium
task
endtask
large
function
endfunction
scalared
table
endtable
signed
defparam
when
assign
deassign
wire
wand
force
release
wor
tri
initial
always
triand
trior
begin
end
trireg
tri0
fork
join
tri1
supply0
if
else
case
casez
supply1
vectored
buf
not
casex
endcase
and
nand
default
forever
or
nor
repeat
while
xor
xnor
for
wait
bufif0
bufif1
posedge
negedge
notif0
notif1
edge
disable
nmos
rnmos
specparam
realtime
pmos
rpmos
strength
cmos
rcmos
attribute
endattribute
pulldown
pullup
const
use
Typy danych Veriloga
APSC
Wartość sygnału
•
•
•
•
0
1
X
Z
zero logiczne – fałsz
jedynka logiczna – prawda
wartość nieznana
wysoka impedancja, nie podłączone
Moc sygnału
Jest stosowana w układach cyfrowych dla rozwiązywania konfliktów między modułami
sterującymi ten sam węzeł układu.
Nazwa
supply0
Moc
7
Skrót
Su0
strong0
6
St0
pull0
5
Pu0
large0
4
La0
weak0
3
We0
medium0
2
Me0
small0
1
Sm0
highz
0
HiZ0
highz1
0
HiZ1
small1
1
Sm1
medium1
2
Me1
weak1
3
We1
large1
4
La1
pull1
5
Pu1
strong1
6
St1
Cztery poziomy mocy typu sterującego (driving):
supply, strong, pull, i weak.
Sygnały z mocą sterującą pochodzą z wyjść bramek i
przypisań ciągłych.
Trzy poziomy mocy typu ładunkowego (storage):
large, medium, and small.
Moce sygnału typu zachowania ładunku pochodzą z
węzłów typu trireg.
Typy danych Veriloga
APSC
Węzeł (net)
Jest to klasa typów danych takich jak:
wire, wand, wor, tri, triand, trior, trireg i inne.
Słowo net nie jest słowem kluczowym.
Węzeł reprezentuje połączenie między elementami sprzętu. Węzeł ma wartość w sposób ciągły
sterowaną przez wyjście przyrządu (driver), do którego jest połączony.
Najczęściej używanym typem węzła jest wire. Domyślną wartością węzła jest z (za wyjątkiem
węzła typu trireg).
wire a;
wire [3,0] b;
wire d = 1’b0;
//deklaracja węzła a
//deklaracja magistrali czterobitowej
//deklaracja i ustawienie na stałe wartości zero
Rejestr (reg)
Rejestr reprezentuje element przechowujący informację. Należy rozróżnić dwie rzeczy:
•
rejestr sprzętowy zbudowany z przerzutników,
•
rejestr w Verilog-u czyli zmienną utrzymującą wartość.
Rejestry w przeciwieństwie do węzłów nie potrzebują układów sterujących.
Zmienna typu reg może zmieniać wartość w każdej chwili symulacji przez przypisanie nowej
wartości (nie jest potrzebny zegar jak w rejestrze sprzętowym).
Domyślną wartością zmiennej typu reg jest x.
reg reset;
initial
begin
reset = 1’b1;
#100 reset = 1’b0;
end
//deklaracja zmiennej reset
//inicjacja zmiennej reset na 1
//po 100 jednostkach czasu reset jest zerowany
Typy danych Veriloga
APSC
Wektory
Węzły i dane typu reg mogą być deklarowane jako wektory.
Nawiasy kwadratowe pomiędzy słowem kluczowym a nazwą zmiennej określają ilość bitów i
ich kolejność. Pierwsza liczba w nawiasach zawsze oznacza najbardziej znaczący bit.
wire a;
wire [7:0] bus;
wire [31:0] busA, busB, busC;
reg clock;
reg [0:40] virtual_addr;
//deklaracja węzła a
//deklaracja magistrali 8-bitowej bus
//trzy magistrale 32-bitowe
//skalarny rejestr
//wektor rejestrowy 41-bitowy
Jak odwoływać się do tak zadeklarowanych zmiennych?
busA[7]
bus[2:0]
bus[0:2]
//najbardziej znaczący bit magistrali busA
//trzy najmniej znaczące bity wektora bus
//niepoprawne odwołanie – gdyż najbardziej znaczący bit
//zawsze musi stać po lewej stronie zakresu specyfikacji
virtual_addr[0:1] //dwa najbardziej znaczące bity wektora virtual_addr
Typy danych Veriloga
APSC
Typ rejestrowy integer
Wartości typu reg są bez znaku (unsigned). Wartości typu integer są ze znakiem (signed).
Wygodniejsze np. do zliczania.
Typowa szerokość: 32 bity.
integer counter;
initial
counter = -1;
//deklaracja zmiennej counter
//-1 wpisano do counter
Typ rejestrowy real
Liczby rzeczywiste mogą być w notacji dziesiętnej (decimal) lub naukowej (scientific).
Kiedy wartość zmiennej real jest przypisywana do zmiennej typu integer jest ona
zaokrąglana do najbliższej wartości całkowitej.
real delta;
initial
delta = 4e10;
delta = 2.13;
end
integer i;
initial
i = delta;
//deklaracja zmiennej rzeczywistej
//przypisanie w notacji naukowej
//przypisanie w notacji dziesiętnej
//i otrzymuje wartość 2 (zaokrąglone 2.13)
Typy danych Veriloga
APSC
Typ rejestrowy time
Symulacje prowadzone są względem czasu symulacji. Jest on przechowywany w specjalnym
rejestrze time. Jest on co najmniej 64-bitowy.
Funkcja systemowa $time służy do określania bieżącego czsu symulacji.
Czas symulacji jest mierzony w sekundach symulacyjnych. Związanie tego czasu z
rzeczywistym czasem upływającym w prawdziwym układzie cyfrowym odbywa się przez
zdefiniowanie skali czasowej. Można to zrobić oddzielnie dla każdego modułu za pomocą
dyrektywy kompilatora `timescale.
time save_sim_time;
initial
save_sim_time = $time;
//deklaracja zmiennej czasowej
//zapamiętaj bieżący czas symulacji
Typy danych Veriloga
APSC
Tablice (arrays)
W Verilogu możliwe są tylko tablice jednowymiarowe. Należy je odróżnić od wektorów.
Wektor to element n-bitowy, podczas gdy tablica jest obiektem wieloelementowym złożonym z
1- lub n-bitowych elementów.
integer count[0:7]
reg bool[31:0]
time chk_point[1:100]
reg [4:0] port_id[0:7]
count[5]
chk_point[100]
port_id[3]
//zmienna
//zmienna
//tablica
//tablica
tablicowa o 8-u elementach integer
tablicowa o 32-u elementach reg
100 punktów czasowych
8 wektorów 5-bitowych typu reg
//warość 5-ego elementu w tablicy count
//warość 100-ego elementu czasowego w tablicy chk_point
//5-bitowa wartość 3-ego elementu w tablicy port_id
Pamięci (memories)
Są to tablice rejestrów. Każdy element tablicy to jedno słowo.
Słowo jest dostępne poprzez adres, którym jest indeks tablicy.
reg mem1bit[0:1023]
//pamięć o pojemności 1K 1-bitowych słów
reg [7:0] membyte[0:1023] //pamięć o pojemności 1K 8-bitowych słów
membyte[511]
//pobranie 1 bajtowego słowa spod adresu 511
Typy danych Veriloga parameter
Parametry
APSC
Stałe definiowane w module. Parametry nie mogą być używane jak zmienne. Umożliwiają
indywidualizację realizacji modułów przez nadpisywanie zwartości parametrów w czasie
kompilacji. Robi się to na dwa sposoby.
Wykorzystanie parameter przy użyciu komendy defparam
Każdy parametr może być w ten sposób nadpisywany w module wielokrotnie.
//definicja modułu hello_world
module hello_world()
parameter id_num = 0;
//definicja numeru id modułu z wartością 0
initial
//wyświetlanie numeru id
$display(”Wyświetlam numer id = %d”, id_num);
endmodule
//definicja modułu top
module top
//zmiana wartości id_num w urealnianych modułach za pomocą defparam
//wykorzystano nazwy hierarchiczne
defparam w1.id_num=1, w2.id_num=2;
//dwie realizacje modułu hello_world
hello_world w1();
hello_world w2();
endmodule
Wynik symulacji:
Wyświetlam numer id = 1
Wyświetlam numer id = 2
Typy danych Veriloga parameter
APSC
Wykorzystanie parameter przez przypisywanie wartości w czasie
urealniania modułu
//inaczej napisany top moduł
module top
//dwie realizacje modułu hello_world z różnymi wartościami jedynego parametru
hello_world #(1) w1(); //wartość 1 dla parametru id_num w realizacji w1
hello_world #(2) w2(); //wartość 2 dla parametru id_num w realizacji w2
endmodule
Jeżeli w module zdefiniowana wiele parametrów to przy urealnianiu należy przestrzegać ich
kolejności definiowania. Jeżeli wartość nie jest podawana to obowiązuje wartość domyślna z
definicji modułu.
//definicja modułu
module bus_master
parameter delay1 = 2;
parameter delay2 = 4;
parameter delay3 = 7;
...
<wnętrze modułu>
...
endmodule
//top moduł
module top
bus_master #(4,5,6) b1();
//delay1 = 4, delay2 = 5, delay3 = 6
bus_master #(9,5) b2(); //delay1 = 9, delay2 = 5, delay3 = 7(domyślne)
endmodule
Typy danych Veriloga string
APSC
Ciągi znaków (stringi)
Mogą być przechowywane w rejestrach reg. Rejestr musi być odpowiedniej długości. Każdy
znak to 1 bajt. Jeśli rejestr jest za długi to z lewej strony string jest uzupełniany zerami. Jeśli
jest za krótki to znaki z lewej strony są obcinane. Verilog nie przechowuje znaku zakończenia
stringu, więc nie jest potrzebny dodatkowy bit.
module string_test;
reg [8*14:1] stringvar;
//deklaracja zmiennej o szerokości 14 bajtów
initial
begin
stringvar = ”Hello world”;
//mieści się z zapasem trzech znaków
$display(“%s is stored as %h”,stringvar,stringvar);
stringvar = {stringvar,”!!!”};
$display(“%s is stored as %h”,stringvar,stringvar);
end
endmodule
Przykład dodatkowo demonstruje manipulacje na stringach za pomocą operatora dołączania
(concatenation). Rezultatem wykonania tego modułu jest:
Hello world is stored as 00000048656c6c6f20776f726c64
Hello world!!! is stored as 48656c6c6f20776f726c64212121
Typy danych Veriloga string
APSC
Znaki specjalne w stringach – mogą być wyświetlane w stringach jeśli są poprzedzone znakiem
backslash (\),
\n
Znak nowej linii
\t
Znak tabulacji
\\
slash
\”
Podwójny cudzysłów
\ooo
%%
Znak zapisany jako 1 do 3
cyfrowa liczba oktalna
Znak procenta
Zadania
systemowe
Zadania systemowe (system task)
APSC
Wywołuje się w postaci $<słowo_kluczowe>
Wyświetlanie informacji
$display(p1, p2, ..., pn);
$write(p1, p2, ..., pn);
p1, p2, ..., pn – zmienne, wyrażenia, ciągi znaków ujęte w cudzysłów
Różnica między $display a $write polega na tym, że pierwszy na końcu stringu domyślnie
wstawia koniec linii a drugi nie. Dla wyświetlenie kilku stringów w jednej linii używamy $write .
%h lub %H
heksadecymalnie
%d lub %D
dziesiątkowo
%o lub %O
oktalnie
%b lub %B
binarnie
%c lub %C
znak ASCII
%v lub %V
moc sygnału w węźle
%m lub %M
nazwy hierarchiczne
%s lub %S
stringi
%t lub %T
bieżący czas
%f lub %F
liczby rzeczywiste w sposób dziesiętny
%e lub %E
liczby rzeczywiste w sposób wykładniczy
%g lub %G
liczby rzeczywiste w sposób dziesiętny lub
wykładniczy, tak aby było krócej
Zadania systemowe
$display
APSC
module disp;
initial
begin
$display("\\\t%%\n\"\123");
end
endmodule
Verilog-XL wyświetli:
Highest level modules:
disp
\ %
"S
module printval;
reg [11:0] r1;
initial
begin
r1 = 10;
$display( "Printing with maximum size - :%d: :%h:",r1,r1 );
$display( "Printing with minimum size - :%0d: :%0h:",r1,r1 );
end
endmodule
Verilog-XL wyświetli:
Highest level modules:
printval
Printing with maximum size - : 10: :00a:
Printing with minimum size - :10: :a:
6 simulation events
Zadania systemowe
$display
module disp;
reg [31:0] rval;
pulldown (pd);
initial
begin
rval = 101;
$display("rval = %h hex %d decimal",rval,rval);
$display("rval = %o octal %b binary",rval,rval);
$display("rval has %c ascii character value",rval);
$display("pd strength value is %v",pd);
$display("current scope is %m");
$display("%s is ascii value for 101",101);
$display("simulation time is %t", $time);
end
endmodule
Verilog-XL wyświetli:
Highest level modules:
disp
rval = 00000065 hex 101 decimal
rval = 00000000145 octal 00000000000000000000000001100101 binary
rval has e ascii character value
pd strength value is StX
current scope is disp
e is ascii value for 101
simulation time is 0
APSC
Zadania systemowe
$monitor
APSC
Monitorowanie informacji
$monitor(p1, p2, ..., pn);
p1, p2, ..., pn – zmienne, nazwy sygnałów, ciągi znaków ujęte w cudzysłów
W sposób ciągły monitoruje wartości zmiennych i sygnałów i wyświetla ich wartości w momentach
zmiany choć jednego z parametrów. Zadanie to wystarczy wywołać tylko raz. Drugie wystąpienie
zadania $monitor powoduje deaktywację poprzedniego.
Dwa pomocnicze zadania systemowe:
$monitoron;
aktywacja zadania $monitor (domyślne)
$monitoroff;
deaktywacja zadania $monitor
//monitorowanie wartości czasu i sygnałów zegara i resetu
initial
begin
$monitor($time, ”Wartości sygnałów clock = %b reset = %b”, clock, reset);
end
0 Wartości sygnałów clock = 0 reset = 1
5 Wartości sygnałów clock = 1 reset = 1
10 Wartości sygnałów clock = 0 reset = 0
Zadania systemowe
$stop $finish
APSC
Zatrzymywanie symulacji
$stop
Zawiesza symulację i wprowadza tryb interaktywny np. w celu analizy sygnałów w projekcie.
Zakańczanie symulacji
$finish
Kończy symulację.
Dyrektywy kompilatora
`define
APSC
Dyrektywy kompilatora
Definiuje się w postaci `<słowo_kluczowe>
Definiowanie makra tekstowego
`define <nazwa_makro> <wartość>
Rola i działanie podobne jak #define w C.
//definicja makra określającego domyślną długość słowa
//wywołanie: `WORD_SIZE
`define WORD_SIZE 32
//alias – gdziekolwiek pojawi się `S wstawione zostanie $stop
`define S $stop
//często używany ciąg znaków
`define WORD_REG reg [31:0]
//definicja 32-bitowego rejestru: `WORD_REG reg32;
Dyrektywy kompilatora
`include
Wstawianie pliku źródłowego
`include <nazwa_pliku>
Rola i działanie podobne jak #include w C.
//wstaw plik header.v zawierający deklaracje
`include header.v
...
<kod Verilog’a>
...
APSC

Podobne dokumenty