Laborgyakorlat 3 A modul ellenőrzése szimulációval Dr. Oniga István
Szimuláció és verifikáció Szimulációs lehetőségek Start Ellenőrzés után Viselkedési Funkcionális Fordítás után Leképezés után Időzítési Elhelyezés, huzalozás Szintézis Implementáció Viselkedési szimuláció Funkcionális szimuláció Időzítés analízis Időzítési szimuláció Verifikáció Logikai analizátor ChipScope Pro Hardver co-szimuláció FPGA programozás Verifikáció
Szimulacio a ISE Webpack-ben Az ellenőrzési környezet testbench - tesztelési környezet) létrehozása az egységet működtető jelformák (gerjesztő jelek) megadásával történik Szimulator szoftverek ISE simulator Modelsim NC-Sim VCS MX Szimulacios modszerek Tesztvektor Grafikus HDL Eredmeny Grafikus Text. Régebbi ISE verziókban lehetőség volt a gerjesztőjelek grafikus felületen történő megadására, az újabb verziókból azonban kikerült ez a funkció, így az egyetlen lehetőség a HDL nyelvű leírás.
Verilog Test Fixture Test Fixture A Test Fixture egy Verilog modul A tesztelendő modul almodulként van beillesztve Minden, a szintézisnél használt nyelvi elem felhasználható Nem szintetizálható nyelvi elemek Időalap timescale 1ns/1ps Megadott idők ns-ban értendők Szimulációs lépésköz: 1 ps
Test Fixture - initial initial blokk 0. időpillanatban kezdődik a végrehajtása Egyszer fut le Az initial blokkok egymással, és az always blokkokkal párhuzamosan működnek Az initial blokkon belüli késleltetések összeadódnak, pl. initial begin a <= 0; #10 a <= 1; #25 a <= 2; #5 a <= 0; end 0 1 2 0 10 35 40
Órajel generálás initial clk <= 1; always #5 clk <= ~clk; Test Fixture - always Órajelre működő bemenetek (pl. számláló) initial cntr <= 0; always @ (posedge clk) #2 cntr <= cntr + 1; 0 1 2 3 4 5 6 t OH =2ns
Az ellenőrzési környezet létrehozása Modul deklaráció: Zárt doboz! Nincsenek be- es kimenetek A tesztelendő modul (UUT) példányosítása Összeköttetések reg ill. wire A fájl tartalma: Modul deklaráció UUT példányosítás Órajel generálás Tesztvektor generálás Eredményvektor ellenőrzése 1. timescale 1ns/1ps 2. 3. module test; 4. reg sel= 1 b0; 5. reg in0 = 1 b0; 6. reg in1 = 1 b0; 7. wire r; 24. top UUT ( 25..sel(sel), 26..in0(in0), 27..in1(in1), 28..r(r) );
A tesztelendő modul (UUT) 2:1 multiplexer module multiplexer ( input wire in0, input wire in1, input wire sel, output wire r ); assign r = ~sel & in0 sel & in1; endmodule
Az ellenőrzési környezet létrehozása Az ellenőrzési környezet testbench - tesztelési környezet) létrehozása az egységet működtető jelformák (gerjesztő jelek) megadásával történik Első lépésként adjunk hozzá a project-hez egy új forrást: Project / New Source ablakban - Verilog Test Fixture opció. A fájl neve legyen muxtest! Ki válasszuk azt a modult, amelyhez a testbench-et generáljuk jelen esetben egyetlen modulunk van multiplexer
Gerjesztőjelek létrehozása Az automatikusan generált Verilog Test Fixture fájl az alábbiakat tartalmazza: `timescale 1ns / 1ps module muxtest; // Inputs reg in0; reg in1; reg sel; // Outputs wire r; // Instantiate the Unit Under Test (UUT) multiplexer uut (.in0(in0),.in1(in1),.sel(sel),.r(r) ); initial begin // Initialize Inputs in0= 0; in1 = 0; sel = 0; // Wait 100 ns for global reset to finish #100; // Add stimulus here end endmodule a tesztelendő modul példányosítása a bemeneti jelek esetén reg típusú változók deklarálása a kimeneti jelek esetén wire típusú változók deklarálása az összes bemeneti változó 0-ba állítása // Add stimulus here #100 in0=1; #150 in1=1; #100 in0=0; end always #50 sel <= ~sel; egy initial blokkon belül a késleltetések összeadódnak az initial blokkok futása párhuzamosan történik, mindegyik a 0. időpillanatban indul
Funkcionális szimuláció A Project Navigator program View opciói közül válassza ki a Simulation-t, majd a Hierarchy ablakban jelölje ki a testbench fájlt (muxtest). A Processes ablakban indítsa el az ISim Simulator /Simulate Behavioral Model programot. Szimulációhoz a Hierarchy ablakban a testbench file-t kell kiválasztani!!
A szimuláció eredménye Az eredményt be kell mutatni a gyakorlat vezetőnek!!!
Egyenlőség detektálása XNOR kapu - 1-bites számok egyenlősége 2-bites számok egyenlősége: // Title : eqdet2 module eqdet2 ( input wire [1:0] a, input wire [1:0] b, output wire eq ) ; wire eq1; wire eq2; assign eq1 = ~(b[1] ^ a[1]); assign eq2 = ~(b[0] ^ a[0]); assign eq = eq2 & eq1; endmodule Feladat: Szimuláció - az eredményt be kell mutatni a gyakorlat vezetőnek!!!
Számláló Új projekt (File New Project), Projektünk neve legyen szamlalo (javaslat), Legmagasabb szintű forrásként HDL típust adjunk meg! module szamlalo( input clk, rst, enable, output reg [3:0] count ); always @(posedge clk) if (rst) count <= 0; else if (enable) count <= count + 1; endmodule NET "count<0>" LOC = "P59" ; NET "count<1>" LOC = "P58" ; NET "count<2>" LOC = "P54" ; NET "count<3>" LOC = "P53" ; NET "clk" LOC="P129"; NET "rst" LOC="P41"; NET "enable LOC="P47"; Láb-hozzárendelés: Bemetek: clk, reset, enable Kimenetek: led-ek Feladat: Implementáció és szimuláció - az eredményeket be kell mutatni a gyakorlat vezetőnek!!!
Órajel generálás a Logsys GUI program segítségével NET "clk" LOC="P129"; - ezen a lábon jelenik meg a Logsys GUI által generált órajel
Számláló szimuláció eredménye
Reverzibilis számláló module reverzibilis_samlalo( input clk, rst, ce, dir, output [7:0] q ); reg [7:0] cntr; always @(posedge clk) if (rst) cntr <= 0; else if (ce) if (dir) cntr <= cntr + 1; else cntr <= cntr - 1; assign q=cntr; endmodule NET "q<0>" LOC = "P59" NET "q<1>" LOC = "P58" ; NET "q<2>" LOC = "P54" ; NET "q<3>" LOC = "P53" ; NET "q<4>" LOC = "P52" ; NET "q<5>" LOC = "P51" ; NET "q<6>" LOC = "P50" ; NET "q<7>" LOC = "P43" ; NET "clk" LOC="P129"; NET "rst" LOC="P119"; NET "dir" LOC="P95"; NET "ce" LOC="P101";
Reverzibilis számláló Feladat: Szimuláció - az eredményt be kell mutatni a gyakorlat vezetőnek!!!