Simulació de programari RENESAS ForgeFPGA
Informació important
La simulació és una tècnica per aplicar diferents estímuls d'entrada al disseny en diferents moments per comprovar si el codi RTL es comporta de la manera prevista. S'utilitza per comprovar la robustesa del disseny. La simulació permet a l'usuari view el diagrama de temps dels senyals relacionats per entendre com la descripció del disseny en el disseny file es comporta.
Els bancs de prova són fragments de codi que s'utilitzen per a la simulació. Un banc de proves senzill crearà una instancia de la unitat en prova (UUT) i conduirà l'entrada. El programari Go Configure utilitza Icarus Verilog (iVerilog) i GTKWave per observar les formes d'ona de simulació amb l'estímul proporcionat al banc de proves.
Aquest document descriu els passos que cal seguir durant la instal·lació d'Icarus al vostre sistema i com executar una simulació amb èxit.
Instal·lació d'Icarus Verilog
a. Instal·leu la darrera versió d'Icarus Verilog (IVerilog) des de https://bleyer.org/icarus/
b. Assegureu-vos d'afegir IVerilog al PATH i deixeu-lo instal·lar GTKWave (vegeu la figura 1)
c. Obriu el programari Go Configure i seleccioneu la peça: SLG47910(Rev BB) per obrir el taller de Forge (vegeu la figura 2).
d. Feu clic a l'Editor FPGA al centre de la barra d'eines a la part superior o l'usuari també pot fer doble clic a l'estructura del nucli FPGA al centre de la finestra.
e. S'obre una finestra nova anomenada Forge Workshop. A la barra d'eines del menú a la part superior, feu clic a Opcions → Configuració. Al quadre de diàleg Configuració, aneu a Eines a la pestanya Configuració de l'usuari. Desmarqueu la casella Utilitza "entorn del sistema" tant per a Icarus Verilog com per a GTKWave. Afegiu el camí a Iverilog i GTKWave desats al vostre sistema a l'espai donat (vegeu la figura 4).
Esteu preparats per simular un banc de proves i els passos anteriors garanteixen que GTKWave s'iniciï automàticament quan es simula un banc de proves al programari Go Configure.
Banc de proves
El pas més crucial per implementar amb èxit qualsevol sistema és verificar el disseny i la seva funcionalitat. Verificar un sistema complex després d'implementar el maquinari no és una opció sàvia. És ineficaç en termes de diners, temps i recursos. Per tant, en el cas de FPGA, s'utilitza un banc de proves per provar el codi font de Verilog.
Suposem que tenim una entrada que és d'11 bits, i volem provar el dispositiu per a tots els valors de combinació d'entrada possibles, és a dir (211). Com que es tracta d'un nombre molt gran de combinacions, és impossible provar-ho manualment. En aquests casos, els bancs de proves són molt útils, ja que podeu provar el disseny automàticament per a tots els valors possibles i, per tant, confirmar la fiabilitat del disseny de prova. Els bancs de prova de Verilog s'utilitzen per simular i analitzar dissenys sense necessitat de cap dispositiu físic de maquinari.
Un disseny en prova, abreujat com a DUT, és un mòdul sintetitzable de la funcionalitat que volem provar. En altres paraules, és el disseny del circuit el que voldríem provar. Podem descriure el nostre DUT utilitzant un dels tres estils de modelatge de Verilog: nivell de porta, flux de dades o comportament.
Un banc de proves no es pot sintetitzar, per tant només s'utilitza amb finalitats de simulació. Això permet a l'usuari utilitzar una gamma completa de construccions de Verilog, per exemple, paraules clau com "for", "$display" i "$monitor", etc. per escriure bancs de proves. Un banc de proves senzill crearà una instancia de la unitat en prova (UUT) o el dispositiu en prova (DUT) i les entrades de la unitat.
Entendre un banc de proves
Definició d'escala de temps a Testbench
Quan es simula, el programari ha de saber com s'ha definit el temps. La unitat de retard s'especifica mitjançant la directiva `timescale, que especifica la unitat de temps i la precisió dels mòduls que la segueixen. L'escala de temps ajuda a determinar què significa el número 1 en termes de temps. # s'utilitza per definir el retard que s'ha d'introduir al sistema d'acord amb la unitat de temps especificada a l'escala de temps. Per tant, #1 significa 1 ns de retard si la unitat de temps està en ns.
Sintaxi:
`escala de temps / /
time_unit és la quantitat de temps que representa un retard de #1. La base time_precision representa quants punts decimals de precisió s'han d'utilitzar en relació amb les unitats de temps. (Vegeu la línia 23 a la figura 5)
Podem utilitzar les construccions d'escala de temps per utilitzar diferents unitats de temps en el mateix disseny. L'usuari ha de recordar que les especificacions de retard no es poden sintetitzar i no es poden convertir a la lògica de maquinari. Les funcions de retard són totalment per a finalitats de simulació. $temps i $temps real les funcions del sistema retornen l'hora actual i el format d'informe predeterminat es pot canviar amb una altra tasca del sistema $timeformat .
ExampLI:
`escala de temps 10us/100ns
`escala de temps 1ns/1ps
#10 restabliment = 1; // retarda el senyal 10 ns
#0.49 $display( “T = %0t al temps #0.49”, $temps real) ;
El retard especificat és #0.49, que és inferior a la mitja unitat de temps. Tanmateix, la precisió del temps s'especifica com a 1ps i, per tant, el simulador no pot ser inferior a 1ns, cosa que fa que arrodoni la declaració de retard donada i doni 0ns. Per tant, aquesta declaració no proporciona cap retard.
Registre de simulació:
T = 1 al temps #0.49
Declaració del mòdul
La declaració del mòdul en qualsevol banc de proves és diferent del codi Verilog principal. En un banc de proves, el mòdul es declara sense cap port de terminal juntament amb ell. (Vegeu la línia 25 de la figura 5)
Sintaxi:
mòdul ;
La declaració del mòdul és seguida de la definició dels senyals d'entrada i sortida definits anteriorment en el disseny principal file.
Utilitzem dos tipus de senyal per conduir i controlar els senyals durant la simulació. El tipus de dades reg mantindrà el valor fins que se li assigni un valor nou. Aquest tipus de dades només se li pot assignar un valor al bloc sempre o inicial.
El tipus de dades de cable és com el d'una connexió física. Contindrà el valor impulsat per un port, una instrucció d'assignació o un registre. Aquest tipus de dades no es pot utilitzar en bloc inicial o sempre. Qualsevol declaració de paràmetres i nombres enters també es fa en aquesta secció.
ExampLI:
Reg a,b; // l'entrada al codi HDL es defineix com a reg al banc de proves
Filferro y; // El senyal de sortida en HDL es defineix com un cable al banc de proves
Instanciació DUT
El propòsit d'un banc de proves és verificar si el nostre mòdul DUT funciona. Per tant, hem d'instanciar el nostre mòdul de disseny per provar el mòdul.
Sintaxi:
(. (senyal 1), . senyal1>(senyal2));
ExampLI:
ALU d0 (.a(a), // el senyal "a" a ALU s'hauria de connectar a "a" al mòdul ALU_tb
.b(b), // el senyal "b" a ALU s'hauria de connectar a "b" al mòdul ALU_tb
.c(c)) ;// el senyal "c" a ALU s'hauria de connectar a "c" al mòdul ALU_tb
Hem creat una instancia del mòdul DUT ALU al mòdul de prova. El nom de la instància (d0) és l'opció de l'usuari. Els senyals amb un punt "." davant d'ells hi ha els noms dels senyals dins del mòdul ALU, mentre que el cable o reg al qual es connecten al banc de proves està al costat del senyal entre parèntesis (). Es recomana codificar cada connexió de port en una línia separada perquè qualsevol missatge d'error de compilació apunti correctament al número de línia on s'ha produït l'error. Com que aquestes connexions es fan pel nom, l'ordre en què apareixen és irrellevant.
La instanciació DUT també es pot fer per als mòduls on el mòdul del banc de proves té diferents noms de senyal. El mapeig correcte dels senyals és el que és important a l'hora d'instanciar.
Example:
ALU d0 (.a(A), // el senyal "a" a ALU s'hauria de connectar a "A" al mòdul ALU_tb
.clk(rellotge), // el senyal "clk" a ALU s'hauria de connectar al mòdul "clock" ALU_tb
.out(OUT)) ; // el senyal "out" a ALU s'ha de connectar a "OUT" al mòdul ALU_tb
Bloc sempre i inicial en un banc de proves
Hi ha dos blocs seqüencials a Verilog, inicial i sempre. És en aquests blocs on apliquem l'estímul.
Bloc inicial
El bloc inicial que s'executa només una vegada i finalitza quan s'executa l'última línia del bloc. L'estímul s'escriu al bloc inicial. (Vegeu la línia 54-72 a la figura 5)
Sintaxi:
..
inici inicial
$bocatfile();
$dumpvars();
..(introdueix l'estímul)
final
el bloc inicial comença la seva execució a l'inici de la simulació en el temps t = 0. A partir de la primera línia entre l'inici i el final, cada línia s'executa de dalt a baix fins que s'arriba a un retard. Quan s'arriba al retard, l'execució d'aquest bloc espera fins que hagi passat el temps de retard (unitats de 10 temps) i després reprèn l'execució.
L'usuari pot definir estímuls mitjançant bucles (for, while, if-else) també dins d'aquest bloc inicial en lloc d'introduir totes les combinacions manualment.
Example:
Inici Inicial
A = 0; b = 0; // comença l'execució
#10 a = 0; b = 1; // l'execució és a t = 10 unitats de temps
#10 a = 1; b = 0; // l'execució és a t = 20 unitats de temps
final
Abocador Files
Una altra cosa a tenir en compte és la declaració de $abocadorfiles i $dumpvars dins del bloc inicial (vegeu la línia 55-56 de la figura 5). El $abocadorfile s'utilitza per bolcar els canvis en els valors de xarxes i registres en a file que s'anomena com el seu argument.
Per exampLI:
$abocadorfile("alu_tb.vcd");
bolcarà els canvis en a file anomenat alu_tb.vcd. Els canvis es registren en a file anomenat VCD file que significa abocador de canvi de valor. Un VCD (abocament de canvi de valor) emmagatzema tota la informació sobre els canvis de valor. No podem tenir més d'un $dumpfile declaracions en la simulació de Verilog.
El $dumpvars s'utilitza per especificar quines variables s'han d'abocar (al fitxer file esmentat per $dumpfile). La manera més senzilla d'utilitzar-lo és sense cap argument. La sintaxi general dels $dumpvars és
$dumpvars ( <, >);
Bàsicament podem especificar quins mòduls i quines variables dels mòduls s'abocaran. La manera més senzilla d'utilitzar-ho és establir el nivell a 0 i el nom del mòdul com a mòdul superior (normalment el mòdul del banc de proves superior).
$dumpvars(0, alu_tb);
Quan el nivell s'estableix en 0, i només s'especifica el nom del mòdul, bolca TOTES les variables d'aquest mòdul i totes les variables de TOTS els mòduls de nivell inferior instanciats per aquest mòdul superior. Si algun mòdul no està creat per aquest mòdul superior, aleshores la seva variable no serà coberta. Una cosa més, la declaració de $abocadorfile ha d'anar abans que $dumpvars o qualsevol altra tasca del sistema que especifiqui l'abocament. Aquests aboquen files s'han de declarar abans que les entrades d'estímul, en cas contrari, no es desarà cap valor en aquests bolcats files.
Bloqueja sempre
Contràriament a les declaracions inicials, un bloc sempre s'executa repetidament, encara que l'execució comença en el temps t = 0. Per exempleampEl senyal de rellotge és essencial per al funcionament de circuits seqüencials com els xancles. S'ha de subministrar contínuament. Per tant, podem escriure el codi per al funcionament del rellotge en un banc de proves com (vegeu la línia 52 a la figura 5):
sempre
#10 clk = ~clk;
mòdul final
La instrucció anterior s'executa després de 10 ns a partir de t = 0. El valor del clk s'invertirà després de 10 ns del valor anterior. Així, es genera un senyal de rellotge de 20 ns d'amplada de pols. Per tant, aquesta declaració genera un senyal de freqüència 50 MHz. És important tenir en compte que, la inicialització del senyal es fa abans del bloc sempre. Si no fem la part d'inicialització, el senyal clk serà x de t – 0, i després de 10 ns, s'invertirà a un altre x.
Banc de proves d'autocontrol
Un banc de proves d'autocomprovació inclou una declaració per comprovar l'estat actual.
- $visualització La tasca del sistema s'utilitzen principalment per mostrar missatges de depuració per fer un seguiment del flux de simulació
inici inicial
A = 0; b = 0; c = 0; #10; // aplica l'entrada, espera
si ( y ! == 1) comença
$display("000 fallida"); //comprova
c = 1; #10; //aplica l'entrada, espera
final
sinó si ( y ! == 0) comença
$display(“001 ha fallat”) // comproveu
b = 1; c = 0; #10; final
sinó si (y!==0)
$display (" 010 ha fallat"); //comprova
final
mòdul final
$visualització s'utilitza per mostrar valors de variables, cadenes o expressions. De l'anterior example, sempre que es compleixi algun dels bucles if-else, el registre del simulador mostrarà els seus respectius $visualització declaració. Hi ha una nova línia per defecte al final de les cadenes.
$visualització (“temps = %t , A = %b, B = %b, C = % b”, $temps, A, B, C);
Els caràcters esmentats a les cometes s'imprimiran tal com estan. La lletra juntament amb % denota el format de cadena. Utilitzem %b per representar dades binàries. Podem utilitzar %d, %h, %o per representar decimal, hexadecimal i octal, respectivament. El %g s'utilitza per expressar nombres reals. Aquests seran substituïts pels valors fora de la cotització en l'ordre esmentat. Per example, la declaració anterior es mostrarà al registre de simulació com: temps = 20, A = 0, B = 1, C = 0
Taula 1. Formats de taula Verilog
Argument | Descripció |
%h, %H | Visualització en format hexadecimal |
%d, %D | Visualització en forma decimal |
%b, %B | Visualització en format binari |
%m, %M | Mostra el nom jeràrquic |
%s, %S | Mostra com a cadena |
%t, %T | Visualització en format horari |
%f, %F | Mostra "real" en format decimal |
%e, %E | Mostra "real" en format exponencial |
$visualització imprimeix principalment les dades o variables tal com està en aquell instant d'aquell moment com el printf en C. Hem d'esmentar $visualització pel text que hem de fer view al registre de simulació.
- $temps
$temps és una tasca del sistema que retornarà l'hora actual de la simulació.
- $monitor
$monitor supervisarà les dades o variables per a les quals està escrit i sempre que canviï la variable, s'imprimirà
el valor modificat. Aconsegueix un efecte similar de cridar a $display després de cada vegada que es produeix algun dels seus arguments
actualitzat. $monitor és com una tasca que es genera per executar-se en segon pla del fil principal que supervisa i
mostra els canvis de valor de les variables dels seus arguments. $monitor té la mateixa sintaxi que $visualització.
$monitor(“ temps = %t, A = %b, B = %b, C = % b”, $temps, A, B, C);
A la figura 7 es pot observar que s'han afegit noves línies de codis per autoavaluar el banc de proves. La col·locació del $visualització i $monitor declaracions en diferents seccions del banc de proves donaran resultats diferents (vegeu la figura 8). $temps esmentat en aquestes declaracions imprimeix el moment en què s'imprimeix el valor. A la mateixa unitat de temps, diguem 170000, podem veure com hi ha una diferència en el valor de A i B a causa del $visualització i $monitor declaracions.
Programari GTKWave
GTKWave és una ona GTK+ amb totes les funcions viewer per a Unix, Win32 i Mac OSX que llegeix LXT, LXT2, VZT, FST i GHW files així com VCD/EVCD estàndard files i permet la seva viewing. El seu oficial webel lloc és a http://gtkwave.sourceforge.net/ . GTKWave és el recomanat vieweina de simulació d'Icarus Verilog.
Una vegada que l'usuari hagi creat correctament un banc de proves per provar la funcionalitat del disseny, l'usuari ara pot utilitzar el programari GTKWave per view les formes d'ona.
Per llançar el programari GTKWave a view les formes d'ona, l'usuari ha de fer clic al botó Simulate Testbench a la part superior de la barra d'eines o des del menú principal Eines→ Simulation→ Simulate Testbench. Si no hi ha errors de sintaxi, depenent del disseny, el GTKWave s'hauria de llançar automàticament o els resultats dels estímuls al banc de proves es mostraran a la secció Logger de la finestra.
El programari GTKWave obre l'abocador de format .vcdfile automàticament. La finestra GTKWave no mostra la forma d'ona quan s'obre. Això dóna a l'usuari l'oportunitat de seleccionar quins senyals vol view i observar. Per triar el senyal, l'usuari ha de mostrar, l'usuari ha de fer clic al nom del seu mòdul/instància a la part esquerra de la finestra sota la pestanya SST. Si feu clic al + de cada instància, podeu veure els senyals relacionats amb aquesta instància a la secció inferior. A continuació, podeu arrossegar i deixar anar el senyal desitjat o fer-hi doble clic perquè es mostri a la finestra Senyals. També podeu seleccionar-los tots (CTRL + A) i inserir-los a la finestra de senyals (vegeu la figura 9).
Els senyals s'afegeixen ara a la finestra del senyal, però encara no s'han simulat. Després d'afegir els senyals desitjats a la finestra del senyal, feu clic a per ajustar els senyals a l'amplada actual de la finestra i després tornar a carregar els senyals de la recàrrega
símbol present a la barra d'eines. Ara podeu veure els senyals amb els seus valors respectius.
Valors del senyal
Per defecte, els valors dels senyals estan en format hexadecimal i totes les ones són de color verd (si s'executen correctament).
L'usuari pot canviar les propietats d'aquest senyal fent clic amb el botó dret sobre el senyal i escollint Format de dades o Format de color. L'usuari també pot inserir un senyal en blanc per fer seccions entre grups de senyals. Quan tingueu el resultat òptic desitjat, podeu desar les vostres configuracions anant File → Escriu Desa File.
Barra d'eines GTKWave
La barra d'eines (vegeu la figura 10) permet a l'usuari realitzar les funcions bàsiques del senyal. Parlem de cada opció a la barra d'eines d'esquerra a dreta.
- Opcions del menú: Amb aquesta opció podem view totes les diferents característiques del programari que es poden utilitzar per jugar amb el programari. Els detalls d'aquesta opció de menú es tracten a la secció 8 d'aquesta guia de l'usuari.
- Traces de tall: S'utilitza per eliminar/tallar el senyal de selecció de la finestra del senyal
- Copia Traces: S'utilitza per copiar el senyal seleccionat de la finestra del senyal
- Enganxa traces: El rastre copiat/tallat es pot enganxar en una ubicació diferent a la finestra del senyal
- Ajust del zoom: S'utilitza per ajustar els senyals segons la mida de la finestra que l'usuari esculli per mostrar
- Apropa: S'utilitza per fer zoom a la finestra del senyal
- Allunya el zoom: S'utilitza per reduir la finestra del senyal
- Zoom Desfer: s'utilitza per desfer l'ampliació/reducció de la finestra de senyal
- Zoom per començar: això ampliarà la finestra del senyal, mostrant l'hora d'inici dels senyals.
- Zoom fins al final: això augmentarà la finestra del senyal que mostra l'hora de finalització dels senyals
- Cerca la vora anterior: Això desplaça el marcador cap al costat esquerre indicant la vora anterior
- Trobeu la vora següent: Això desplaça el marcador cap a la dreta indicant la vora següent
- Desplaça l'enllaç inferior/superior: amb això podem establir el període de temps en què l'usuari vol mostrar. Per example, podem establir el marc de temps entre 0 segons i 500 ns, només mostrarà els senyals durant aquesta durada.
- Recarregar: La recàrrega es prem sempre que hi ha un canvi en el senyal mostrat. Es tornarà a carregar i mostrarà el senyal segons els nous paràmetres. Per exampi, després de canviar el període de temps del senyal, hem de tornar a carregar el senyal per mostrar el senyal en el nou període de temps establert.
Opcions del menú
Des de l'extrem superior esquerre del programari GTKWave, l'usuari pot accedir a les opcions del menú fent clic a les tres línies verticals (vegeu la figura 11). L'usuari pot trobar les opcions següents a les opcions del menú:
File
El File El submenú conté diversos elements relacionats amb l'accés files, importació-exportació de VCD files, impressió i lectura/escriptura files i sortint.
Edita
El submenú Edita s'utilitza per realitzar diverses funcions d'utilitat, com ara canviar la representació de dades dels valors a la subfinestra d'onades. Mitjançant les opcions del submenú Edita, l'usuari pot canviar el format de dades dels senyals, reorganitzar-los, desplaçar-los, retallar-los, ressaltar-los, agrupar els senyals, comentar els senyals, canviar el color dels senyals, etc.
Cerca
El submenú Cerca s'utilitza per fer cerques en noms i valors de xarxa. Ajuda a realitzar funcions en diferents nivells de jerarquia dels senyals i instàncies del VCD file.
Temps
El submenú d'hora conté un superconjunt de les funcions realitzades pels botons Navegacions i Tauler d'estat.
Permet funcions senzilles relacionades amb el temps, com ara fer zoom, moure's a un punt de temps determinat, desplaçar el senyal en una direcció determinada, etc.
Marcador
El submenú del marcador s'utilitza per realitzar diverses manipulacions sobre el marcador, així com per controlar el desplaçament fora de la pantalla.
Permet la funcionalitat d'afegir nombrosos marcadors a la finestra del senyal. Es permeten un màxim de 26 marcadors de noms i els horaris per a tots han de ser diferents.
a. Per afegir marcadors a la finestra de senyal
Feu clic amb el botó esquerre al punt necessari on voleu que es col·loqui el marcador i premeu ALT + N. Això col·locarà un marcador amb nom (A,B,C, etc.) al punt requerit. L'usuari pot continuar fent-ho per a 26 ubicacions horàries diferents.
Per comparar el valor temporal de tots els marcadors de llocs, Menú → Marcadors → Mostra les dades de canvi de marcador.
Això obrirà una finestra amb el valor de temps a cada marcador. L'usuari pot anotar manualment el valor de temps a cada marcador col·locat i restar-los per calcular la diferència de temps entre 2 marcadors.
b. Per eliminar el marcador a la finestra del senyal
L'usuari pot anar a Menú → Marcadors → Recollida de marcadors amb nom. Això eliminarà l'últim marcador col·locat a la finestra del senyal. L'usuari pot eliminar tots els marcadors amb nom anant a Menú → Marcadors → Recull tots els marcadors amb nom (Figura 12).
A la figura 13, podem veure com s'han canviat els colors del senyal. També podeu observar un senyal en blanc afegit a la finestra del senyal amb un comentari: senyal en blanc.
Tingueu en compte també la presència de 6 marcadors amb nom (A – E) i la compurgació del valor de temps entre aquests marcadors en ps.
View
El View El submenú s'utilitza per controlar diversos atributs que tracten amb la representació gràfica dels elements d'estat, així com els valors de la subfinestra del senyal. Des d'aquest menú, podeu convertir la finestra del senyal en blanc i negre o també en color. El View El submenú també us permet canviar la dimensió de temps que va des de segons (segons) fins a ficosegons (fs). L'usuari pot trobar aquesta opció View → Escala a la dimensió temporal → fs.
Ajuda
El submenú d'ajuda conté opcions per habilitar l'ajuda en línia així com per mostrar la informació de la versió del programa.
Conclusió
Aquest document es va crear per ajudar l'usuari a simular amb èxit el seu disseny i verificar la funcionalitat corregint l'esborrany del banc de proves necessari i utilitzant Icarus Verilog juntament amb GTKWave per mostrar les formes d'ona i observar els resultats.
Historial de revisions
Revisió | Data | Descripció |
1.00 | 20 de maig de 2024 | Alliberament inicial. |
R19US0011EU0100 Rev.1.0
20 de maig de 2024
© 2024 Renesas Electronics
Documents/Recursos
![]() |
Simulació de programari RENESAS ForgeFPGA [pdfGuia de l'usuari REN_r19us0011eu0100, Simulació de programari ForgeFPGA, Programari ForgeFPGA, ForgeFPGA, Simulació ForgeFPGA, Simulació de programari, Simulació, Programari |