Testna struktura (testbench) je SystemVerilog koda za preverjanje pravilnega delovanja modela digitalnega vezja. Testbench običajno predstavlja poseben modul, ki vsebuje instanco testiranega vezja (Device Under Test – DUT) ter opisuje potek vhodnih signalov in preverjanje rezultatov med simulacijo.
Ker testna struktura ni namenjena sintezi v strojno opremo, lahko uporablja konstrukte, ki v dejanskem vezju niso izvedljivi, na primer: časovne zakasnitve (#10), datotečni vhod/izhod, naključno generiranje podatkov in sistemske funkcije za izpis in preverjanje.
Enostavna testna struktura generira vhodne signale za testirano vezje, rezultate pa uporabnik preveri v simulatorju z opazovanjem signalov ali časovnih diagramov.
Enostavna testna stuktura je modul v jeziku SystemVerilog, ki običajno nima lastnih vhodov in izhodov,
vsebuje pa deklaracije notranjih signalov ter instanco testiranega vezja.
Na začetku datoteke je pogosto določena časovna skala z direktivo timescale, na primer: `timescale 1ns/1ps, ki določa časovno enoto za zapis zakasnitev v modelu (1ns),
ločljivost simulatorja oziroma najmanjši časovni korak (1ps).
Primer testne strukture za preizkus polnega seštevalnika:
`timescale 1ns/1ps
module test_full_adder;
logic a, b, cin; // vhodni signali testiranega vezja
logic s, cout; // izhodni signali
// instanca testiranega vezja
full_adder dut (
.a(a),
.b(b),
.cin(cin),
.s(s),
.cout(cout)
);
initial begin
a = 0; b = 0; cin = 0; #10;
b = 1; #10;
a = 1; b = 0; #10;
b = 1; #10;
a = 1; b = 1; cin = 1; #10;
$finish;
end
endmodule
Testirano vezje povežemo v testno strukturo tako, da njegove vhode povežemo na notranje signale testne strukture, izhode pa opazujemo prek ustreznih signalov.
V proceduralnem bloku initial signalom določimo časovni potek z zaporednimi blokirnimi prireditvami (=), med katere vstavljamo zakasnitve (#). Simulator nato izvede opisano zaporedje dogodkov in omogoči pregled časovnih potekov signalov.
Na podlagi simulacijskih rezultatov lahko preverimo, ali vezje deluje pravilno. Pri enostavnih testnih strukturah to običajno storimo z vizualnim pregledom signalov v časovnem diagramu, pri zahtevnejših testnih strukturah pa preverjanje pogosto poteka samodejno z uporabo trditev (assertions) ali primerjavo s pričakovanimi rezultati.
Logična kombinacija vrednosti na vhodih vezja se imenuje testni vektor. V SystemVerilogu lahko več signalov združimo z operatorjem združevanja { } in jim hkrati priredimo skupno vrednost:
{a, b, cin} = 3'b000; #10;
{a, b, cin} = 3'b001; #10;
{a, b, cin} = 3'b010; #10;
Tak zapis je pregleden in posebej uporaben pri preizkušanju kombinacijskih vezij.
Preizkus vseh kombinacij vhodov lahko izvedemo z uporabo zanke:
integer i;
initial begin
for (i = 0; i < 8; i = i + 1) begin
{a, b, cin} = i;
#10;
end
$finish;
end
Zanka zaporedno generira vse možne 3-bitne kombinacije vhodov. Takšen popoln preizkus je praktično izvedljiv predvsem pri vezjih z manjšim številom vhodov, saj število kombinacij hitro narašča.
SystemVerilog omogoča tudi branje testnih vektorjev iz tekstovnih datotek. Sistemska funkcija:
$readmemb("vektorji.txt", testv);
prebere binarne vrednosti iz datoteke in jih shrani v elemente zbirke (array). V datoteki morajo biti vrednosti zapisane v binarni obliki, ločene s presledki ali novimi vrsticami.
Primer testne strukture z branjem testnih vektorjev:
integer i;
logic [2:0] testv [0:100]; // zbirka testnih vektorjev
initial begin
$readmemb("vektorji.txt", testv);
i = 0;
forever begin
{a, b, cin} = testv[i];
#10;
i = i + 1;
if (testv[i] === 3'bxxx) $stop;
end
end
Posamezni testni vektor preberemo iz zbirke in ga pošljemo na vhode testiranega vezja. Zanka forever izvaja preizkus, dokler ne naleti na posebno končno vrednost. Za preverjanje nedefiniranih vrednosti uporabljamo operator ===, ki primerja tudi stanja X in Z. To je pomembna razlika glede na operator ==, ki pri prisotnosti nedefiniranih vrednosti lahko vrne neznan rezultat.
Sistemska funkcija: $stop začasno ustavi simulacijo, $finish pa simulacijo dokončno zaključi.
V sodobnih SystemVerilog testnih strukturah pogosto uporabljamo tudi samodejno preverjanje rezultatov, naključno generiranje testnih vektorjev ter trditve (assertions), ki omogočajo učinkovitejšo verifikacijo kompleksnih digitalnih sistemov.