SystemVerilog - SystemVerilog
Paradygmat |
Zorganizowany (projekt) Zorientowany obiektowo (weryfikacja) |
---|---|
Zaprojektowany przez | Synopsys , później IEEE |
Po raz pierwszy pojawiły się | 2002 |
Wersja stabilna | IEEE 1800-2017 / 22 lutego 2018
|
Dyscyplina pisania | Statyczny , słaby |
Rozszerzenia nazw plików | .sv, .svh |
Wpływem | |
Projekt: Verilog , VHDL , C++ , Weryfikacja: OpenVera , Java |
SystemVerilog , standaryzowany jako IEEE 1800 , jest językiem opisu sprzętu i weryfikacji sprzętu używanym do modelowania, projektowania , symulacji , testowania i wdrażania systemów elektronicznych. SystemVerilog jest oparty na Verilog i niektórych rozszerzeniach, a od 2008 roku Verilog jest teraz częścią tego samego standardu IEEE . Jest powszechnie stosowany w branży projektowania półprzewodników i elektroniki jako ewolucja Verilog.
Historia
SystemVerilog rozpoczął się od przekazania języka Superlog firmie Accellera w 2002 roku przez startującą firmę Co-Design Automation. Większość funkcji weryfikacji opiera się na języku OpenVera podarowanym przez Synopsys . W 2005 roku SystemVerilog został przyjęty jako standard IEEE 1800-2005. W 2009 roku standard został połączony z podstawowym standardem Verilog (IEEE 1364-2005), tworząc IEEE Standard 1800-2009. Obecna wersja to standard IEEE 1800-2017.
Zestaw funkcji SystemVerilog można podzielić na dwie odrębne role:
- SystemVerilog do projektowania poziomu transferu rejestru (RTL) jest rozszerzeniem Verilog-2005 ; wszystkie funkcje tego języka są dostępne w SystemVerilog. Dlatego Verilog jest podzbiorem SystemVerilog.
- SystemVerilog do weryfikacji wykorzystuje rozbudowane techniki programowania obiektowego i jest bardziej związany z Javą niż Verilog. Te konstrukty generalnie nie są zdolne do syntezy.
W dalszej części tego artykułu omówiono funkcje SystemVerilog nieobecne w Verilog-2005 .
Cechy konstrukcyjne
Żywotność danych
W SystemVerilog określono dwa typy czasu życia danych: statyczny i automatyczny . Zmienne automatyczne są tworzone w momencie, gdy wykonanie programu wchodzi w zakres zmiennej. Zmienne statyczne są tworzone na początku wykonywania programu i zachowują tę samą wartość przez cały okres życia programu, chyba że podczas wykonywania zostanie przypisana nowa wartość.
Każda zmienna zadeklarowana wewnątrz zadania lub funkcji bez określenia typu zostanie uznana za automatyczną. Aby określić, że zmienna jest statyczna, umieść słowo kluczowe " static
" w deklaracji przed typem, np. " ". Słowo kluczowe „ ” jest używane w ten sam sposób.
static int x;
automatic
Nowe typy danych
Ulepszone typy zmiennych dodają nowe możliwości do typu „reg” Verilog:
logic [31:0] my_var;
Verilog-1995 i -2001 ograniczają zmienne reg do instrukcji behawioralnych, takich jak kod RTL . SystemVerilog rozszerza typ reg, dzięki czemu może być sterowany przez pojedynczy sterownik, taki jak brama lub moduł. SystemVerilog nazywa ten typ „logiką”, aby przypomnieć użytkownikom, że ma tę dodatkową możliwość i nie jest rejestrem sprzętu. Nazwy „logika” i „reg” są wymienne. Sygnał z więcej niż jednym sterownikiem (takim jak bufor trójstanowy dla wejścia/wyjścia ogólnego przeznaczenia ) musi być zadeklarowany jako typ sieci, taki jak „wire”, aby SystemVerilog mógł rozwiązać ostateczną wartość.
Wielowymiarowe spakowane tablice ujednolicają i rozszerzają pojęcie „rejestrów” i „pamięci” Veriloga:
logic [1:0][2:0] my_pack[32];
Klasyczny Verilog zezwalał na zadeklarowanie tylko jednego wymiaru po lewej stronie nazwy zmiennej. SystemVerilog zezwala na dowolną liczbę takich „zapakowanych” wymiarów. Zmienna typu upakowanej tablicy odwzorowuje 1:1 na całkowitą liczbę arytmetyczną. W powyższym przykładzie każdy element my_pack
może być użyty w wyrażeniach jako sześciobitowa liczba całkowita. Wymiary po prawej stronie nazwy (w tym przypadku 32) są określane jako wymiary „rozpakowane”. Podobnie jak w Verilog-2001 , dozwolona jest dowolna liczba wymiarów bez opakowania.
Wyliczeniowe typy danych (enums
) umożliwiają przypisywanie wartościom liczbowym znaczących nazw. Zmiennych zadeklarowanych jako typu wyliczeniowego nie można przypisać do zmiennych innego typu wyliczeniowego bez rzutowania . Nie dotyczy to parametrów, które były preferowaną techniką realizacji dla ilości wyliczanych w Verilog-2005:
typedef enum logic [2:0] {
RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW
} color_t;
color_t my_color = GREEN;
initial $display("The color is %s", my_color.name());
Jak pokazano powyżej, projektant może określić podstawowy typ arytmetyczny ( logic [2:0]
w tym przypadku), który jest używany do reprezentowania wartości wyliczenia. Meta-wartości X i Z mogą być tutaj użyte, prawdopodobnie do reprezentowania stanów niedozwolonych. Funkcja wbudowana name()
zwraca ciąg znaków ASCII dla bieżącej wartości wyliczanej, co jest przydatne podczas walidacji i testowania.
Nowe liczby całkowite : SystemVerilog definiuje byte
, shortint
, int
i longint
w dwu-stanowych podpisane integralne typy o 8, 16, 32 i 64 bitów, odpowiednio. bit
Typ to typ dwustawna zmienną szerokość, która działa podobnie logic
. Typy dwustanowe nie mają metawartości X i Z klasycznego Veriloga; praca z tymi typami może skutkować szybszą symulacją.
Struktury i związki działają podobnie jak robią w języku programowania C . Udoskonalenia SystemVerilog obejmująatrybut spakowany iatrybut oznaczony . tagged
Cecha umożliwia śledzenie wykonania, z których człon (y) do związków są w użyciu. packed
Cecha powoduje, że konstrukcja lub związków być odwzorowany w stosunku 1: 1, na kolumnę z wypełnieniem tablicy bitów. Zawartośćstruct
typów danych zajmuje ciągły blok pamięci bez przerw, podobnie jak pola bitowe w C i C++:
typedef struct packed {
bit [10:0] expo;
bit sign;
bit [51:0] mant;
} FP;
FP zero = 64'b0;
Jak pokazano w tym przykładzie, SystemVerilog obsługuje również typedefs , tak jak w C i C++.
Bloki proceduralne
SystemVerilog wprowadza trzy nowe bloki proceduralne przeznaczone do modelowania sprzętu : always_comb
(do modelowania logiki kombinacyjnej ), always_ff
(dla przerzutników ) i always_latch
(dla zatrzasków ). Podczas gdy Verilog używał pojedynczego always
bloku ogólnego przeznaczenia do modelowania różnych typów struktur sprzętowych, każdy z nowych bloków SystemVerilog jest przeznaczony do modelowania określonego typu sprzętu poprzez nałożenie ograniczeń semantycznych, aby zapewnić, że sprzęt opisany przez bloki odpowiada zamierzonemu użyciu model. Kompilator HDL lub program weryfikujący może podjąć dodatkowe kroki, aby zapewnić, że wystąpi tylko zamierzony typ zachowania.
always_comb
Modele blokowe kombinowanych logika . Symulator wnioskuje, że lista wrażliwości zawiera wszystkie zmienne z zawartych instrukcji:
always_comb begin
tmp = b * b - 4 * a * c;
no_root = (tmp < 0);
end
An always_latch
modele blokowe poziom wrażliwe zatrzaski. Ponownie lista wrażliwości jest wywnioskowana z kodu:
always_latch
if (en) q <= d;
always_ff
Wzory bloków synchroniczny układ logiczny (zwłaszcza krawędzi wrażliwych sekwencyjnego logiczny ):
always_ff @(posedge clk)
count <= count + 1;
Narzędzia do automatyzacji projektowania elektronicznego (EDA) mogą weryfikować intencje projektu, sprawdzając, czy model sprzętu nie narusza żadnej semantyki użycia bloków. Na przykład nowe bloki ograniczają przypisanie do zmiennej, zezwalając tylko na jedno źródło, podczas gdy always
blok Verilog zezwala na przypisanie z wielu źródeł proceduralnych.
Interfejsy
W przypadku małych projektów port Verilog zwięźle opisuje łączność modułu z otaczającym środowiskiem. Ale główne bloki w dużej hierarchii projektów zazwyczaj mają liczbę portów w tysiącach. SystemVerilog wprowadza koncepcję interfejsów zarówno w celu zmniejszenia redundancji deklaracji nazw portów między połączonymi modułami, jak i grupowania i abstrakcyjnych powiązanych sygnałów w pakiet zadeklarowany przez użytkownika. Dodatkową koncepcją jest modport, który pokazuje kierunek połączeń logicznych.
Przykład:
interface intf;
logic a;
logic b;
modport in (input a, output b);
modport out (input b, output a);
endinterface
module top;
intf i ();
u_a m1 (.i1(i.in));
u_b m2 (.i2(i.out));
endmodule
module u_a (intf.in i1);
endmodule
module u_b (intf.out i2);
endmodule
Funkcje weryfikacji
Poniższe funkcje weryfikacji zazwyczaj nie są możliwe do syntezy, co oznacza, że nie można ich zaimplementować w sprzęcie opartym na kodzie HDL. Zamiast tego pomagają w tworzeniu rozszerzalnych, elastycznych stanowisk testowych .
Nowe typy danych
Typ string
danych reprezentuje ciąg tekstowy o zmiennej długości . Na przykład:
string s1 = "Hello";
string s2 = "world";
string p = ".?!";
string s3 = {s1, ", ", s2, p[2]}; // string concatenation
$display("[%d] %s", s3.len(), s3); // simulation will print: "[13] Hello, world!"
Oprócz statycznej tablicy używanej w projektowaniu, SystemVerilog oferuje tablice dynamiczne , tablice asocjacyjne i kolejki :
int cmdline_elements; // # elements for dynamic array
int da[]; // dynamic array
int ai[int]; // associative array, indexed by int
int as[string]; // associative array, indexed by string
int qa[$]; // queue, indexed as an array, or by built-in methods
initial begin
cmdline_elements = 16;
da = new[ cmdline_elements ]; // Allocate array with 16 elements
end
Tablica dynamiczna działa podobnie jak tablica rozpakowana, ale ma tę zaletę, że jest dynamicznie alokowana w czasie wykonywania (jak pokazano powyżej). Podczas gdy rozmiar spakowanej tablicy musi być znany w czasie kompilacji (ze stałej lub wyrażenia stałych), tablica dynamiczna size można zainicjować z innej zmiennej środowiska uruchomieniowego, dzięki czemu tablica może być dowolnie zmieniana i zmieniana w razie potrzeby.
Tablicę asocjacyjną można traktować jako drzewo wyszukiwania binarnego z typem klucza określonym przez użytkownika i typem danych . Klucz implikuje uporządkowanie ; elementy tablicy asocjacyjnej można odczytać w porządku leksykograficznym. Wreszcie, kolejka zapewnia wiele funkcji typu deque C++ STL : elementy mogą być skutecznie dodawane i usuwane z obu końców. Te prymitywy umożliwiają tworzenie złożonych struktur danych wymaganych do tworzenia tablic wyników dużego projektu.
Klasy
SystemVerilog udostępnia model programowania zorientowanego obiektowo .
W SystemVerilog klasy obsługują model pojedynczego dziedziczenia , ale mogą implementować funkcjonalność podobną do dziedziczenia wielokrotnego poprzez użycie tak zwanych „klas interfejsu” (idealnie identyczne z interface
cechą Javy). Klasy mogą być parametryzowane według typu , zapewniając podstawową funkcję szablonów C++ . Jednak specjalizacja szablonów i szablony funkcji nie są obsługiwane.
Funkcje polimorfizmu SystemVerilog są podobne do tych z C++: programista może specjalnie napisać virtual
funkcję, aby mieć kontrolę nad wzmocnieniem funkcji przez klasę pochodną. Zobacz funkcję wirtualną, aby uzyskać więcej informacji.
Enkapsulacja i ukrywanie danych odbywa się za pomocą słów kluczowych local
i protected
, które należy zastosować do każdego elementu, który ma być ukryty. Domyślnie wszystkie właściwości klasy są public .
Instancje klas są tworzone dynamicznie za pomocą new
słowa kluczowego. Konstruktor oznaczona function new
może być zdefiniowana. SystemVerilog posiada funkcję automatycznego wyrzucania elementów bezużytecznych , więc nie ma narzędzia językowego do jawnego niszczenia instancji utworzonych przez nowego operatora .
Przykład:
virtual class Memory;
virtual function bit [31:0] read(bit [31:0] addr); endfunction
virtual function void write(bit [31:0] addr, bit [31:0] data); endfunction
endclass
class SRAM #(parameter AWIDTH=10) extends Memory;
bit [31:0] mem [1<<AWIDTH];
virtual function bit [31:0] read(bit [31:0] addr);
return mem[addr];
endfunction
virtual function void write(bit [31:0] addr, bit [31:0] data);
mem[addr] = data;
endfunction
endclass
Ograniczone losowe generowanie
Ilościom całkowitym, zdefiniowanym w definicji klasy lub jako samodzielne zmienne w pewnym zakresie leksykalnym, można przypisać wartości losowe na podstawie zestawu ograniczeń. Ta funkcja jest przydatna do tworzenia losowych scenariuszy weryfikacji .
W definicjach klas modyfikatory rand
i randc
sygnalizują zmienne, które mają zostać poddane randomizacji. randc
określa randomizację opartą na permutacji , w której zmienna przyjmuje wszystkie możliwe wartości jeden raz, zanim jakakolwiek wartość zostanie powtórzona. Zmienne bez modyfikatorów nie są losowane.
class eth_frame;
rand bit [47:0] dest;
rand bit [47:0] src;
rand bit [15:0] f_type;
rand byte payload[];
bit [31:0] fcs;
rand bit [31:0] fcs_corrupt;
constraint basic {
payload.size inside {[46:1500]};
}
constraint good_fr {
fcs_corrupt == 0;
}
endclass
W tym przykładzie fcs
pole nie jest losowe; w praktyce zostanie obliczony za pomocą generatora CRC, a fcs_corrupt
pole użyte do jego uszkodzenia w celu wstrzyknięcia błędów FCS. Przedstawione dwa ograniczenia dotyczą zgodnych ramek Ethernet . Ograniczenia mogą być włączane selektywnie; ta funkcja byłaby wymagana w powyższym przykładzie do generowania uszkodzonych ramek. Ograniczenia mogą być dowolnie złożone i obejmować wzajemne relacje między zmiennymi, implikacjami i iteracją. Narzędzie do rozwiązywania ograniczeń SystemVerilog jest wymagane do znalezienia rozwiązania, jeśli takie istnieje, ale nie daje żadnych gwarancji co do czasu, którego będzie to wymagało, ponieważ jest to ogólnie problem NP-trudny ( spełnialność logiczna ).
Metody randomizacji
W każdej klasie SystemVerilog istnieją 3 predefiniowane metody randomizacji: pre_randomize, randomize i post_randomize. Metoda randomize jest wywoływana przez użytkownika w celu randomizacji zmiennych klas. Metoda pre_randomize jest wywoływana przez metodę randomize przed randomizacją, a metoda post_randomize jest wywoływana przez metodę randomize po randomizacji.
class eth_frame;
rand bit [47:0] dest;
rand bit [47:0] src;
rand bit [15:0] f_type;
rand byte payload[];
bit [31:0] fcs;
rand bit corrupted_frame;
constraint basic {
payload.size inside {[46:1500]};
}
function void post_randomize()
this.calculate_fcs(); // update the fcs field according to the randomized frame
if (corrupted_frame) // if this frame should be corrupted
this.corrupt_fcs(); // corrupt the fcs
endfunction
endclass
Kontrolowanie ograniczeń
Do kontrolowania randomizacji używane są metody bound_mode() i random_mode(). bound_mode() służy do włączania i wyłączania określonego ograniczenia, a random_mode służy do włączania lub wyłączania randomizacji określonej zmiennej. Poniższy kod opisuje i proceduralnie testuje ramkę Ethernet :
class eth_frame;
rand bit [47:0] dest;
rand bit [47:0] src;
rand bit [15:0] f_type;
rand byte payload[];
bit [31:0] fcs;
rand bit corrupted_frame;
constraint basic {
payload.size inside {[46:1500]};
}
constraint one_src_cst {
src == 48'h1f00
}
constraint dist_to_fcs {
fcs dist {0:/30,[1:2500]:/50}; // 30, and 50 are the weights (30/80 or 50/80, in this example)
}
endclass
.
.
.
eth_frame my_frame;
my_frame.one_src_cst.constraint_mode(0); // the constraint one_src_cst will not be taken into account
my_frame.f_type.random_mode(0); // the f_type variable will not be randomized for this frame instance.
my_frame.randomize();
Twierdzenia
Asercje są przydatne do weryfikowania właściwości projektu, które pojawiają się po osiągnięciu określonego warunku lub stanu. SystemVerilog ma własny język specyfikacji potwierdzenia, podobny do języka specyfikacji właściwości . Podzbiór konstrukcji języka SystemVerilog, który obsługuje asercję, jest powszechnie nazywany SystemVerilog Assertion lub SVA.
Asercje SystemVerilog są budowane na podstawie sekwencji i właściwości . Właściwości są nadzbiorem sekwencji; dowolna sekwencja może być używana tak, jakby była właściwością, chociaż zazwyczaj nie jest to przydatne.
Sekwencje składają się z wyrażeń logicznych powiększonych o operatory temporalne . Najprostszym operatorem temporalnym jest ##
operator wykonujący konkatenację:
sequence S1;
@(posedge clk) req ##1 gnt;
endsequence
Ta sekwencja pasuje, jeśli gnt
sygnał wzrośnie jeden cykl zegara po tym, jak req
wzrośnie. Zauważ, że wszystkie operacje sekwencyjne są zsynchronizowane z zegarem.
Inne operatory sekwencyjne obejmują operatory powtórzeń, a także różne spójniki. Operatory te umożliwiają projektantowi wyrażanie złożonych relacji między komponentami projektu.
Asercja działa poprzez ciągłe próby oceny sekwencji lub właściwości. Asercja kończy się niepowodzeniem, jeśli właściwość nie powiedzie się. Powyższa sekwencja nie powiedzie się, gdy req
będzie niski. Aby dokładnie wyrazić wymagania, które gnt
następują req
po właściwości, wymagane jest:
property req_gnt;
@(posedge clk) req |=> gnt;
endproperty
assert_req_gnt: assert property (req_gnt) else $error("req not followed by gnt.");
Ten przykład pokazuje operator implikacji|=>
. Klauzula po lewej stronie implikacji nazywana jest poprzednikiem, a klauzula po prawej jest nazywana następnikiem . Ocena implikacji rozpoczyna się od wielokrotnych prób oceny poprzednika. Kiedy poprzednik się powiedzie , następuje próba użycia następnika, a powodzenie twierdzenia zależy od powodzenia następnika. W tym przykładzie następnik nie zostanie podjęty, dopóki nie osiągnie req
wysokiego poziomu, po czym właściwość zakończy się niepowodzeniem, jeśli gnt
nie będzie wysoki na następnym zegarze.
Oprócz asercji SystemVerilog obsługuje założenia i pokrycie właściwości. Założenie ustanawia warunek, że narzędzie dowodzące logiki formalnej musi zakładać, że jest prawdziwe . Asercja określa właściwość, która musi być potwierdzona jako prawdziwa. W symulacji zarówno twierdzenia, jak i założenia są weryfikowane względem bodźców testowych. Pokrycie własności pozwala inżynierowi weryfikacyjnemu zweryfikować, czy twierdzenia dokładnie monitorują projekt.
Pokrycie
Pokrycie stosowane do języków weryfikacji sprzętu odnosi się do gromadzenia statystyk na podstawie zdarzeń próbkowania w ramach symulacji. Pokrycie służy do określenia, kiedy testowane urządzenie (DUT) zostało wystawione na wystarczającą różnorodność bodźców, aby można było z dużym prawdopodobieństwem stwierdzić, że testowane urządzenie działa prawidłowo. Należy zauważyć, że różni się to od pokrycia kodu, które instrumentuje kod projektu w celu zapewnienia, że wszystkie wiersze kodu w projekcie zostały wykonane. Pokrycie funkcjonalne zapewnia, że wszystkie pożądane narożniki i krawędzie w przestrzeni projektowej zostały zbadane .
Grupa pokrycia SystemVerilog tworzy bazę danych „pojemników”, która przechowuje histogram wartości skojarzonej zmiennej. Można również zdefiniować pokrycie krzyżowe, co tworzy histogram reprezentujący iloczyn kartezjański wielu zmiennych.
A próbkowania steruje przypadku, gdy próbka jest pobierana. Pobierania zdarzenia może być zdarzenie Verilog wejście lub wyjście z bloku kodu lub wywołanie sample
metody grupy pokrycia. Należy zadbać o to, aby dane były pobierane tylko wtedy, gdy mają znaczenie.
Na przykład:
class eth_frame;
// Definitions as above
covergroup cov;
coverpoint dest {
bins bcast[1] = {48'hFFFFFFFFFFFF};
bins ucast[1] = default;
}
coverpoint f_type {
bins length[16] = { [0:1535] };
bins typed[16] = { [1536:32767] };
bins other[1] = default;
}
psize: coverpoint payload.size {
bins size[] = { 46, [47:63], 64, [65:511], [512:1023], [1024:1499], 1500 };
}
sz_x_t: cross f_type, psize;
endgroup
endclass
W tym przykładzie inżynier weryfikacji jest zainteresowany dystrybucją ramek broadcast i unicast, polem size/f_type i rozmiarem ładunku. Zakresy w punkcie pokrycia rozmiaru ładunku odzwierciedlają interesujące przypadki narożne, w tym ramy o minimalnym i maksymalnym rozmiarze.
Synchronizacja
Złożone środowisko testowe składa się z komponentów weryfikacji wielokrotnego użytku, które muszą się ze sobą komunikować. Prymityw Verilog „ zdarzenie ” pozwalał różnym blokom instrukcji proceduralnych na wzajemne wyzwalanie się, ale wymuszenie synchronizacji wątków zależało od (sprytnego) użycia programisty. SystemVerilog oferuje dwa prymitywy przeznaczone specjalnie do synchronizacji międzywątkowej: skrzynka pocztowa i semafor . Skrzynka pocztowa jest modelowana jako kolejka komunikatów FIFO . Ewentualnie FIFO może być typu programowane tak, że tylko obiekty określonego typu może przechodzić przez niego. Zazwyczaj obiekty są instancjami klas reprezentującymi transakcje : operacje elementarne (na przykład wysyłanie ramki), które są wykonywane przez komponenty weryfikacji. Semafor jest modelowany jako semafor zliczający .
Ogólne ulepszenia klasycznego Verilog
Oprócz powyższych nowych funkcji, SystemVerilog zwiększa użyteczność istniejących funkcji językowych Verilog. Oto niektóre z tych ulepszeń:
- Operatory przypisania proceduralnego (<=, =) mogą teraz działać bezpośrednio na tablicach .
- Definicje portów (inout, input, output) są teraz rozszerzone w celu obsługi większej liczby typów danych : obsługiwane są typy struct , enum , real i wielowymiarowe.
- Konstrukcja pętli for umożliwia teraz automatyczną deklarację zmiennych wewnątrz instrukcji for. Pętla sterowania przepływem jest poprawiona przez kontynuować i przerwa oświadczenia .
- SystemVerilog dodaje DO / podczas pętli do while pętli konstruktu.
- Zmienne stałe , tj. te, które nie zmieniają się w czasie wykonywania, można wyznaczyć za pomocą const .
- Inicjalizacja zmiennych może teraz działać na tablicach.
-
Operatory inkrementacji i dekrementacji (
x++
,++x
,x--
,--x
) są obsługiwane w SystemVerilog, podobnie jak inne złożone operatory przypisania (x += a
,x -= a
,x *= a
,x /= a
,x %= a
,x <<= a
,x >>= a
,x &= a
,x ^= a
,x |= a
) jak w C i potomkowie . - Preprocesor poprawił możliwości definiowania podstawiania makr , w szczególności podstawianie w ciągu literałów (""), a także łączenie wielu tokenów makr w jedno słowo .
- Konstrukcja fork/join została rozszerzona o join_none i join_any .
- Dodatki do dyrektywy `timescale umożliwiają bardziej przewidywalną kontrolę skali czasu symulacji w dużym środowisku symulacji, przy czym każdy plik źródłowy wykorzystuje lokalną skalę czasu.
- Porty zadań można teraz zadeklarować jako ref . Odwołanie daje ciału zadania bezpośredni dostęp do argumentów źródłowych w zakresie wywołującego, znanym jako „ przekazywanie przez odwołanie ” w programowaniu komputerowym. Ponieważ działa na samej oryginalnej zmiennej, a nie na kopii wartości argumentu, zadanie/funkcja może modyfikować zmienne (ale nie sieci) w zasięgu wywołującego w czasie rzeczywistym . Deklaracje portu wejścia/wyjścia przekazują zmienne według wartości i odraczają aktualizację zmiennej zakresu wywołującego do momentu zakończenia zadania.
- Funkcje można teraz zadeklarować jako void , co oznacza, że nie zwracają żadnej wartości.
- Parametry można zadeklarować dowolnego typu, w tym typedef s zdefiniowanego przez użytkownika .
Poza tym SystemVerilog umożliwia wygodny interfejs do języków obcych (takich jak C/C++) przez SystemVerilog DPI (Interfejs programowania bezpośredniego).
Oprogramowanie do weryfikacji i syntezy
W roli weryfikacji projektu, SystemVerilog jest szeroko stosowany w branży projektowania chipów. Trzej najwięksi dostawcy EDA ( Cadence Design Systems , Mentor Graphics , Synopsys ) włączyli SystemVerilog do swoich mieszanych językowo symulatorów HDL . Chociaż żaden symulator nie może jeszcze zapewnić wsparcia dla całego SystemVerilog LRM , co sprawia, że interoperacyjność testbench jest wyzwaniem, trwają wysiłki na rzecz promowania kompatybilności między dostawcami. W 2008 r. Cadence i Mentor wydali Open Verification Methodology, bibliotekę klas o otwartym kodzie źródłowym i strukturę użytkowania, która ma ułatwić rozwój testbenchów wielokrotnego użytku i gotowych adresów IP weryfikacyjnych. Firma Synopsys, która jako pierwsza opublikowała bibliotekę klas SystemVerilog (VMM), odpowiedziała następnie, udostępniając swój zastrzeżony VMM dla ogółu społeczeństwa. Wielu dostawców zewnętrznych ogłosiło lub już wydało weryfikacyjny adres IP SystemVerilog.
W latach konstrukcja syntezy roli (przekształcenie opisu sprzętowo-projektowej w gate- netlist ), SystemVerilog przyjęcie jest powolny. Wiele zespołów projektowych korzysta z przepływów projektowych, które obejmują wiele narzędzi od różnych dostawców. Większość zespołów projektowych nie może migrować do SystemVerilog RTL-design, dopóki cały ich zestaw narzędzi front-end ( linters , weryfikacja formalna i generatory automatycznych struktur testowych ) nie obsługuje wspólnego podzbioru języków.
Zobacz też
- Lista Symulatorów SystemVerilog (Wyszukaj SV2005)
- Verilog-AMS
- e (język weryfikacji)
- SpecC
- Accellera
- System C
- SystemRDL
Bibliografia
- 1800-2005 — IEEE Standard for System Verilog — ujednolicony projekt sprzętu, specyfikacja i język weryfikacji . 2005. doi : 10.1109/IEEESTD.2005.97972 . Numer ISBN 978-0-7381-4810-6.
- 1800-2009 — Standard IEEE dla SystemVerilog — ujednolicony projekt sprzętu, specyfikacja i język weryfikacji . 2009. doi : 10.1109/IEEESTD.2009.5354441 . Numer ISBN 978-0-7381-6130-3.
- 1800-2012 — IEEE Standard for SystemVerilog — ujednolicone projektowanie sprzętu, specyfikacja i język weryfikacji . 2013. doi : 10.1109/IEEESTD.2013.6469140 . Numer ISBN 978-0-7381-8110-3.
- 1800-2017 — IEEE Standard for SystemVerilog — ujednolicony projekt sprzętu, specyfikacja i język weryfikacji . 2017. doi : 10.1109/IEEESTD.2018.8299595 . Numer ISBN 978-1-5044-4509-2.
- McGrath, Dylan (2005-11-09). „IEEE zatwierdza SystemVerilog, wersję Verilog” . Czasy EE . Źródło 2007-01-31 .
- Puneeta Kumara (2005-11-09). „Samouczek systemu Verilog” .
- Gopi Kryszna (2005-11-09). "Samouczki SystemVerilog, SVA, SV DPI" .
- HDVL. "Więcej linków do systemu Verilog" .
- Spear, Chris, „SystemVerilog for Verification” Springer, Nowy Jork, NY. ISBN 0-387-76529-8
- Stuart Sutherland, Simon Davidmann, Peter Flake, „SystemVerilog for Design Second Edition: Przewodnik po użyciu SystemVerilog do projektowania i modelowania sprzętu” Springer, New York City, NY. ISBN 0-387-33399-1
- Ben Cohen, Srinivasan Venkataramanan, Ajeetha Kumari i Lisa Piper [1] Podręcznik SystemVerilog Assertions, wydanie 4, 2016- http://SystemVerilog.us
- Ben Cohen Srinivasan Venkataramanan i Ajeetha Kumari [2] Pragmatyczne podejście do adopcji VMM, - http://SystemVerilog.us
- Erik Seligman i Tom Schubert [3] Weryfikacja formalna: niezbędny zestaw narzędzi do nowoczesnego projektowania VLSI, 24 lipca 2015 r.,
Linki zewnętrzne
- Odniesienie do standardu IEEE
Najnowsze dokumenty w standardzie SystemVerilog są dostępne bezpłatnie w IEEExplore .
- Poradniki
- Rozwój standardów
- IEEE P1800 — grupa robocza ds. SystemVerilog
- Witryny używane przed IEEE 1800-2005
- Rozszerzenia językowe
- Verilog AUTOs – system metakomentarzy o otwartym kodzie źródłowym, który upraszcza utrzymanie kodu Verilog
- Narzędzia online
- EDA Playground – Uruchom SystemVerilog z przeglądarki internetowej (bezpłatne IDE online)
- SVeN — SystemVerilog BNF Navigator (aktualny zgodnie z IEEE 1800-2012)
- Inne narzędzia