Simulación de software RENESAS ForgeFPGA
Información importante
A simulación é unha técnica de aplicación de diferentes estímulos de entrada ao deseño en diferentes momentos para comprobar se o código RTL se comporta do xeito previsto. Utilízase para verificar a robustez do deseño. A simulación permite ao usuario view o diagrama de tempo dos sinais relacionados para comprender como a descrición do deseño no deseño file compórtase.
Os bancos de proba son pezas de código que se usan para a simulación. Un banco de probas simple instanciará a Unidade en proba (UUT) e dirixirá a entrada. O software Go Configure usa Icarus Verilog (iVerilog) e GTKWave para observar as formas de onda de simulación co estímulo proporcionado no banco de probas.
Este documento describe os pasos que se deben seguir ao instalar Icarus no seu sistema e como executar unha simulación exitosa.
Instalación de Icarus Verilog
a. Instale a última versión de Icarus Verilog (IVerilog) desde https://bleyer.org/icarus/
b. Asegúrese de engadir IVerilog ao PATH e deixe que instale GTKWave (consulte a figura 1)
c. Abra o software Go Configure e seleccione a peza: SLG47910(Rev BB) para abrir o Forge Workshop (consulte a Figura 2).
d. Fai clic no Editor FPGA no medio da barra de ferramentas na parte superior ou o usuario tamén pode facer dobre clic na estrutura FPGA Core no medio da xanela.
e. Ábrese unha nova xanela chamada Obradoiro de Forxa. Na barra de ferramentas do menú na parte superior, faga clic en Opcións → Configuración. No cadro de diálogo Configuración, vai a Ferramentas na pestana Configuración do usuario. Desmarque a "caixa do entorno do sistema" para Icarus Verilog e GTKWave. Engade o camiño a Iverilog e GTKWave gardados no teu sistema no espazo indicado (consulta a Figura 4).
Está todo preparado para simular un banco de probas e os pasos anteriores garanten que o GTKWave se inicie automaticamente ao simular un banco de probas no software Go Configure.
Banco de probas
O paso máis crucial para implementar con éxito calquera sistema é verificar o deseño e a súa funcionalidade. Verificar un sistema complexo despois de implementar o hardware non é unha opción sabia. É ineficaz en termos de diñeiro, tempo e recursos. Polo tanto, no caso de FPGA, utilízase un banco de probas para probar o código fonte de Verilog.
Supoñamos que temos unha entrada de 11 bits e queremos probar o dispositivo para todos os posibles valores de combinación de entrada, é dicir (211). Como se trata dun número moi grande de combinacións, é imposible probalo manualmente. Nestes casos, os bancos de proba son moi útiles xa que pode probar o deseño automaticamente para todos os valores posibles e, polo tanto, confirmar a fiabilidade do deseño de proba. Os bancos de proba de Verilog úsanse para simular e analizar deseños sen necesidade de ningún dispositivo físico de hardware.
Un deseño en proba, abreviado como DUT, é un módulo sintetizable da funcionalidade que queremos probar. Noutras palabras, é o deseño do circuíto que nos gustaría probar. Podemos describir o noso DUT usando un dos tres estilos de modelado en Verilog: nivel de porta, fluxo de datos ou comportamento.
Un banco de probas non se pode sintetizar, polo que só se utiliza con fins de simulación. Isto permítelle ao usuario utilizar unha gama completa de construcións de Verilog, por exemplo, palabras clave como "for", "$display" e "$monitor", etc. para escribir bancos de proba. Un banco de probas simple instanciará a Unidade en proba (UUT) ou o Dispositivo en proba (DUT) e as entradas da unidade.
Comprensión dun banco de probas
Definición de escala de tempo en Testbench
Ao simular, o software necesita saber como se definiu o tempo. A unidade de retardo especifícase mediante a directiva `timescale, que especifica a unidade de tempo e a precisión dos módulos que a seguen. A escala de tempo axuda a determinar o que significa o número 1 en termos de tempo. # úsase para definir o atraso que se introducirá no sistema de acordo coa unidade de tempo especificada na escala de tempo. Entón, #1 significa 1 ns de atraso se a unidade_tempo está en ns.
Sintaxe:
`escala de tempo / /
time_unit é a cantidade de tempo que representa un atraso do número 1. A base time_precision representa cantos puntos decimais de precisión usar en relación ás unidades de tempo. (Ver a liña 23 na Figura 5)
Podemos usar as construcións de escala de tempo para usar diferentes unidades de tempo nun mesmo deseño. O usuario debe lembrar que as especificacións de retardo non son sintetizables e non se poden converter á lóxica de hardware. As funcións de retardo son exclusivamente para fins de simulación. $tempo e $tempo real as funcións do sistema devolven a hora actual e o formato de informe predeterminado pódese cambiar con outra tarefa do sistema $timeformat .
ExampLe:
Escala de tempo 10us/100ns
`escala de tempo 1ns/1ps
# 10 restablecer = 1; // atrasa o sinal 10 ns
#0.49 $display( “T = %0t no momento #0.49”, $tempo real) ;
O atraso especificado é #0.49, que é inferior á media unidade de tempo. Non obstante, a precisión do tempo especifícase como 1ps e, polo tanto, o simulador non pode ser inferior a 1ns, o que fai que redondee a instrución de retardo dada e produza 0ns. Polo tanto, esta declaración non proporciona ningún atraso.
Rexistro de simulación:
T = 1 no tempo #0.49
Declaración do módulo
A declaración do módulo en calquera banco de probas é diferente ao código principal de Verilog. Nun banco de probas, o módulo declárase sen portos de terminal xunto con el. (Ver a liña 25 na Figura 5)
Sintaxe:
módulo ;
A declaración do módulo vai seguida da definición dos sinais de entrada e saída definidos anteriormente no deseño principal file.
Usamos dous tipos de sinais para conducir e controlar os sinais durante a simulación. O tipo de datos reg manterá o valor ata que se lle asigne un novo valor. Este tipo de datos pódeselle asignar un valor só no bloque sempre ou inicial.
O tipo de datos de cable é como o dunha conexión física. Manterá o valor dirixido por un porto, instrución de asignación ou reg. Este tipo de datos non se pode usar no bloque inicial ou sempre. Calquera parámetro e declaración de enteiros tamén se fan nesta sección.
ExampLe:
Reg a,b; // a entrada no código HDL defínese como reg en testbench
Fío y; // o sinal de saída en HDL defínese como cable no banco de probas
Instanciación DUT
O propósito dun banco de probas é verificar se o noso módulo DUT está funcionando. Polo tanto, necesitamos crear unha instancia do noso módulo de deseño para probar o módulo.
Sintaxe:
(. (sinal 1), . sinal1>(sinal2));
ExampLe:
ALU d0 (.a(a), // o sinal "a" en ALU debe estar conectado a "a" no módulo ALU_tb
.b(b), // o sinal "b" en ALU debe estar conectado a "b" no módulo ALU_tb
.c(c)) ;// o sinal "c" en ALU debe estar conectado a "c" no módulo ALU_tb
Instanciamos o módulo DUT ALU ao módulo de proba. O nome da instancia (d0) é a elección do usuario. Os sinais cun punto "." diante deles están os nomes dos sinais dentro do módulo ALU, mentres que o fío ou reg ao que se conectan no banco de probas está ao lado do sinal entre parénteses (). Recoméndase codificar cada conexión de porto nunha liña separada para que calquera mensaxe de erro de compilación apunte correctamente ao número de liña onde se produciu o erro. Dado que estas conexións fanse polo nome, a orde na que aparecen é irrelevante.
A instanciación de DUT tamén se pode facer para os módulos nos que o módulo de banco de probas ten diferentes nomes de sinal. O mapeo correcto dos sinais é o importante á hora de instanciar.
Example:
ALU d0 (.a(A), // o sinal "a" en ALU debe estar conectado a "A" no módulo ALU_tb
.clk(reloxo), // o sinal "clk" en ALU debe estar conectado ao módulo "clock" ALU_tb
.out(OUT)) ; // o sinal "out" en ALU debe estar conectado a "OUT" no módulo ALU_tb
Bloqueo sempre e inicial nun banco de probas
Hai dous bloques secuenciais en Verilog, inicial e sempre. É nestes bloques nos que aplicamos o estímulo.
Bloque inicial
O bloque inicial que se executa só unha vez e remata cando se executa a última liña do bloque. O estímulo está escrito no bloque inicial. (Consulte a liña 54-72 na Figura 5)
Sintaxe:
..
inicio inicial
$dumpfile();
$dumpvars();
..(introducir estímulo)
fin
o bloque inicial comeza a súa execución ao inicio da simulación no tempo t = 0. Comezando pola primeira liña entre o inicio e o final, cada liña execútase de arriba a abaixo ata que se alcanza un atraso. Cando se alcanza o atraso, a execución deste bloque agarda ata que transcorra o tempo de atraso (unidades de 10 tempos) e despois retoma a execución.
O usuario pode definir estímulos usando bucles (for, while, if-else) tamén dentro deste bloque inicial en lugar de introducir todas as combinacións manualmente.
Example:
Inicio Inicial
A = 0; b = 0; // inicia a execución
#10 a = 0; b = 1; // a execución é en t = 10 unidades de tempo
#10 a = 1; b = 0; // a execución é en t = 20 unidades de tempo
fin
Vertido Files
Outra cousa a ter en conta é a declaración de $vertedurafiles e $vertedoiros dentro do bloque inicial (ver liña 55-56 na Figura 5). Os $vertedurafile úsase para volcar os cambios nos valores de redes e rexistros en a file que se denomina como o seu argumento.
Por exampLe:
$vertedurafile("alu_tb.vcd");
botará os cambios en a file chamado alu_tb.vcd. Os cambios están rexistrados en a file chamado VCD file que significa vertedoiro de cambio de valor. Un VCD (vocado de cambio de valor) almacena toda a información sobre os cambios de valor. Non podemos ter máis dun $dumpfile declaracións na simulación de Verilog.
Os $vertedoiros úsase para especificar que variables se van volcar (no ficheiro file mencionado por $dumpfile). A forma máis sinxela de usalo é sen ningún argumento. A sintaxe xeral dos $dumpvars é
$vertedoiros ( <, >);
Basicamente, podemos especificar que módulos e que variables nos módulos se van volcar. A forma máis sinxela de usalo é establecer o nivel en 0 e o nome do módulo como módulo superior (normalmente o módulo superior do banco de probas).
$vertedoiros(0, alu_tb);
Cando o nivel se establece en 0 e só se especifica o nome do módulo, volca TODAS as variables dese módulo e todas as variables de TODOS os módulos de nivel inferior instanciados por este módulo superior. Se algún módulo non está instanciado por este módulo superior, a súa variable non se cubrirá. Unha cousa máis, a declaración de $vertedurafile debe vir antes que $dumpvars ou calquera outra tarefa do sistema que especifique o vocado. Estes volcan files deben declararse antes de que as entradas de estímulo se non, non se gardará ningún valor nestes volcados files.
Bloquear sempre
Ao contrario das instrucións iniciais, un bloque sempre execútase repetidamente, aínda que a execución comeza no momento t = 0. Por exemploample, o sinal do reloxo é esencial para o funcionamento de circuítos secuenciais como os Flip-flops. Debe ser subministrado continuamente. Polo tanto, podemos escribir o código para o funcionamento do reloxo nun banco de probas como (ver a liña 52 na Figura 5):
sempre
#10 clk = ~clk;
módulo final
A instrución anterior execútase despois de 10 ns a partir de t = 0. O valor do clk invertirase despois de 10 ns desde o valor anterior. Así, xerando un sinal de reloxo de 20 ns de ancho de pulso. Polo tanto, esta declaración xera un sinal de frecuencia 50 MHz. É importante ter en conta que, a inicialización do sinal faise antes do bloque sempre. Se non facemos a parte de inicialización, o sinal clk será x de t – 0, e despois de 10 ns, invertirase noutro x.
Banco de probas de autocomprobación
Un banco de probas de autocomprobación inclúe unha declaración para comprobar o estado actual.
- $visualización tarefas do sistema úsanse principalmente para mostrar mensaxes de depuración para seguir o fluxo de simulación
inicio inicial
A = 0 ; b = 0; c = 0; #10; // aplicar entrada, agardar
se ( y ! == 1) comeza
$display("000 fallou"); //comprobar
c = 1; #10; //aplicar entrada, agardar
fin
senón se ( y ! == 0) comeza
$display(“001 fallou”) // comproba
b = 1; c = 0; #10; fin
senón se (y!==0)
$display (" 010 fallou"); //comprobar
fin
módulo final
$visualización úsase para mostrar valores de variables, cadeas ou expresións. Do anterior example, sempre que se cumpre algún bucle if-else, o rexistro do simulador mostrará os seus respectivos $visualización declaración. Hai unha nova liña por defecto ao final das cadeas.
$visualización ("tempo = %t , A = %b, B = %b, C = % b", $tempo, A, B, C);
Os caracteres mencionados nas comiñas imprimiranse tal e como están. A letra xunto con % indica o formato da cadea. Usamos %b para representar datos binarios. Podemos usar %d, %h, %o para representar decimal, hexadecimal e octal, respectivamente. O %g úsase para expresar números reais. Estes serán substituídos polos valores fóra da cita na orde mencionada. Por example, a declaración anterior mostrarase no rexistro de simulación como: tempo = 20, A = 0, B = 1, C = 0
Táboa 1. Formatos de táboa Verilog
Argumento | Descrición |
%h, %H | Visualización en formato hexadecimal |
%d, %D | Mostrar en forma decimal |
%b, %B | Mostrar en formato binario |
%m, %M | Mostrar o nome xerárquico |
%s, %S | Mostrar como cadea |
%t, %T | Visualización en formato de hora |
%f, %F | Mostrar "real" en formato decimal |
%e, %E | Mostrar "real" nun formato exponencial |
$visualización imprime principalmente os datos ou variables tal e como están nese instante dese momento como o printf en C. Debemos mencionar $visualización para calquera texto que teñamos que facer view no rexistro de simulación.
- $tempo
$tempo é unha tarefa do sistema que devolverá a hora actual da simulación.
- $monitor
$monitor supervisará os datos ou variables para os que está escrito e sempre que cambie a variable, imprimirase
o valor modificado. Consegue un efecto semellante ao chamar a $display cada vez que recibe algún dos seus argumentos
actualizado. $monitor é como unha tarefa que se xera para executarse en segundo plano do fío principal que supervisa e
mostra os cambios de valor das variables dos seus argumentos. $monitor ten a mesma sintaxe que $visualización.
$monitor("tempo = %t, A = %b, B = %b, C = % b", $tempo, A, B, C);
Na Figura 7 pódese observar que se engadiron novas liñas de códigos para autoavaliar o banco de probas. A colocación do $visualización e $monitor declaracións en diferentes seccións do banco de probas producirán resultados diferentes (ver Figura 8). $tempo mencionado nestas declaracións imprime o momento no que se está a imprimir o valor. Á mesma unidade de tempo digamos 170000, podemos ver como hai unha diferenza no valor de A e B debido ao $visualización e $monitor declaracións.
Software GTKWave
GTKWave é unha onda GTK+ con todas as funcións viewer para Unix, Win32 e Mac OSX que le LXT, LXT2, VZT, FST e GHW files así como VCD/EVCD estándar files e permite a súa viewing. O seu oficial webo sitio está en http://gtkwave.sourceforge.net/ . GTKWave é o recomendado viewer de Icarus Verilog ferramenta de simulación.
Unha vez que o usuario crea correctamente un banco de probas para probar a funcionalidade do deseño, o usuario agora pode usar o software GTKWave para view as formas de onda.
Para iniciar o software GTKWave para view as formas de onda, o usuario debe facer clic no botón Simular Testbench na parte superior da barra de ferramentas ou desde o menú principal Ferramentas→ Simulación→ Simular Testbench. Se non hai erros de sintaxe, dependendo do deseño, o GTKWave debería iniciarse automaticamente ou os resultados dos estímulos no banco de probas mostraranse na sección Rexistrador da xanela.
O software GTKWave abre o volcado de formato .vcdfile automaticamente. A xanela GTKWave non mostra a forma de onda cando se abre. Isto dálle ao usuario a oportunidade de seleccionar os sinais que quere view e observa. Para escoller o sinal, o usuario debe mostrar, o usuario debe facer clic no nome do seu módulo/instancia no lado esquerdo da xanela baixo a pestana SST. Ao facer clic no + de cada instancia, podes ver os sinais que están relacionados con esa instancia na sección inferior. A continuación, pode arrastrar e soltar o sinal desexado ou facer dobre clic nel para mostrarse na xanela Sinais. Tamén pode seleccionar todos (CTRL + A) e inserilos na xanela de sinais (consulte a Figura 9).
Os sinais engádense agora á xanela de sinal pero aínda está por simular. Despois de engadir os sinais desexados á xanela de sinal, fai clic en para axustar os sinais ao ancho actual da xanela e despois recargar os sinais da recarga
símbolo presente na barra de ferramentas. Agora podes ver os sinais cos seus respectivos valores.
Valores de sinal
Por defecto, os valores dos sinais están en formato hexadecimal e todas as ondas son de cor verde (se se executan correctamente).
O usuario pode cambiar as propiedades deste sinal facendo clic co botón dereito sobre o sinal e escollendo Formato de datos ou Formato de cor. O usuario tamén pode inserir un sinal en branco para facer seccións entre grupos de sinais. Cando teña o resultado óptico desexado, pode gardar as súas configuracións indo File → Escribir Gardar File.
Barra de ferramentas GTKWave
A barra de ferramentas (ver Figura 10) permite ao usuario realizar funcións básicas para o sinal. Imos discutir cada opción na barra de ferramentas de esquerda a dereita.
- Opcións do menú: Baixo esta opción podemos view todas as diversas funcións do software que se poden usar para xogar co software. Os detalles desta opción de menú están descritos na Sección 8 desta guía do usuario.
- Recortar Rastros: Úsase para eliminar/cortar o sinal de selección da xanela de sinal
- Copiar Rastros: Úsase para copiar o sinal seleccionado da xanela de sinal
- Pegar Rastros: O trazo copiado/cortado pódese pegar nun lugar diferente na xanela do sinal
- Zoom Fit: Úsase para axustar os sinais segundo o tamaño da xanela que o usuario elixa mostrar
- Achegar: Úsase para ampliar a xanela do sinal
- Reducir o zoom: Úsase para reducir a xanela do sinal
- Zoom Desfacer: úsase para desfacer o zoom na xanela do sinal
- Zoom para comezar: isto ampliará a xanela do sinal, mostrando a hora de inicio dos sinais.
- Zoom ata o final: isto ampliará a xanela do sinal que mostra a hora de finalización dos sinais
- Atopar o bordo anterior: Desprázase o marcador cara ao lado esquerdo indicando o bordo anterior
- Atopar o seguinte bordo: Desprázase o marcador cara á dereita indicando o seguinte bordo
- Despraza o enlace inferior/superior: usando isto podemos establecer o período de tempo no que o usuario quere mostrar. Por example, podemos establecer o marco de tempo entre 0 segundos e 500 ns, só mostrará os sinais durante esa duración.
- Recargar: A recarga preme sempre que se produce un cambio no sinal mostrado. Recargará e mostrará o sinal segundo os novos parámetros. Por example, despois de cambiar o marco de tempo do sinal, necesitamos recargar o sinal para mostrar o sinal no novo marco de tempo establecido.
Opcións do menú
Desde a esquina superior esquerda do software GTKWave, o usuario pode acceder ás opcións do menú facendo clic nas tres liñas verticais (consulte a Figura 11). O usuario pode atopar as seguintes opcións nas opcións do menú:
File
O File submenú contén varios elementos relacionados co acceso files, importación-exportación de VCD files, impresión e lectura/escritura files e saíndo.
Editar
O submenú Editar úsase para realizar varias funcións de utilidade, como cambiar a representación dos datos dos valores na subxanela de ondas. Usando as opcións do submenú Editar, o usuario pode cambiar o formato de datos dos sinais, reorganizalos, cambialos, recortalo, resaltalo, agrupar sinais, comentar os sinais, cambiar a cor dos sinais, etc.
busca
O submenú Busca úsase para realizar buscas en nomes e valores de rede. Axuda a realizar funcións en diferentes niveis de xerarquía dos sinais e instancias do VCD file.
Tempo
O submenú de tempo contén un superconxunto das funcións realizadas polos botóns de navegación e do panel de estado.
Permite funcións sinxelas relacionadas co tempo, como o zoom, o desprazamento a un punto de tempo determinado, o desprazamento do sinal nunha determinada dirección, etc.
Marcador
O submenú do marcador utilízase para realizar varias manipulacións sobre o marcador, así como para controlar o desprazamento fóra da pantalla.
Permite a funcionalidade de engadir numerosos marcadores na xanela de sinal. Permítense un máximo de 26 marcadores de nomes e os tempos para todos deben ser diferentes.
a. Para engadir marcadores na xanela de sinal
Fai clic co botón esquerdo no punto necesario onde queres que se coloque o marcador e prema ALT + N. Isto colocará un marcador con nome (A,B,C, etc.) no punto necesario. O usuario pode continuar facendo isto en 26 lugares horarios diferentes.
Para comparar o valor de tempo en todos os marcadores de lugares, Menú → Marcadores → Mostrar datos de cambio de marcador.
Isto abrirá unha xanela co valor de tempo en cada marcador. O usuario pode anotar manualmente o valor de tempo en cada marcador colocado e restalos para calcular a diferenza horaria entre 2 marcadores.
b. Para eliminar o marcador na xanela de sinal
O usuario pode ir a Menú → Marcadores → Recoller marcadores con nome. Isto eliminará o último Marcador colocado na xanela do sinal. O usuario pode eliminar todos os marcadores nomeados indo a Menú → Marcadores → Recoller todos os marcadores nomeados (Figura 12).
Na Figura 13, podemos ver como se cambiaron as cores do sinal. Tamén podes observar un sinal en branco engadido á xanela do sinal cun comentario: Sinal en branco.
Teña en conta tamén a presenza de 6 Marcadores Nomeados (A – E) e a compurgación do valor temporal entre estes Marcadores en ps.
View
O View O submenú utilízase para controlar varios atributos relacionados coa representación gráfica dos elementos de estado, así como os valores na subxanela do sinal. Desde este menú, pode converter a xanela do sinal en branco e negro ou tamén en cores. O View O submenú tamén che permite cambiar a dimensión de tempo que varía de segundos (segundos) a ficosegundos (fs). O usuario pode atopar esta opción View → Escalar a dimensión temporal → fs.
Axuda
O submenú de axuda contén opcións para activar a axuda en liña, así como para mostrar a información da versión do programa.
Conclusión
Este documento foi creado para axudar ao usuario a simular con éxito o seu deseño e verificar a funcionalidade corrixindo o borrador do banco de probas necesario e usando Icarus Verilog xunto con GTKWave para mostrar as formas de onda e observar os resultados.
Historial de revisións
Revisión | Data | Descrición |
1.00 | 20 de maio de 2024 | Lanzamento inicial. |
R19US0011EU0100 Rev.1.0
20 de maio de 2024
© 2024 Renesas Electronics
Documentos/Recursos
![]() |
Simulación de software RENESAS ForgeFPGA [pdfGuía do usuario REN_r19us0011eu0100, Simulación de software ForgeFPGA, Software ForgeFPGA, ForgeFPGA, Simulación ForgeFPGA, Simulación de software, Simulación, Software |