Introdução VHDL Parte 4 - Testbench Prof. Mário Luiz Rodrigues mario.luiz@ifmg.edu.br Prof. Otávio Gomes otavio.gomes@ifmg.edu.br 1
library IEEE; use IEEE.std_logic_1164.all; entity portae is port( a: in STD_LOGIC; b: in STD_LOGIC; s: out STD_LOGIC); end portae; architecture portae_arch of portae is begin s <= a and b; end portae_arch; 2
3
library IEEE; use IEEE.std_logic_1164.all; entity portaou is port ( a: in STD_LOGIC; b: in STD_LOGIC; s: out STD_LOGIC ); end portaou; architecture portaou_arch of portaou is begin s <= a or b; end portaou_arch; 4
5
library IEEE; use IEEE.std_logic_1164.all; entity inversor is port ( a: in STD_LOGIC; s: out STD_LOGIC ); end inversor; architecture inversor_arch of inversor is begin s <= not a; end inversor_arch; 6
7
library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_arith.all; entity somador4bits is port ( dadoa : in unsigned (3 downto 0); dadob : in unsigned (3 downto 0); result: out unsigned (4 downto 0) ); end somador4bits; architecture arch_soma of somador4bits is begin result(4 downto 0) <= ('0' & dadoa(3 downto 0)) + ('0' & dadob(3 downto 0)); end arch_soma ; 8
9
library IEEE; use IEEE.std_logic_1164.all; entity mux21_conc is port ( a: in bit; b: in bit; s: in bit; z: out bit ); end mux21_conc ; architecture mux21_arch of mux21_conc is signal aok, bok, ns : bit; begin aok <= a and s; bok <= b and ns; ns <= not(s); z <= aok or bok; end mux21_arch; 10
11
library IEEE; use IEEE.std_logic_1164.all; entity mux21_estrut is port ( a: in STD_LOGIC; sel: in STD_LOGIC; ); end mux21_estrut; b: in STD_LOGIC; saida: out STD_LOGIC architecture mux21_arch of mux21_estrut is signal aok,bok,ns : STD_LOGIC; component portae port(a, b : in STD_LOGIC; s : out STD_LOGIC); end component; component portaou port(a,b : in STD_LOGIC; s : out STD_LOGIC); end component; component inversor port(a : in STD_LOGIC; s : out STD_LOGIC); end component; begin u1: portae port map (a,sel,aok); u2: inversor port map(sel,ns); u3: portae port map (ns,b,bok); u4: portaou port map (aok,bok,saida); end mux21_arch; 12
Descrição de Circuitos com VHDL Testbench 13
Teste de código VHDL O código VHDL permite utilizar vários comandos e construções, porém nem todos estes comando ou construções são suportadas pelas ferramentas de síntese. Por exemplo, software Quartus da ALTERA é uma ferramenta utilizada para sintetizar o código VHDL e programar dispositivos PLD s e FPGA s, mas não suporta algumas opções de utilização dos comandos WAIT e AFTER. 14
Teste de código VHDL Comando WAIT O comando Wait possui várias opções de utilização como: wait until, wait on e wait for. As duas primeiras necessitam de uma lista de sensibilidade assim como um processo. Não suportadas por algumas ferramentas de síntese. WAIT ON lista de sensibilidade; WAIT UNTIL expressão booleana; WAIT ON lista de sensibilidade UNTIL condição booleana; 15
Teste de código VHDL Onde é utilizada esta construção? Softwares como Modelsim são programas que testam códigos VHDL sem se preocupar se o código é sintetizável ou não. Portanto todos os comandos utilizados na descrição do código VHDL são aceitos por este software. 16
Testbench Testbench: recurso em VHDL que permite que um circuito sob teste (Unit Under Test UUT) seja submetido a sinais de estímulo e tenha a sua funcionalidade verificada. 17
Testbench Um projeto fica incompleto se não for verificado. Uma das formas de se testar a descrição VHDL é pelo uso de testbench. Testbench é um ambiente onde o projeto, chamado de design ou Unit Under Test (UUT) é verificada através da aplicação de sinais ou estímulos, e da monitoração de suas respostas. Em outras palavras, um testbench substitui o ambiente de projeto, de forma que o comportamento do projeto possa ser observado e analisado. 18
Testbench Uma forma de testar o projeto: Na sua forma mais simples, contém um processo gerador de teste e uma instância do projeto O testbench não contém portas de entrada/saída, é um sistema fechado 19
Consiste de: Uma chamada do componente sob teste (UUT Unit Under Test) ; Geradores de estímulos; Os estímulos são um conjunto de sinais declarados internamente na arquitetura do testbench e passada aos ports da UUT por sua chamada. Os estímulos são definidos como formas de onda em um ou mais processos comportamentais. Ferramentas para monitoramento das respostas do circuito aos estímulos aplicados. TESTBENCH Y Gerador A de Estimulos Z B Unidade A sob Teste Y B Z 20
Testbench Os comandos que descrevem os estímulos não são sintetizáveis. Ex: 21
Formato de um Testbench O test bench é como outra especificação VHDL. Consiste de uma entity e de uma architecture. Uma importante diferença é que a entity de uma descrição de testbench não tem ports. Isto se deve ao fato que a descrição testbench não representa circuito real que precisa se comunicar com o ambiente e, portanto não tem entradas ou saídas. Todos os valores para os ports de entrada da UUT são especificados no testbench como estímulo. 22
Formato de um Testbench As saídas são observadas pelo simulador e podem ser armazenadas em um arquivo. O arquivo a ser testado não precisa de modificações ou comandos adicionais. Assim, qualquer especificação VHDL pode ser testada. A UUT deve ser chamada na arquitetura da test bench. Isto pode ser feito da mesma forma que qualquer especificação estrutural, através de componente. Aos ports da UUT devem ser atribuídos os estímulos. 23
Formato de um Testbench Como os processos e a chamada de componentes são concorrentes, não faz diferença se a UUT ou o estímulo for definido primeiro. A parte principal de um testbench é o conjunto de estímulos. Como o testbench não se comunica com o ambiente por sinais, todos os estímulos devem ser declarados como sinais no cabeçalho da architecture do testbench. Os estímulos podem ser especificados tanto como declarações concorrentes (mudanças nos sinais especificados como formas de onda), ou como processo que contenha declarações de sinais separados por comandos wait e for, introduzindo atrasos entre declarações subseqüentes. 24
Formato de um Testbench 25
Formato de um Testbench 26
Formato de um Testbench 27
Formato de um Testbench Uso de Constantes 28
Formato de um Testbench Uso de Constantes 29
Formato de um Testbench Uso de Constantes 30
Formato de um Testbench Uso de Constantes Exemplo de teste para um flip-flop D utilizando constantes Objetivo: Descrição de sinais que podem ser adaptados para simulações em várias freqüências, alterando apenas o valor de uma constante Periodo de clock alterado para 500 ns - 4. 31
Testbench Ao final de uma verificação tem-se o resultado da simulação e/ou uma listagem de resultados na forma de relatório. Isto é obtido de várias formas; usando aplicativos dos simuladores, como nos exemplos anteriores(listagem das variações dos sinais ao longo do tempo ou telas gráficas), Ou usando o comando report que apresenta na tela do software de simulação ou em um arquivo os resultados de toda a simulação. Esta ultima forma é fácil de usar, e é empregada para mostrar uma mensagem quando há erros. Se esta opção é usada e não há mensagem durante a simulação, então se presume que o UUT tenha funcionado como esperado. 32
Testbench Em conjunto com o comando report utiliza-se a declaração assert que verifica uma condição Booleana, que define uma mensagem a ser apresentada quando a condição é falsa O comando assert é por natureza seqüencial e portando usado em um processo. Deve-se usar o par assert-report para cada novo valor esperado do UUT e deve haver uma respectiva condição no conjunto. 33
Testbench É esperado na mensagem que seja especificado no que ocorreu, quando ocorreu e os valores das entradas. Lembre-se que os novos valores só são atribuídos quando o processo é suspenso. Não se deve esperar valores nas saídas imediatamente após a sua atribuição. O comando report consiste da declaração assert que verifica uma condição Booleana, da declaração report que define uma mensagem a ser apresentada quando a condição é falsa, e da declaração severity que informa ao simulador quão severa foi a condição de erro encontrada, variando desde um alerta até uma falha geral no sistema. 34
Testbench Esta ultima forma é fácil de usar, e é empregada para mostrar uma mensagem quando há erros. Se esta opção é usada e não há mensagem durante a simulação, então se presume que a UUT tenha funcionado como esperado. 35
Modelsim - Altera 36
Quartus - Modelsim Instruções para rodar inserindo Formas de Onda a partir do software Quartus 37
Após feito a descrição no Quartus e salvado corretamente, abra o programa Modelsim Altera. 38
Na barra de ferramentas clique em COMPILE e em seguida em COMPILE OPTIONS Nesta janela você vai configurar como deseja que o Modelsim compile sua descrição. 39
Depois de configurado a simulação clique novamente em COMPILE e em seguida em COMPILE... Nesta janela você vai selecionar a descrição que deseja simular. No campo EXAMINAR selecione a pasta e escolha o arquivo (.vhdl) e clique em COMPILE. 40
Observe que na janela TRANSCRIP vai aparecer mensagens mostrando que a entidade e a arquitetura foi carregada e compilada. Ex.: # -- Loading package standard # -- Compiling entity wait_a # -- Compiling architecture teste of wait_a Após isso clique em DONE. 41
Na janela WORKSPACE clique em WORK. Veja que o arquivo está foi compilado para a pasta WORK do modelsim. Clicando no sinal + ao lado da entidade a que irá ser submetida a simulação verá que dentro da entidade wait_a existe uma arquitetura chamada teste onde está estruturado nosso código. Dê duplo clique sobre a entidade wait_a. 42
Veja que na janela WORKSPACE foi listado os processos que existem na entidade e na janela OBJECTS foi listada as entradas e saídas da entidade wait_a. 43
Na barra de ferramentas no menu View habilite a janela Wave para fazermos a simulação por forma de onda. 44
Selecione e arraste as entradas e saídas da janela OBJECTS para a janela WAVE. 45
Na barra de ferramentas no menu Simulate escolha a opção Runtime Options... Aqui você pode definir como quer que os sinais sejam exibidos, tempo padrão de simulação, número de iterações... 46
Na barra de ferramentas no menu Simulate e submenu Run existem seis opções de simulação. Simula até 1us (tempo definido em Runtime Opitions) Simula até completar as 5000 iterações (definido em Runtime Opitions) 47
48
49
50
Para alterar a forma de visualizar o sinal, clique com o botão direito do mouse sobre o sinal, selecione propriedades. Em Radix selecione como deseja ver o sinal. Altere as saídas xa e xb para unsigned. 51
Este software simula o código VHDL sem se importar se ele é sintetizavel ou não. Então é feito no Quartus uma descrição para testar outra descrição. Como assim? As vezes é muito demorado ficar gerando formas de onda para testar uma descrição, ou então um mesmo conjunto de forma de onda é utilizado para testar algumas variações da descrição que possui as mesmas entradas e saídas. Então para isso é utilizado uma descrição para fazer o teste de outra descrição. 52
Quartus - Modelsim Instruções para rodar um TestBench a partir do software Quartus 53
library IEEE; use IEEE.std_logic_1164.all; entity ffdr is port ( d: in STD_LOGIC; clk: in STD_LOGIC; rst: in STD_LOGIC; saida: out STD_LOGIC ); end ffdr; architecture ffdr_arch of ffdr is signal q : STD_LOGIC; begin ffdr: process (d,clk,rst) begin if rst='1' then q <= '0'; elsif rising_edge(clk) then q <= d; end if; end process ffdr; saida <= q; end ffdr_arch; 54
Ferramenta Altera Quartus Criando um projeto novo 55
Ferramenta Altera Quartus Criando um projeto novo 56
Ferramenta Altera Quartus Criando um projeto novo 1 2 3 4 57
Ferramenta Altera Quartus Criando um projeto novo Carregando um arquivo existente 58
Ferramenta Altera Quartus Criando um projeto novo Carregando um arquivo existente 59
Ferramenta Altera Quartus Criando um projeto novo Carregando um arquivo existente 60
Ferramenta Altera Quartus Criando um projeto novo Carregando um arquivo existente 61
Ferramenta Altera Quartus Criando um projeto novo - Escolha da família (Cyclone II) e do modelo (EP2C20F484C7) da FPGA 1 2 3 62
Ferramenta Altera Quartus Criando um projeto novo 63
Ferramenta Altera Quartus Criando um projeto novo 64
Ferramenta Altera Quartus Projeto novo criado com sucesso 65
66
67
Test bench Verificar o arquivo fornecido Test bench. OBS: Não adicionar o arquivo ao projeto. O software QUARTUS não sintetiza as descrições deste arquivo. Será utilizado o software MODELSIM (Mentor Graphics) para simulação e analise. 68
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY vetor_teste IS END vetor_teste; ARCHITECTURE sinais OF vetor_teste IS SIGNAL dado SIGNAL clk SIGNAL rst SIGNAL sinal_saida : STD_LOGIC; : STD_LOGIC; : STD_LOGIC; : STD_LOGIC; COMPONENT ffdr port ( d: in STD_LOGIC; clk: in STD_LOGIC; rst: in STD_LOGIC; saida: out STD_LOGIC); END COMPONENT; (...) 69
BEGIN UUT: ffdr PORT MAP( d clk rst saida => dado, => clk, => rst, => sinal_saida); signal_clk: PROCESS BEGIN clk<= '0'; WAIT FOR 50 ns; clk<= '1'; WAIT FOR 50 ns; END PROCESS; signal_rst: PROCESS BEGIN rst<= '1'; WAIT FOR 100 ns; rst<= '0'; WAIT FOR 10000 ns; END PROCESS; signal_dado: PROCESS BEGIN dado<= '0'; WAIT FOR 200 ns; dado<= '1'; WAIT FOR 200 ns; END PROCESS; END sinais; 70
Ir no menu Assignments / Settings e editar o campo Simulation, clicando sobre o botão TestBenches e em seguida clicar em New. 71
Ir no menu Assignments / Settings e editar o campo Simulation, clicando sobre o botão TestBenches e em seguida clicar em New. 72
Ir no menu Assignments / Settings e editar o campo Simulation, clicando sobre o botão TestBenches e em seguida clicar em New. 73
Preencher os campos Test bench Name, Top level module in test bench, e o nome da instância criada no arquivo de test bench, a seguir, selecionar o arquivo de testbench e clicar em add. 74
75
76
No Menu Tools / Run Simulation Tool / RTL Simulation, e a seguir o ModelSim irá abrir e executar a simulação. Simulação Funcional Simulação considerando atrasos das células e roteamento Inicio da simulação 77
Abaixo são mostrados os resultados obtidos apresentados no ModelSim. Simulação Funcional por este test bench 78
Abaixo são mostrados os resultados obtidos apresentados no ModelSim. Simulação Funcional por este test bench 79