650 likes | 768 Views
Validação de VHDL: técnicas e ferramentas. Alexandre Amory (amory@inf.pucrs.br). Técnicas Práticas Básicas Design for Portability Design for Synthesis Design for Verification VHDL comportamental Técnicas de Verificação Arquiteturas de TB Automatização. Ferramentas FPGA Advantage
E N D
Validação de VHDL:técnicas e ferramentas Alexandre Amory (amory@inf.pucrs.br)
Técnicas Práticas Básicas Design for Portability Design for Synthesis Design for Verification VHDL comportamental Técnicas de Verificação Arquiteturas de TB Automatização Ferramentas FPGA Advantage Co-sim ModelSim LeonardoSpectrum Quartus Exemplos somador sqrt polígonos wrapper Tópicos Abordados
scripts Fluxo de Projeto Simplificado especificação descrição do HDL • guidelines • estílo verificação funcional • Modelsim/co-sim • TB estruturado • qualidade síntese lógica • Leonardo verificação temporal • Modelsim • ganho de tempo • re-utiliza TB síntese física • Chipscope • SignalTap prototipação
Referências • Writing Testbenches [621.38173 B496w] • ferramentas de verificação • HDL comportamental • arquitetura de testbenches • tipos de geradores de estímulos e avaliadores de respostas • Reuse Methodology Manual [621.38173 K25r] • guidelines • System-on-chip Verification [004.16 R224s] • validação no nível de sistema • co-verificação • Manual do Modelsim/FLI • Diversos livros de VHDL • guidelines para síntese
Referências • Principles of Testing Electronic Systems [621.381548 M929p] • TextBook de Teste • Geradores de estímulos e compactadores de respostas embutidos: LFSR, MISR entre outros • Essentials of Electronic Testing [621.38173 B978e] • TextBook de Teste • A Designer’s Guide to Built-In Self-Test [621.381 s925d] • Muitos Outros
Técnicas de Verificação Alexandre Amory (amory@inf.pucrs.br)
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • Técnicas de Verificação • Ferramentas
Introdução • Porque devo me importar com verificação? • Porque você tem que fazer algo que funcione!!! Óbvio!!! • Porque você não tem todo o tempo do mundo para terminar o projeto • Porque devo fazer um testbench que leva mais tempo para fazer e é mais complicado? • Economia de tempo BURRA !!!! • Efeito “bola de neve” • 70% do tempo de projeto é para verificação
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • Técnicas de Verificação • Ferramentas
Práticas Básicas • Convenções de nomes (sinais, entidades, arquivos, etc) • Incluir headers nos fontes • descrição (func, autor, versão, etc) • formato e temp. de entrada e saída • histórico • Comentários (inglês) • Indentação • Instanciação (associação por nomes) • Uma linha por comando/declaração DISCIPLINA !!!
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • Técnicas de Verificação • Ferramentas
Design for Portability • Usar tipos baseados nos tipos padrões IEEE • std_logic x std_ulogic • Não usar valores fixos na descrição • use generic ou constant • Evitar código dependente de tecnologia • usar e abusar de regras de inferência (ISE e Quartus) • se for inevitável, descreva-o em uma entidade separada • Não se vicie num único conjunto de ferramentas • simule com diversos simuladores • sintetize para targets diferentes DISCIPLINA !!!
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • Técnicas de Verificação • Ferramentas
Regras de Clock • Evite utilizar duas bordas • isto é necessário somente para projetos com restrições de timing rigorosas • complica testabilidade (criação de cadeias diferentes por borda) • complica timing analysis (duty cycle torna-se crítico) • Evitar gated clocks • Evitar clocks e resets gerados internamente
reset síncrono process(clk) begin if clk’event and clk = ‘1’ then if rst = ‘1’ then ... else ... end if; end if; end process; reset assíncrono process(clk,rst) begin if rst = ‘1’ then ... elsif clk’event and clk = ‘1’ then ... end if; end process; Inferência de Registradores
architecture .... type state is (S0,S1,S2,S3); signal ea,pe : state; ... comb_proc: process(inputs,ea) begin case (ea) is when S0 => outputs <= input +1; ... pe <= S1; when S1 => when S2 => when S3 => when others => end case; end process; synch_proc : process (rst,clock) begin if rst = ‘1’ then ea <= S0; elsif clk’event and clk = ‘1’ then ea <= pe; end if; end process; Inferência de Máquina de Estados 2 processos
architecture .... type state is (S0,S1,S2,S3); signal ea,pe : state; ... trans_proc: process(inputs,ea) begin case (ea) is when S0 => pe <= S1; when S1 => when S2 => when S3 => when others => end case; end process; synch_proc : process (rst,clock) begin if rst = ‘1’ then ea <= S0; elsif clk’event and clk = ‘1’ then ea <= pe; end if; end process; comb_proc: outputs <= inputs + 1 when ea = S1 else (others => ‘0’); Inferência de Máquina de Estados 3 processos
Maus exemplos: process (a,b) begin if (a = ‘1’) then q <= b; end if; end process; process(c) begin case c is when ‘0’ => q <= ‘1’; z <= ‘0’; when others => q <= ‘0’; end case; end process; Exemplo1 falta else Exemplo2 falta atribuição de z quando c é diferente de ‘0’. Para evitar: atribua valores default as saídas process(inputs,state) begin outpus <= ‘0’; case (state) ... end case; end process; Evitar Latches
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • VHDL comportamental • Técnicas de Verificação • Ferramentas
Teste x Verificação • Verificação • usado para verificar se o projeto está de acordo com o desejado • objetivo é verificar a funcionalidade • a ferramenta mais utilizada é o simulador • Teste • usado para verificar a fabricação do dispositivo • objetivo não é verificar a funcionalidade • objetivo é exercitar as nós físicos do sistema • nós devem ir de 0 para 1 ou de 1 para 0 • usa padrões específicos para exercitar estes nós • estes padrões são gerados por ferramenta de ATPG (automatic test pattern generation )
Controlabilidade e Observabilidade • Alguns projetos podem ter pontos onde é: • difícil de colocar em um valor determinado • difícil controlabilidade • difícil de ler seu valor pelas portas de saída • difícil observabilidade • Alguma vez você já teve que colocar mais portas de entrada ou de saída no top, para controlar ou para receber seu valor de um circuito ? • Imagine que este circuito está bem “escondido” lá no 7º nível de hierarquia do seu projeto ???? Oque você faria ??? • Teria que modificar todas as entidades superiores ao nível
SignalSpy e Sinal Global • SignalSpy é um recurso do Modelsim que permite acesso a sinais internos da UUT • uso: • Signal_Spy("/uut/sum", "/buried_sum"); • Sinais globais podem ser utilizados nos níveis inferiores do projeto library ieee; use ieee.std_logic_1164.all; package global_sigs is signal sum_int : integer range 0 to 255; signal maximum : bit; end;
ENTITY library IEEE; use IEEE.std_logic_1164.all; use work.global_sigs.all; entity adder is port (...); end adder; architecture behavioral of adder is begin vsum <= a + b; sum <= vsum; ... end architecture TB library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use work.global_sigs.all; architecture adder of testbench is component adder port (...); end component; begin ... value_vsum <= vsum; ... end architecture; Exemplo de Sinal Global
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • VHDL comportamental • Técnicas de Verificação • Ferramentas
VHDL Comportamental • VHDLRTL X VHDLcomportamental • RTL foca implementação • Comportamental foca comportamento • não use VHDL RTL para descrever TB • código comportamental é mais rápido de descrever e mais simples • código comportamental aumenta desempenho da simulação • descrever sistema e seu TB requer conhecimento de TODA a linguagem VHDL
ack==0 ack==1 req=1 req=0 ack==1 ack==0 RTL X Comportamental Type STATE_TYPE is (...,MAKE_REQ,RELEASE,...); signal STATE, NEXT_STATE : STATE_TYPE; ... COMB:process(state,ack) begin case STATE is ... when MAKE_REQ => REQ <= ‘1’; if ACK = ‘1’ then NEXT_STATE <= RELEASE; endif; ... endcase; endprocess; SEQ: process(clk) begin if clk’event and clk = ‘1’ then if reset = ‘1’ then state <= ....; else state <= NEXT_STATE; endif; endif; endprocess; process begin ... req <= ‘1’; waituntil ack = ‘1’; req <= ‘0’; waituntil ack = ‘0’; ... endprocess;
VHDL Comportamental • Algumas estruturas geralmente não utilizadas em código RTL mas úteis em código comportamental são: • funções e procedimentos • tipo string e time • arquivos • registros, matrizes • listas, ponteiros e alocação dinâmica • asserção • outras dicas
Funções e Procedimentos • Encapsular detalhes de implementação • funções de conversão de tipo • funções de leitura e escrita de arquivo • encapsula a formatação do arquivo • encapsular temporização de sinais e barramentos (BFM)
Arquivos • Usar packges para encapsupar detalhes do formato dos arquivos de entrada e saída package IO_Pack is file InputFile : TEXT open READ_MODE is ”input.txt"; file OutputFile : TEXT open WRITE_MODE is ”output.txt"; procedure ReadFile(...); procedure WriteFile(...); endpackage; packagebody IO_Pack is procedureReadFile(...) is begin ... readline(...); read(...); read(...); ... end procedure; procedureWriteFile(...) is begin ... writeline(...); write(...); write(...); ... endprocedure; end package body;
EXEMPLO 1 type bus_data is array(integer range <>) of std_logic_vector(31 downto 0); signal bus_interface busdata(N-1 downto 0); ... If reset = ‘0’ then bus_interface <= (others => (others => ‘0’)); else ... EXEMPLO 2 type array1T is array(1 to 2) of natural; type array2T is array(1 to 1024) of array1T; ... signal table : array2T table <= ( others => (0,0)); ... type vector is record LD : std_logic; LL : std_logic; RST : std_logic; D : std_logic_vector(7 downto 0); P : std_logic; endrecord; type vectorArrayType is array (0 to TABLE_SIZE) ofvector; constant vectorTable : vectorArrayType := ( -- LD LL RST D P ( ‘0’, ‘0’, ‘0’, “xxxxxxxx” ‘0’), ( ‘0’, ‘0’, ‘1’, “xxxxxxxx” ‘0’), ( ‘0’, ‘0’, ‘1’, “xxxxxxxx” ‘0’), ( ‘1’, ‘0’, ‘0’, “00000101” ‘0’), ( ‘0’, ‘1’, ‘0’, “11010100” ‘0’), ( ‘0’, ‘0’, ‘0’, “xxxxxxxx” ‘1’), ( ‘0’, ‘0’, ‘0’, “xxxxxxxx” ‘1’), ... ); Registros e Matrizes
process type list_typ; type list_ptr is access list_typ; type list_typ is record base_addr : natural; data : natural; next_node : list_ptr; end record; variable head : list_ptr; begin ... end process; process procedure get_data(addr : in natural; here : out list_ptr) is variable element : list_ptr; begin element := head; -- busca posição element := new list_typ; element.base := 123; element.next_node := head; element.data := 456; head := element; here := element; end procedure; begin ... end process; Listas, Ponteiros e Alocação Dinâmica Fonte: writing testbenches
Asserção • Útil para comparar valores de saída e parar a simulação em caso de erro • Exemplo: Assert (golden_out /= data_out) report “error in sumulation!!!”
Alguns são: T’Left T’Right T’Low T’High T’Image T’ Ascending procedure lfsr(constant polynomial : in std_logic_vector; variable sig: inout std_logic_vector) is variable i : std_logic_vector(polynomial'range) := sig; begin i := i(i'left-1 downto 0)&i(i'left); if sig(sig'left) = '1' then i := i xor polynomial; endif; sig := i; end procedure; Atributos Pré-Definidos ... variable var: integer; ... write(outline,”valor = ” & integer'image(var); ...
Outras Dicas Gerais • Como gerar arquivos de saída com nomes diferentes para cada simulação entity tb is generic (outputFile: string := "saida”); endentity ... file PoligFile : TEXT open READ_MODE is outputFile & ".txt"; ...
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • Técnicas de Verificação • Tipos de Verificação • Arquiteturas de TestBenches • Geração de Estímulos • Avaliação de Respostas • Referencial • Ferramentas
Tipos de Verificação • Compliance Testing • verificar projeto de acordo com especificação • Corner Case • verificar situações críticas do projeto • Random • complementar aos testes anteriores • cria situações “inusitadas” • Real Code • utilizar estímulos reais da aplicação • Regression • evita inserção de novos bugs no sistema Fonte: reuse methodology manual
SUMÁRIO • Introdução • Práticas Básicas • Design for Portability • Design for Synthesis • Design for Verification • Técnicas de Verificação • Tipos de Verificação • Arquiteturas de TestBenches • Geração de Estímulos • Avaliação de Respostas • Referencial • Ferramentas
Arquiteturas de Testbench • Principais partes: • geração de estímulos • avaliação/comparação de respostas • UUT • referencial testbench geração de estímulos UUT referencial avaliação de respostas
testbench geração de estímulos UUT referencial avaliação de respostas Geração de estímulos • Origem dos estímulos: • formas de onda • de arquivos • de tabelas • aleatória • mista
Estímulos Tipo Forma de Onda process begin s <= ‘0’ ; wait for 20 ns; s <= ‘1’ ; wait for 10 ns; s <= ‘0’ ; wait for 10 ns; s <= ‘1’ ; wait for 20 ns; s <= ‘0’ ; wait for 50 ns; s <= ‘1’ ; wait for 10 ns; s <= ‘0’ ; wait for 20 ns; s <= ‘1’ ; wait for 10 ns; s <= ‘0’ ; wait for 20 ns; s <= ‘1’ ; wait for 40 ns; s <= ‘0’ ; wait for 20 ns; end process; viável somente nas primeiras versões de TB
Estímulos de Arquivos procedure ReadFile() is variable lineAux : line; file PatternFile : TEXT open READ_MODE is “inputPattern.txt"; begin for i in 0 to nPolig-1 loop readline(PatternFile , lineAux); read(lineAux,value); ... endloop; endprocedure; Vantagem: simples implementação para padrões simples • Desvantagem: • difícil de implementar para padrões complexos • aumenta tempo de simulação devido as chamadas de sistema
Estímulos de Tabela type vector is record LD : std_logic; LL : std_logic; RST : std_logic; D : std_logic_vector(7 downto 0); P : std_logic; endrecord; type vectorArrayType is array (0 to TABLE_SIZE) ofvector; constant vectorTable : vectorArrayType := ( -- LD LL RST D P ( ‘0’, ‘0’, ‘0’, “xxxxxxxx” ‘0’), ( ‘0’, ‘0’, ‘1’, “xxxxxxxx” ‘0’), ( ‘0’, ‘0’, ‘1’, “xxxxxxxx” ‘0’), ( ‘1’, ‘0’, ‘0’, “00000101” ‘0’), ( ‘0’, ‘1’, ‘0’, “11010100” ‘0’), ( ‘0’, ‘0’, ‘0’, “xxxxxxxx” ‘1’), ( ‘0’, ‘0’, ‘0’, “xxxxxxxx” ‘1’), ... ); Vantagem: menor tempo de simulação que estímulo de arquivo • Desvantagem: • aumenta tempo de compilação • consome memória para muitos padrões
Comparação entre Estímulos de Arquivo e de Tabela Fonte: Modeltech Applications Note 116: VHDL Style Guidelines for Performance
Estímulos de Dados Pseudo-Aleatórios LFSR padrão FF 3 FF 2 FF 1 FF 0 clk UUT
Tipos de LFSRs Standard LFSR 1 x x2 x4 x3 Modular LFSR x4 x x2 1 x3 Polinômio primitivo: P(x) = 1 + x3 + x4 Provê os 2n-1 padrões
Descrição Comportamental de LFSR Modular procedure lfsr(constant polynomial : in std_logic_vector; variable value: inout std_logic_vector) is variable i : std_logic_vector(sig'range) := value; begin i := i(i'left-1 downto 0)&i(i'left); if value(i'left) = '1' then i := i xor polynomial; end if; value := i; end procedure; value: “0111” i: “1110” polynomial: “1100” value: “0010”
Geração de Mista de Estímulos • Geração pseudo-aletaória pode demorar muito para gerar um padrão específico • geralmente que estimula algum corner case • pode aumentar muito o tempo de simulação • Nestes casos é desejável utilizar uma geração de estímulo mista • estímulos de tabela + estímulos aleatórios
Avaliação e Comparação de Respostas • Tipos: • sem comparação (inspeção visual) • usando assert • com compactação de dados • de arquivo • de tabela testbench geração de estímulos UUT referencial avaliação de respostas
Comparação de Respostas com Assert • para a simulação se condição for verdadeira • Exemplo: Assert (golden_out /= data_out) report “error in sumulation!!!” • Aplicado somente há sistemas pequeno • validação de operação aritméticas (sqrt)
Comparação com Compactação de Dados • Usa técnica similar ao CRC para diminuir o número de comparações e diminuir o volume da dados de referência • Utilizar uma variação de LFSR (MISR) para gerar uma assinatura das respostas