TUTORIAL PARA SIMULAÇÃO Fernando Moraes Atualizado em 29/outubro/2012 O presente laboratório tem por objetivos: 1. Ilustrar o comportamento dos somadores vistos nas aulas teóricas 2. Introduzir as ferramentas da CADENCE para simulação e síntese. Arquivos dos somadores com ambiente de síntese lógica e simulação Baixar os arquivos de simulação dos somadores: wget http://www.inf.pucrs.br/~moraes/microel/docs/somadores.zip e extraí-lo em um diretório de trabalho. Neste arquivo compactado há quatro diretórios: ñ rtl diretório que contém a descrição em VHDL dos somadors ñ tb diretório que contém o test bench com geração randômica de estímulos ñ sim diretório que contém o ambiente de simulação para as diferentes etapas do projeto ñ synthesis diretório que contém o ambiente de síntese do projeto Passos para gerar o ambiente de trabalho para esse tutorial: ñ Conectar-se à kriti: ssh <usuário>@kriti.inf.pucrs.br -X ñ Ir para o diretório de trabalho (local onde foi descompactado o somadores.zip ñ Carregar as ferramentas necessárias: source /soft64/source_gaph module load incisive edi PRIMEIRA ETAPA DO FLUXO DE PROJETO - Simulação funcional no nclaunch ESTA É UMA ETAPA DE SIMULAÇÃO SEM ATRASOS, apenas verifica o correto funcionamento dos somadores. Ir para o ambiente de simulação rtl: cd sim Observar o script de simulação fornecido - cat file_list.f : -smartorder -work work -V93 -top testa_adders -notimingchecks -gui -access +rw../rtl/somadores.vhd../tb/random_seed_pack.vhd../tb/testadder_random.vhd onde: ñ -smartorder indica que o compilador deve reconhecer a ordem hierárquica das descrições fornecidas ñ -work define o nome da biblioteca onde serão armazenados os módulos compilados ñ -V93 habilita características do VHDL93, como evitar a declaração de componentes ñ -top topo da hierarquia do projeto ñ -notimingchecks desabilita verificações de timing ñ -gui habilita modo gráfico ñ -access +rw acesso aos sinais internos do circuito para exibição Executar o seguinte comando: irun -f file_list.f A ferramenta irun irá compilar e elaborar o projeto.
A interface do simulador é aberta. Selecionando-se o top (TESTA_ADDERS(A1)) tem-se os sinais da entidade, os quais podem ser enviados para uma waveform, clicando no local indicado. Selecione os sinais internos, da entidade soma, com abaixo, trocando a base dos sinais de soma ( s_xxx ) para decimal (no menu format à radix/mnemonic à decimal). Para recuperar posteriormente as formas de onda, salvar em File à Save Command Script escolhendo um nome para o arquivo, como wave1.tlc. Notar que na janela é indicado como recuperar depois as formas de onda: irun -f file_list.f - input wave1.tcl. Executar a simulação por 11 us (run 11 us). Notar as mensagens abaixo execução sem erros. ncsim> run 11 us ASSERT/NOTE (time 10 US) from process :test (architecture work.testa_adders:a1) Test completed with no errors. Ran until 11 US + 0 ncsim>
O controle do zoom é dado pelo círculo em vermelho na figura abaixo. Para zoom full clicar no símbolo =. Notar que visualizamos todos os estímulos gerados para a soma. O test bench gera inicialmente alguns estímulos fixos, e posteriormente randômicos. Fazer um zoom para os primeiros vetores de teste: Estes 7 vetores iniciais de simulação estão descritos no test bench entre as linhas 51 a 59: constant test_patterns : test_array_t := ( (a =>(others =>'0'), b =>(0=> '1',others => '0'), cin =>'0', sum=>(0=> '1',others => '0'), cout =>'0'), (a =>(others =>'0'), b =>(others => '0'), cin =>'1', sum=>(0=> '1',others => '0'), cout =>'0'), (a =>(others =>'0'), b =>(others => '0'), cin =>'0', sum=>(others => '0'), cout =>'0'), (a =>(others =>'1'), b =>(others => '0'), cin =>'0', sum=>(others => '1'), cout =>'0'), (a =>(others =>'1'), b =>(0=> '1',others => '0'), cin =>'0', sum=>(others => '0'), cout =>'1'), (a =>(others =>'1'), b =>(0=> '1',others => '0'), cin => '1',sum=>(0=> '1',others => '0'), cout =>'1'), (a =>(others =>'1'), b =>(others => '0'), cin =>'1', sum=>(others => '0'), cout =>'1') ); O quinto vetor de teste corresponde a somar todos os bits de A em 1 (4.294.697.295) com B igual a 1, e Cin igual a 0. O resultado esperado é 0 com todos os carry out em 1. Este é o pior caso para a soma, pois há a propagação do carry em todos os bits. O sétimo vetor de teste soma todos os bits de A em 1 (4.294.697.295) com B igual a 0, e Cin igual a 1. O resultado esperado é o mesmo que o anterior, com a diferença apenas no somador logarítmico, o qual não tem entrada de Cin. Logo o valor da soma será igual ao valor de A.
FAZER: Insira algum erro em algum somador e observe as mensagens de saída. Exemplo: na linha 687 do somadores.vdh (S(15) <= pg1515(0) xor pg1400(1);) trocar por S(15) <= pg1515(0) xor pg1400(0);. Executando irun -f file_list.f -input wave1.tcl por 11 us obtemos: ASSERT/ERROR (time 400 NS) from process :test (architecture work.testa_adders:a1) **************>> erro no sklansky Sum is 11111111111111110111111111111111 Result is: 11111111111111111111111111111111 Assertion at 400 NS + 0 Observar a correta operação do multiplicador, realizando zoom (CTRL + scroll) sobre os sinais obtidos. Explore a ferramenta adicionando novos sinais na waveform, reinicializando a simulação (reset no console), etc. etc. Para sair, menu File à Exit SimVision ETAPA 2 - Síntese Lógica Ir para o diretório de síntese: cd../synthesis Para a síntese lógica será utilizada a ferramenta RTL Compiler da CADENCE. No laboratório 8 iremos explorar os comandos de síntese lógica. Neste tutorial o objetivo é simulação. Execute apenas (a execução pode legar um certo tempo): rc -f comandos_rc.txt Avaliando área. Digite: rc:/> report area -depth 2 Instance Cells Cell Area Net Area --------------------------------------- somadores 560 3110 3143 skl 192 714 830 csrqt 136 749 547 csa 136 749 544 cla 32 300 897 rip 32 300 163 cbp 32 300 163 Os somadores que consumiram mais área foram os carry-save (csrqt e cla), seguido pelo logarítmico (skl). Os somadores cla/ripple/cbp tiveram o mesmo número de portas. Este resultado deve-se às portas lógicas disponíveis na biblioteca. Para sair do rc digite exit. Analise o arquivo gerado pela síntese (layout/somadores.v). É uma descrição em Verilog, com 4803 linhas. Neste arquivo temos o VHDL mapeado para as células da biblioteca.
ETAPA 3 Simulação com Atraso de Porta Lógica Utilizar o file_list do diretório synthesis. Notar que utilizamos o mesmo test bench. A modificação está na inclusão da biblioteca de células e do arquivo Verilog gerado na etapa anterior. -smartorder -work work -V93 -top testa_adders -gui -access +rw /soft64/design_kits/cmos065_534/core65gpsvt_5.1/behaviour/verilog/core65gpsvt.v layout/somadores.v../tb/random_seed_pack.vhd../tb/testadder_random.vhd Realize a simulação, verifique se não houveram erros (run 11 us) e faça um zoom em torno dos 400 ns: O somador logarítmico é o que responde mais rápido (sinais s_log e c_log). Na sequência temos os somadores carry select e carry select sqrt (c_select e c_sqrt, respectivamente). Depois temos o ripple carry e o CLA. Um resultado inesperado é o tempo do somador by-pass, que deveria ser tão rápido quando o carry select, pois apresentou um comportamento igual ao CLA e ao RIPPLE. A explicação para este comportamento inesperado deve-se ao fato de como a síntese lógica realiza o mapeamento: não há na biblioteca portas complexas que otimizam o desempenho do by-pass. FINAL DO TUTORIAL