BUDAPESTI MŐSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális rszerek tervezése FPGA áramkörökkel Szimuláció és verifikáció Fehér Béla Szántó Péter, Lazányi János, Raikovich Tamás BME MIT atórium
Szimuláció és verifikáció Szimulációs lehetıségek Viselkedési Funkcionális Fordítás után Leképezés után Idızítési Elhelyezés, huzalozás után Verifikáció Logikai analizátor ChipScope Pro Hardver co-szimuláció Start Szintézis Implementáció FPGA programozás Ellenırzés Viselkedési szimuláció Funkcionális szimuláció Idızítés analízis Idızítési szimuláció Verifikáció
Szimuláció a ISE Webpack-ben Szimulátor szoftverek ISE simulator Modelsim NC-Sim VCS MX Szimulációs módszerek Tesztvektor Grafikus HDL Eredmény Grafikus Text
Kétfajta szimulációs módszer Grafikus tesztvektor Grafikus eredmény
Elsı minta
Test Bench Waveform (TBW) generás Beállítások: Szimuláció hossza Idıalap Idızítések Elıkészítési idı Tartási idı Órajel 1 órajel több órajel kombinációs hálózat
TBW beállítása Jeltípusok - beállítás Clock - automatikus Bemenet - gerjesztés Kimenet - elvárt eredmény
TBW viselkedési szimuláció
Mi van a háttérben (HDL) I.? Modul dekraláció: Zárt doboz! Nincsenek be- és kimenetek A tesztelı modul (UUT) példányosítása A file tartalma: Összeköttetések reg ill. wire Modul dekraláció UUT példányosítás Órajel generálás Tesztvektor generálás Eredményvektor ellenırzése
Mi van a háttérben II.? Órajel generálás:
Tesztvektor generálás: Mi van a háttérben III.?
Mi van a háttérben IV.? Eredményvektor ellenörzése:
Kétfajta szimulációs módszer Grafikus tesztvektor Grafikus eredmény HDL tesztvektor Grafikus eredmény
Egy minta példa `timescale 1ns / 1ps module test; reg clk; reg [3:0] cntr ; always begin clk = 1'b0; #5 clk = 1'b1; #5; initial begin cntr=0; # 100 cntr = 10; initial begin repeat (5) begin @(posedge clk); cntr <= cntr+1; initial begin $display("time \t cntr"); $monitor("%t \t %d", $realtime, cntr); module Simulator is doing circuit initialization process. Finished circuit initialization process Time. 0 0 5000 1 15000 2 25000 3 35000 4 45000 5 100000 10 cntr
Initial - always Órajel generálás Always: Forever: A teszt kód nem szintetizálható!!!
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 initial begin a <= 0; #10 a <= 1; #25 a <= 2; #5 a <= 0; ; 0 1 2 0 10 35 40
Késleltetések megadása `timescale 1ns/1ps always @ (posedge clk) begin y1 <= in; y2 <= y1; always @ (posedge clk) begin #5 y1 <= in; #5 y2 <= y1; always @ (posedge clk) begin y1 <= #5 in; y2 <= #5 y1;
Ciklusok használata initial begin repeat (30) begin @(posedge CLK); #1 DATA_IN = $random; parameter WIDTH=32; initial forever begin : clock_10ns CLK = 1'b0; #5 CLK = 1'b1; #5; always @(posedge stop_clock) if (stop_clock) disable clock_10ns; reg [WIDTH-1:0] DATA; integer i; initial for (i=0; i<width; i=i+1) DATA[i] = 1'b0; initial begin while (empty==1'b0) begin @(posedge CLK); #1 read_fifo = 1'b1;
Task-ok ISA write ciklus task isa_wr (input [11:0] address, input [7:0] data); begin isa_write <= 1; xisa_add <= address; isa_data <= data; #33 xisa_iown <= 0; #165 xisa_iown <= 1;... #165 isa_write <= 0; task reg [7:0] isa_data, temp; reg isa_write; Tristate meghajtás ISA buszos eszköz z tesztelése se assign xisa_d = (isa_write)? isa_data : 8'bz; initial begin #200 isa_wr(12'h300, 8'hab); isa_wr(12'h300, 8'h10); isa_wr(12'h300, 8'h05); isa_rd(12'h303, temp);
Szöveg formázása %b Binary Value %h Hexadecimal Value %d Decimal Value %s String %c ASCII %f Real Value %e Exponential Value %o Octal Value %t Time %m Module Hierchical Name %v Strength \t Tab \n Newline \\ Backslash %% Percent \ Quote \<octal> ASCII representation Formátum karakterek Speciális karakterek Hol használjuk? $display - Szöveg kiíratása + CR/LF $write - Szöveg kiírása $monitor - Változók nyomonkövetése + $fdisplay - Fileba írás + CR/LF $fwrite -... $fmonitor -...
Adat / szöveg kiírása Egyszeri / egyszerő kiírás s + CR/LF initial begin #100000; $display( Szimuláció vége: %t", $realtime"); $stop; Kiírás s CR/LF nélkn lkül always @(posedge check) $write("."); Folyamatos állapotfigyelés initial $monitor( Time %t: Out %d, $realtime, cntr); Állapotváltozó figyelése reg[8*22:0] ascii_state; initial $monitor("current State is: %s", ascii_state); always @(UUT.top.state_reg) case (UUT.top.state_reg) 2'b00 : ascii_state = "Reset"; 2'b01 : ascii_state = "S"; 2'b10 : ascii_state = "Poll"; 2'b11 : ascii_state = "Receive"; default: ascii_state = "ERROR: Undefined State"; case
File mőveletek Állapotátmenetek tmenetek file-ba mentése integer outfile; initial begin outfile = $fopen(outfile, "output.dat", "w"); if (outfile == 0) begin $display("error!"); $finish; $fdisplay (outfile, Time - Counter"); $fmonitor (outfile, "%t %h", $realtime, cntr); #1000000; $fclose(outfile); real number; Számok olvasása sa file-ból while (i>0) begin i=$fscanf(number_file, "%f", number); $display("numb is %f", number); @(posedge CLK);
Memória file mőveletek Bináris állomány reg [31:0] prom_data[1023:0]; initial $readmemb("mem_file_binary.dat", prom_data); Hexadecimális állomány reg [31:0] prom_data[1023:0]; initial $readmemh("mem_file_hex.dat", prom_data); MSB LSB 1111000011110000 // Az elsı cím elsı 16 bitje 1010_0101_1010_0101 // A második cím elsı 16 bitje @025 // Cím megadása 11111111_00000000 Minta állomány
Egyéb... Assign Force deassign - $assign(reg reg) - $deassign(reg reg) release - $force(reg reg/wire) - $release(reg reg/wire) Szimuláci ció leáll llítása - $stop Kilépés - $finish pl. bithiba elıállítása Véletlenszám - $ random(seed seed) Típuskonverzió - $signed(jeln (jelnév) - $unsigned(jeln (jelnév) Real integer - $ rtoi(real real) Integer- real - $ itor(integer)
Szimuláció és verifikáció Szimulációs lehetıségek Viselkedési Funkcionális Fordítás után Leképezés után Idızítési Verifikáció Elhelyezés, huzalozás után Logikai analizátor ChipScope Pro Hardver co-szimuláció
Logikai analizátor használata FPGA Tetszıleges belsı regiszter és vezeték kivezetése dedikált I/O lábokon át tüskesorra. IDİVISZONYOK!! Külsı logikai analizátor használata Nem igényel FPGA erıforrást (csak I/O-t) A max. frekvencia = I/O frekvencia Relatív nagy mintatár, sok jel megfigyelhetı belsı multiplexeléssel
ChipScope - Belsı logikai analizátor Vezérlı Trigger FPGA erıforrásból felépített analizátor Tetszıleges belsı regiszter és vezeték megfigyelése Max. frekvencia = logika sebessége Relatív kis mintatár (BRAM memória) A minták kiolvasása JTAG-en keresztül A chipscope alkalmazása 1, Trigger beállítása PC-n 2, Trigger esemény 3, Adatok mentése BRAM-ba 4, Adatok átvitele JTAG-en PC-re
Xilinx System Generator Extra Xilinx FPGA specifikus komponensek a Matlab Simulink- hez Alkalmazási területek: A funkcionalitás ellenırzése modell szinten Funkcionalitás ellenırzése idızítés analízis alapján (Modelsim) Magasszintő modell bázisú FPGA konfiguráció generálása FPGA kód funkcionális ellenırzése
Összefoglalás A tesztelés, verifikáció a tervezési idı több 50%-a A feladat legfájdalmasabb része A korai hibafelderítés költséget takarít meg x1 - x10 - x100 x1000. A szimuláció biztosítja a legrészletesebb képet Tetszıleges jel/esemény, tetszıleges pillanatban Tetszıleges megfigyelık, jelzık De csak szimuláció!
Összefoglalás A tesztelés, mérés az FPGA-val egyszerőbb Tesztkonfigurációk generálhatók, vizsgálhatók Szabad I/O-k esetén közvetlen hozzáférhetıség a belsı jelekhez Beágyazott mérı eszközök az FPGA szabad erıforrásaiból Logikai analizátor szintetizálható teszt környezet