Mudanças entre as edições de "Simulação Funcional usando o ModelSim"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(12 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
Essa página descreve os passos a serem realizados para a simulação funcional no '''ModelSim''' de um circuito implementado no '''Quartus Prime'''.
+
Essa página descreve os passos a serem realizados para a simulação funcional no '''Modelsim''' de um circuito implementado no '''Quartus Prime 20.1.1''', disponibilizados na [https://wiki.sj.ifsc.edu.br/index.php/Acesso_ao_IFSC-CLOUD_(NUVEM)#Acesso_a_VM_Experimental_Quartus_e_Matlab_em_nuvem_via_Cliente_X2GO: nuvem do IFSC].
 
 
Antes de acessar o simulador, o circuito deve estar descrito em VHDL, e o '''Quartus Prime''' configurado corretamente.  
 
  
 +
Antes de acessar o simulador, o circuito deve estar descrito em VHDL utilizando o Quartus Prime, e o este deve ser configurado corretamente.
 +
==Configurando o Quartus Prime==
 
;Passo 1:
 
;Passo 1:
 
Digite o seguinte código VHDL ou seu próprio código e após salvar o projeto faça a '''Analysis & Synthesis''' '''[Crtl+k]'''.
 
Digite o seguinte código VHDL ou seu próprio código e após salvar o projeto faça a '''Analysis & Synthesis''' '''[Crtl+k]'''.
Linha 31: Linha 31:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
+
;Passo 2:
 
 
;Passo 1:
 
 
Verifique se o caminho para o ModelSim está correto '''[Tools > Options > General > EDA Tools Options'''].  O campo '''Modelsim-Altera''' deve estar com  
 
Verifique se o caminho para o ModelSim está correto '''[Tools > Options > General > EDA Tools Options'''].  O campo '''Modelsim-Altera''' deve estar com  
 
  /opt/intelFPGA/20.1/modelsim_ae/linuxaloem
 
  /opt/intelFPGA/20.1/modelsim_ae/linuxaloem
{{fig|1| EDA Tools Options | EDA_Tools_Settings.png | 400 px |}}
+
{{fig|1| EDA Tools Options | EDA_Tools_Options.png | 600 px |}}
  
;Passo 2:
+
;Passo 3:
 
Verifique se o formato do arquivo de simulação no ModelSim está correto '''[Assigments > Settings.. > General > EDA Tools Settings '''].  O campo '''Formats''' da linha '''Simulation''' deve estar com
 
Verifique se o formato do arquivo de simulação no ModelSim está correto '''[Assigments > Settings.. > General > EDA Tools Settings '''].  O campo '''Formats''' da linha '''Simulation''' deve estar com
 
  VHDL
 
  VHDL
{{fig|2| EDA Tools Settings | EDA_Tools_Settings.png | 400 px |}}
+
{{fig|2| EDA Tools Settings | EDA_Tools_Settings.png | 600 px |}}
  
;Passo 3:
+
==Executando o Modelsim==
 +
;Passo 4:
 +
Execute o Modelsim a partir da IDE do Quartus, '''[Tools > Run Simulation Tool > RTL Simulation'''].  O Modelsim deverá abrir uma tela semelhante a mostrada abaixo. No painel '''Libray''', clique na caixa '''[-]''' na frente da pasta '''[work]''' para mostrar a '''entity''' e a '''architecture'''.
 +
{{fig|3| Modelsim - tela entrada | Modelsim_entrada.png | 400 px |}}
 +
 
 +
 
 +
;Passo 5:
 +
Para iniciar o simulador, de um duplo-click sobre o nome da '''architecture'''. Abrirá uma nova aba '''[sim]''', e o painel de '''Objects''' irá mostrar os sinais de entrada, saída e internos do circuito. A tela deverá ficar semelhante a mostrada abaixo. Observe as colunas atentamente. 
 +
{{fig|4| Modelsim - tela inicial simulador | Modelsim_inicial_simulador.png | 400 px |}}
 +
 
 +
;Passo 6:
 +
Para inserir os sinais no painel Wave, na aba '''[sim]''' de um clique com o botão direito do mouse sobre o nome da '''Instance''' e clique em '''[Add Wave]'''. Abrirá um novo painel '''[Wave]'''. Todos os sinais de entrada e saída (Portas da '''Entity''') serão inseridos no '''Wave''', assim como os sinais internos (declarados como '''Signal'''). A tela deverá ficar semelhante a mostrada abaixo. 
 +
{{fig|5| Modelsim - tela inicial wave | Modelsim_inicial_wave.png | 600 px |}}
 +
Note que a aba '''[Transcript]''' mostrará o comando equivalente, que poderá ser utilizado depois para gerar um script de automatização da simulação.
 +
add wave -position insertpoint sim:/bin2bcd/*
 +
 
 +
;Passo 7:
 +
Modifique o forma de interpretação das informações mostrados no Wave, selecionando os sinais desejados e clicando com o botão direito do mouse sobre a seleção e clique em '''[Radix > Unsigned]'''.  Com isso os bits serão interpretados com números inteiros sem sinal.
 +
 
 +
;Passo 8:
 +
Defina o valor inicial dos estímulos.  No exemplo temos apenas uma entrada, portanto   
 +
{{fig|6| Tela do Wave do Modelsim - comando force | ModelsimWave1.png | 600 px |}}
 +
Note que a aba '''[Transcript]''' mostrará o comando equivalente, que poderá ser utilizado depois para gerar um script de automatização da simulação.
 +
force -freeze sim:/bin2bcd/A 10#13 0
 +
 
 +
;Passo 9:
 +
Execute um passo de simulação.  Existem várias formas de executar o '''Run''':
 +
# No menu execute '''[Simulate > Run > Run 100]'''
 +
# Clique sobre o ícone [[Arquivo:ModelsimRun.png]]
 +
# Digite na aba de '''Transcript''' 
 +
run
 +
*Em todos os casos serão simulados (por ''default'') '''100 ns'''.
 +
*Se desejar simular um tempo maior, pode repetir várias vezes o comando ou digitar o tempo de simulação após o comando '''run'''.
 +
run 13 ps
 +
run 130 ns
 +
* As subunidades de tempo aceitas no Modelsim são:
 +
fs;
 +
ps = 1000 fs;
 +
ns = 1000 ps;
 +
us = 1000 ns;
 +
ms = 1000 us;
 +
sec = 1000 ms;
 +
min = 60 sec;
 +
hr = 60 min;
 +
 
 +
==Simulação funcional==
 +
;Passo 10:
 +
Após executar diversos comandos force e run, você terá na aba Wave algo como mostrado na figura a seguir.  No exemplo é possível mostrar que os valores da entrada binária "'''A'''" foram separados em saídas [[BCD - Binary-coded decimal| BCD]] '''sd''' e '''su'''.
 +
{{fig|7| Modelsim - resultado da simulação | Modelsim_resultado_wave.png | 600 px |}}
 +
Os ícones acima do painel Wave são uteis durante a simulação e são utilizados para inspecionar os sinais.
 +
Para conhecer os detalhes, leia o [[Media:GS_Modelsim.pdf | Getting Started Using Mentor Graphic’s QuestaSim / ModelSim]].  Veja especialmente as seções 2.4 Display Waveform, 2.7 Using the Waveform Window  (Zooming, Selecting Signals, Using Cursors, Saving and Restoring Waveforms)
 +
 
 +
;Passo 11:
 +
Quando o Waveform estiver como deseja, salve essa formatação clicando em '''[File > Save Format]''' ou [Ctrl+S].  Esse comando irá salvar os sinais apresentados no Wave em um arquivo wave.do
 +
<syntaxhighlight lang=tcl>
 +
onerror {resume}
 +
quietly WaveActivateNextPane {} 0
 +
add wave -noupdate -radix unsigned /bin2bcd/A
 +
add wave -noupdate -radix unsigned /bin2bcd/A_uns
 +
add wave -noupdate -radix unsigned /bin2bcd/sd
 +
add wave -noupdate -radix unsigned -childformat {{/bin2bcd/sd_uns(6) -radix unsigned} {/bin2bcd/sd_uns(5) -radix unsigned} {/bin2bcd/sd_uns(4) -radix unsigned} {/bin2bcd/sd_uns(3) -radix unsigned} {/bin2bcd/sd_uns(2) -radix unsigned} {/bin2bcd/sd_uns(1) -radix unsigned} {/bin2bcd/sd_uns(0) -radix unsigned}} -subitemconfig {/bin2bcd/sd_uns(6) {-height 19 -radix unsigned} /bin2bcd/sd_uns(5) {-height 19 -radix unsigned} /bin2bcd/sd_uns(4) {-height 19 -radix unsigned} /bin2bcd/sd_uns(3) {-height 19 -radix unsigned} /bin2bcd/sd_uns(2) {-height 19 -radix unsigned} /bin2bcd/sd_uns(1) {-height 19 -radix unsigned} /bin2bcd/sd_uns(0) {-height 19 -radix unsigned}} /bin2bcd/sd_uns
 +
add wave -noupdate -radix unsigned /bin2bcd/su
 +
add wave -noupdate -radix unsigned -childformat {{/bin2bcd/su_uns(6) -radix unsigned} {/bin2bcd/su_uns(5) -radix unsigned} {/bin2bcd/su_uns(4) -radix unsigned} {/bin2bcd/su_uns(3) -radix unsigned} {/bin2bcd/su_uns(2) -radix unsigned} {/bin2bcd/su_uns(1) -radix unsigned} {/bin2bcd/su_uns(0) -radix unsigned}} -expand -subitemconfig {/bin2bcd/su_uns(6) {-height 19 -radix unsigned} /bin2bcd/su_uns(5) {-height 19 -radix unsigned} /bin2bcd/su_uns(4) {-height 19 -radix unsigned} /bin2bcd/su_uns(3) {-height 19 -radix unsigned} /bin2bcd/su_uns(2) {-height 19 -radix unsigned} /bin2bcd/su_uns(1) {-height 19 -radix unsigned} /bin2bcd/su_uns(0) {-height 19 -radix unsigned}} /bin2bcd/su_uns
 +
TreeUpdate [SetDefaultTree]
 +
WaveRestoreCursors {{Cursor 3} {8000000 ps} 0} {{Cursor 4} {13000000 ps} 0}
 +
quietly wave cursor active 1
 +
configure wave -namecolwidth 150
 +
configure wave -valuecolwidth 100
 +
configure wave -justifyvalue left
 +
configure wave -signalnamewidth 1
 +
configure wave -snapdistance 10
 +
configure wave -datasetprefix 0
 +
configure wave -rowmargin 4
 +
configure wave -childrowmargin 2
 +
configure wave -gridoffset 0
 +
configure wave -gridperiod 1
 +
configure wave -griddelta 40
 +
configure wave -timeline 0
 +
configure wave -timelineunits us
 +
update
 +
WaveRestoreZoom {0 ps} {21 us}
 +
</syntaxhighlight>
 +
 
 +
;Passo 12:
 +
Preparando um script de simulação automática.
 +
Para repetir de forma automática uma simulação já realizada, selecione os comandos executados e salve como um novo arquivo '''tb_Bin2bcd.do'''.  Antes de salvar o arquivo apague as linhas de comentário (iniciadas com #), e na linha de compilação, substitua o caminho absoluto do arquivo por um relativo '''../../filename.vhd'''.  Também substitua todos os comandos '''add wave''' utilizados pelo script '''do wave.do'''.
 +
<syntaxhighlight lang=tcl>
 +
do bin2bcd_run_msim_rtl_vhdl.do
 +
vcom -reportprogress 300 -93 -work work ../../bin2bcd.vhd
 +
vsim work.bin2bcd(ifsc_v1)
 +
do wave.do
 +
force -freeze sim:/bin2bcd/A 10#45 0, 10#13 8us, 10#97 12us, 10#09 12.2us
 +
run 20 us
 +
</syntaxhighlight>
 +
 
 +
Para executar o script, digite apenas
 +
do tb_bin2bcd.do
 +
 
 +
;Consulte:
 +
*[[Documentação do ModelSim]]
 +
*[https://avi-brown.medium.com/how-to-use-do-files-in-modelsim-vhdl-simulations-dd8e5a663a5a How to use .do files in ModelSim VHDL simulations]

Edição atual tal como às 11h04min de 13 de junho de 2023

Essa página descreve os passos a serem realizados para a simulação funcional no Modelsim de um circuito implementado no Quartus Prime 20.1.1, disponibilizados na nuvem do IFSC.

Antes de acessar o simulador, o circuito deve estar descrito em VHDL utilizando o Quartus Prime, e o este deve ser configurado corretamente.

Configurando o Quartus Prime

Passo 1

Digite o seguinte código VHDL ou seu próprio código e após salvar o projeto faça a Analysis & Synthesis [Crtl+k].

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity bin2bcd is
	port (
		A      : in  std_logic_vector (6 downto 0);
		sd, su : out std_logic_vector (3 downto 0)
	);
end entity;

architecture ifsc_v1 of bin2bcd is
	signal A_uns          : unsigned (6 downto 0);
	signal sd_uns, su_uns : unsigned (6 downto 0);

begin
	sd     <= std_logic_vector(resize(sd_uns, 4));
	su     <= std_logic_vector(resize(su_uns, 4));
	sd_uns <= A_uns/10;
	su_uns <= A_uns rem 10;
	A_uns  <= unsigned(A);
end architecture;
Passo 2

Verifique se o caminho para o ModelSim está correto [Tools > Options > General > EDA Tools Options]. O campo Modelsim-Altera deve estar com

/opt/intelFPGA/20.1/modelsim_ae/linuxaloem

Figura 1 - EDA Tools Options
EDA Tools Options.png
Fonte: Elaborado pelo autor.
Passo 3

Verifique se o formato do arquivo de simulação no ModelSim está correto [Assigments > Settings.. > General > EDA Tools Settings ]. O campo Formats da linha Simulation deve estar com

VHDL

Figura 2 - EDA Tools Settings
EDA Tools Settings.png
Fonte: Elaborado pelo autor.

Executando o Modelsim

Passo 4

Execute o Modelsim a partir da IDE do Quartus, [Tools > Run Simulation Tool > RTL Simulation]. O Modelsim deverá abrir uma tela semelhante a mostrada abaixo. No painel Libray, clique na caixa [-] na frente da pasta [work] para mostrar a entity e a architecture.


Figura 3 - Modelsim - tela entrada
Modelsim entrada.png
Fonte: Elaborado pelo autor.


Passo 5

Para iniciar o simulador, de um duplo-click sobre o nome da architecture. Abrirá uma nova aba [sim], e o painel de Objects irá mostrar os sinais de entrada, saída e internos do circuito. A tela deverá ficar semelhante a mostrada abaixo. Observe as colunas atentamente.


Figura 4 - Modelsim - tela inicial simulador
Modelsim inicial simulador.png
Fonte: Elaborado pelo autor.
Passo 6

Para inserir os sinais no painel Wave, na aba [sim] de um clique com o botão direito do mouse sobre o nome da Instance e clique em [Add Wave]. Abrirá um novo painel [Wave]. Todos os sinais de entrada e saída (Portas da Entity) serão inseridos no Wave, assim como os sinais internos (declarados como Signal). A tela deverá ficar semelhante a mostrada abaixo.


Figura 5 - Modelsim - tela inicial wave
Modelsim inicial wave.png
Fonte: Elaborado pelo autor.

Note que a aba [Transcript] mostrará o comando equivalente, que poderá ser utilizado depois para gerar um script de automatização da simulação.

add wave -position insertpoint sim:/bin2bcd/*
Passo 7

Modifique o forma de interpretação das informações mostrados no Wave, selecionando os sinais desejados e clicando com o botão direito do mouse sobre a seleção e clique em [Radix > Unsigned]. Com isso os bits serão interpretados com números inteiros sem sinal.

Passo 8

Defina o valor inicial dos estímulos. No exemplo temos apenas uma entrada, portanto


Figura 6 - Tela do Wave do Modelsim - comando force
ModelsimWave1.png
Fonte: Elaborado pelo autor.

Note que a aba [Transcript] mostrará o comando equivalente, que poderá ser utilizado depois para gerar um script de automatização da simulação.

force -freeze sim:/bin2bcd/A 10#13 0
Passo 9

Execute um passo de simulação. Existem várias formas de executar o Run:

  1. No menu execute [Simulate > Run > Run 100]
  2. Clique sobre o ícone ModelsimRun.png
  3. Digite na aba de Transcript
run
  • Em todos os casos serão simulados (por default) 100 ns.
  • Se desejar simular um tempo maior, pode repetir várias vezes o comando ou digitar o tempo de simulação após o comando run.
run 13 ps
run 130 ns
  • As subunidades de tempo aceitas no Modelsim são:
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns; 
ms = 1000 us; 
sec = 1000 ms; 
min = 60 sec; 
hr = 60 min;

Simulação funcional

Passo 10

Após executar diversos comandos force e run, você terá na aba Wave algo como mostrado na figura a seguir. No exemplo é possível mostrar que os valores da entrada binária "A" foram separados em saídas BCD sd e su.


Figura 7 - Modelsim - resultado da simulação
Modelsim resultado wave.png
Fonte: Elaborado pelo autor.

Os ícones acima do painel Wave são uteis durante a simulação e são utilizados para inspecionar os sinais. Para conhecer os detalhes, leia o Getting Started Using Mentor Graphic’s QuestaSim / ModelSim. Veja especialmente as seções 2.4 Display Waveform, 2.7 Using the Waveform Window (Zooming, Selecting Signals, Using Cursors, Saving and Restoring Waveforms)

Passo 11

Quando o Waveform estiver como deseja, salve essa formatação clicando em [File > Save Format] ou [Ctrl+S]. Esse comando irá salvar os sinais apresentados no Wave em um arquivo wave.do

onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate -radix unsigned /bin2bcd/A
add wave -noupdate -radix unsigned /bin2bcd/A_uns
add wave -noupdate -radix unsigned /bin2bcd/sd
add wave -noupdate -radix unsigned -childformat {{/bin2bcd/sd_uns(6) -radix unsigned} {/bin2bcd/sd_uns(5) -radix unsigned} {/bin2bcd/sd_uns(4) -radix unsigned} {/bin2bcd/sd_uns(3) -radix unsigned} {/bin2bcd/sd_uns(2) -radix unsigned} {/bin2bcd/sd_uns(1) -radix unsigned} {/bin2bcd/sd_uns(0) -radix unsigned}} -subitemconfig {/bin2bcd/sd_uns(6) {-height 19 -radix unsigned} /bin2bcd/sd_uns(5) {-height 19 -radix unsigned} /bin2bcd/sd_uns(4) {-height 19 -radix unsigned} /bin2bcd/sd_uns(3) {-height 19 -radix unsigned} /bin2bcd/sd_uns(2) {-height 19 -radix unsigned} /bin2bcd/sd_uns(1) {-height 19 -radix unsigned} /bin2bcd/sd_uns(0) {-height 19 -radix unsigned}} /bin2bcd/sd_uns
add wave -noupdate -radix unsigned /bin2bcd/su
add wave -noupdate -radix unsigned -childformat {{/bin2bcd/su_uns(6) -radix unsigned} {/bin2bcd/su_uns(5) -radix unsigned} {/bin2bcd/su_uns(4) -radix unsigned} {/bin2bcd/su_uns(3) -radix unsigned} {/bin2bcd/su_uns(2) -radix unsigned} {/bin2bcd/su_uns(1) -radix unsigned} {/bin2bcd/su_uns(0) -radix unsigned}} -expand -subitemconfig {/bin2bcd/su_uns(6) {-height 19 -radix unsigned} /bin2bcd/su_uns(5) {-height 19 -radix unsigned} /bin2bcd/su_uns(4) {-height 19 -radix unsigned} /bin2bcd/su_uns(3) {-height 19 -radix unsigned} /bin2bcd/su_uns(2) {-height 19 -radix unsigned} /bin2bcd/su_uns(1) {-height 19 -radix unsigned} /bin2bcd/su_uns(0) {-height 19 -radix unsigned}} /bin2bcd/su_uns
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {{Cursor 3} {8000000 ps} 0} {{Cursor 4} {13000000 ps} 0}
quietly wave cursor active 1
configure wave -namecolwidth 150
configure wave -valuecolwidth 100
configure wave -justifyvalue left
configure wave -signalnamewidth 1
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
configure wave -gridoffset 0
configure wave -gridperiod 1
configure wave -griddelta 40
configure wave -timeline 0
configure wave -timelineunits us
update
WaveRestoreZoom {0 ps} {21 us}
Passo 12

Preparando um script de simulação automática. Para repetir de forma automática uma simulação já realizada, selecione os comandos executados e salve como um novo arquivo tb_Bin2bcd.do. Antes de salvar o arquivo apague as linhas de comentário (iniciadas com #), e na linha de compilação, substitua o caminho absoluto do arquivo por um relativo ../../filename.vhd. Também substitua todos os comandos add wave utilizados pelo script do wave.do.

do bin2bcd_run_msim_rtl_vhdl.do
vcom -reportprogress 300 -93 -work work ../../bin2bcd.vhd 
vsim work.bin2bcd(ifsc_v1)
do wave.do
force -freeze sim:/bin2bcd/A 10#45 0, 10#13 8us, 10#97 12us, 10#09 12.2us
run 20 us

Para executar o script, digite apenas

do tb_bin2bcd.do
Consulte