780 likes | 1.03k Views
GAPH - FACIN - PUCRS. Síntese e Prototipação de Sistemas Digitais a partir de SystemC. 1º/03/2004 a 05/03/2005. Ney Laert Vilar Calazans. GAPH - PPGCC - FACIN - PUCRS. Sumário. Introdução - SystemC, Síntese, Prototipação Estudos de Caso de Módulos RTL em SystemC
E N D
GAPH - FACIN - PUCRS Síntese e Prototipação de Sistemas Digitais a partir de SystemC 1º/03/2004 a 05/03/2005 Ney Laert Vilar Calazans GAPH - PPGCC - FACIN - PUCRS
Sumário • Introdução - SystemC, Síntese, Prototipação • Estudos de Caso de Módulos RTL em SystemC • Usando o Subconjunto Sintetizável de SystemC • Diretivas de Codificação RTL para SystemC • Modelagem e Síntese Comportamental
Introdução - SystemC, Síntese, Prototipação • Projeto a nível de sistema, linguagens sistêmicas e níveis de abstração • apresentação G. Arnout, ESCUG Out/2002 • Nem tudo que se escreve em SystemC é transformável em hardware: • tudo é simulável (em tese!) • simulação pode não funcionar - timing é importante! • nem tudo é sintetizável - subconjunto sintetizável de SystemC • o que sintetiza não necessariamente funciona! • nem tudo é prototipável/implementável • questões tecnológicas + interfaces externas + padrões E/S
Introdução - SystemC, Síntese, Prototipação • Documentação (Versão 2.0.1 de SystemC) • Synopsys,Inc. Describing Synthesizable RTL in SystemC. Version 1.2, November 2002. 136p. (Manual Synopsys RTL) • OSCI. Functional Specification for SystemC 2.0. Update for SystemC 2.0.1. Version 2.0-Q. April 2002. 135p. • OSCI. SystemC Version 2.0 User Guide. Update for SystemC 2.0.1. Version 2.0-Q. 2002. 212p. • OSCI. SystemC 2.0.1 Language Reference Manual. Revision 1.0. 2003. 428p. • Manuais de ferramentas Synopsys: CoCentric SystemC Compiler, Design Compiler, CoCentric SystemC Studio, CoCentric Fixed Point Designer, etc.
Introdução - SystemC, Síntese, Prototipação • Porque sintetizar a partir de SystemC? • HDLs são estáveis e dominadas • Specs - C é quase padrão, junto com planilhas, Matlab, etc • Tradução C -> HDL - propensa a erros de interpretação • Reuso de verificação - evita re-escrita de código de verificação • Produtividade aumentada • modificar um projeto - mais rápido que recodificá-lo • verificar projeto modificado - mais rápido que verificar recodificado
Introdução - SystemC, Síntese, Prototipação • Porque prototipar? • Se simulação OK, projeto funciona em hardware? • NÃO!!!! • Caminho de simulação perfeita para funcionamento em hardware é longo • O que ainda pode estar errado? • Timing - freqüência de operação, • Código de verificação insuficiente • Condições iniciais e de contorno - reset, pinagem, clock, etc. • Prototipação dá garantia muito maior que a implementação final funcionará. Logo, prototipar sempre é a regra!
Introdução - SystemC, Síntese, Prototipação • Questionário • Quem já programou algo em SystemC? Usando que ferramentas? • Quem já simulou hardware? Usando que forma de entrada, que software, que ferramentas? • Quem já simulou algo descrito em SystemC? Usando que ferramentas? • Quem já prototipou hardware? Usando que forma de entrada, que software, que plataforma? • Quem já prototipou hardware a partir de descrições de entrada em SystemC? Usando que software, que plataforma?
Introdução - SystemC, Síntese, Prototipação • Ambiente a ser usado no curso • Linguagem de entrada - SystemC • Ferramentas de simulação - GTKwave - domínio público • porque não CoCentric SystemC Studio? • Ferramentas de Síntese - Design Compiler/CoCentric SystemC Compiler • Ambiente de prototipação: • CAD ISE da Xilinx (projeto, sínteses lógica e física e configuração) • Plataformas variadas de prototipação em FPGAs Xilinx (+ SW específico) • V2MB1000 Insight • XSV-800 da Xess • VW300 da VCC
Sumário • Introdução - SystemC, Síntese, Prototipação • Como criar Módulos RTL em SystemC • Usando o Subconjunto Sintetizável de SystemC • Diretivas de Codificação RTL para SystemC • Modelagem e Síntese Comportamental
Características Gerais de Módulos e Processos • Módulo (SC_MODULE) • Bloco básico para a construção de hardware • Eqüivale a module Verilog e par entity/architecture VHDL • Pode conter: • processos • instâncias de outros módulos • member functions (terminologia C++) chamadas por processos ou módulos internos • Processos (SC_METHOD) • trecho de código executado seqüencialmente • múltiplos processos paralelos -> concorrência
Características Gerais de Módulos e Processos Outros módulos podem estar instanciados internamente
Características Gerais de Módulos e Processos • Registro de processos • Processo - definição similar a member function C++ • registro - declaração do tipo de processo no construtor • SC_METHOD (SC_THREAD proibido em SystemC RTL) • registro diferencia processo paralelo de outras member functions • se processo precisa ser instanciado mais de uma vez, deve estar dentro de módulo, senão erro! • Disparo de execução de processos • baseado na definição da lista de sensitividade • sensitividade - ao nível/à borda (imisturável em processo!)
Características Gerais de Módulos e Processos • Leitura e escrita de valores por processos • processo pode ler escrever em • portas (sc_in, sc_out, sc_inout) • sinais internos ao módulo (signal) • variáveis internas (ao processo) • evitar não-determinismo: • não faça processos se comunicarem via variáveis • usar sinais!!! (Como obrigado em VHDL)
Sintaxe e Semântica de Módulos de Processos • Usar 1 par de arquivos por módulo (.h e .cc) • Cabeçalho de módulos • declarações de portas • declarações de sinais internos • declarações de variáveis internas • declarações de processo • declarações de member functions • construtor do módulo
Sintaxe e Semântica de Módulos de Processos • Portas de um módulo • porta é data member (nomenclatura C++) de um módulo • portas se conectam a sinais de mesmo tipo • tipo de porta deve ser sintetizável!!
Sintaxe e Semântica de Módulos de Processos • Sinais • usados para comunicação entre processos e/ou módulos • sinais não possuem direção!!
Sintaxe e Semântica de Módulos de Processos • Variáveis de módulo (data members) • devem ser usadas para uso interno ao módulo apenas!!
Sintaxe e Semântica de Módulos de Processos • Criando processos em módulos • declarados no módulo e registrados no construtor deste • processo - função com tipo void, sem argumentos
Sintaxe e Semântica de Módulos de Processos • Lista de sensitividade • sensitive() ou sensitive_pos() ou sensitive_neg() -- deprecated • lógica combinacional - incluir todos os sinais de entrada! • Lógica seqüencial síncrona - incluir só clock e sinais com prioridade sobre este, tais como set/reset assíncronos, se existem. Sensitividade ao nível
Sintaxe e Semântica de Módulos de Processos • Sensitividade à Borda • Lista de sensitividade incompleta (Errado!!)
Sintaxe e Semântica de Módulos de Processos • Limitações de listas de sensitividade • não se pode misturar sensitividade ao nível e à borda no mesmo processo • não se pode usar o tipo sc_logic para sinais de relógio ou outros sinais sensíveis à borda, usa-se somente o tipo sc_in<bool> • Member functions • possíveis de serem declaradas em módulos • se não declaradas como processo (SC_METHOD) podem retornar qualquer tipo sintetizável
Sintaxe e Semântica de Módulos de Processos • Implementação do Módulo • arquivo .cc /.cpp • Leitura e escrita de portas e sinais • métodos read() e write() para portas e sinais, = p/ variáveis
Sintaxe e Semântica de Módulos de Processos • Leitura e escrita de bits de portas e sinais • não se pode ler/escrever bits de portas ou sinais direto • para bits individuais ou faixas, usar variáveis temporárias
Sintaxe e Semântica de Módulos de Processos • Atribuições de valor a sinais e portas • a atribuição não se concretiza até que a avaliação do processo seja concluída!
Sintaxe e Semântica de Módulos de Processos • Atribuições de valor a variáveis • são imediatas!
Estudos de Caso de Implementação de Módulos • Módulos com processo SC_METHOD único • exemplo de contador combinacional de zeros (paralelo) • Módulos com múltiplos processos SC_METHOD • exemplo de contador seqüencial de zeros (serial) • Módulos RTL hierárquicos • ver exemplo do filtro FIR (ver manual Synopsys RTL)
Módulos com Processo SC_METHOD Único /****count_zeros_comb.h file***/ #include "systemc.h" SC_MODULE(count_zeros_comb) { sc_in<sc_uint<8> > in; sc_out<sc_uint<4> > out; sc_out<bool> error; bool legal(sc_uint<8> x); sc_uint<4> zeros(sc_uint<8> x); void control_proc(); SC_CTOR(count_zeros_comb) { SC_METHOD(control_proc); sensitive << in; } }; /****count_zeros_comb.cpp file****/ #include "count_zeros_comb.h" sc_uint<4> count_zeros_comb:: zeros(sc_uint<8> x) { int count = 0; for (int i=0; i <= 7; ++i) { if (x[i] == 0) ++count; } return count; } void count_zeros_comb::control_proc() { sc_uint<4> tmp_out; bool is_legal = legal(in.read()); error.write(is_legal != 1); is_legal ? tmp_out = zeros(in.read()) : tmp_out = 0; out.write(tmp_out); } bool count_zeros_comb::legal(sc_uint<8> x) { bool is_legal = 1; bool seenZero = 0; bool seenTrailing = 0; for (int i=0; i <=7; ++i) { if ((seenTrailing == 1) && (x[i] == 0)) { is_legal = 0; break; } else if ((seenZero == 1) && (x[i] == 1)) { seenTrailing = 1; } else if (x[i] == 0) { seenZero = 1; } } return is_legal; }
Módulos com Múltiplos Processos SC_METHOD • Ver código SystemC no manual Synopsys RTL
Módulos RTL Hieráquicos • Passos básicos para a criação de módulos hieráquicos: • criar ponteiros como data members no módulo de nível de hierarquia mais alto para apontar cada instância de módulo • alocar os módulos instanciados dentro do construtor do módulo de nível de hierarquia mais alto, dando a cada um nome distinto • conectar as portas dos módulos instanciados às portas e sinais do módulo de nível de hierarquia mais alto • Ver exemplos no manual Synopsys RTL • atentar para o uso sintetizável de ponteiros
Sumário • Introdução - SystemC, Síntese, Prototipação • Como criar Módulos RTL em SystemC • Usando o Subconjunto Sintetizável de SystemC • Diretivas de Codificação RTL para SystemC • Modelagem e Síntese Comportamental
Conversão para o Subconjunto Sintetizável • Lembrando, qualquer código SystemC/C/C++ pode ser simulado! • conversão p/ SystemC sintetizável - apenas no código Hw • recomenda-se o uso de #ifdef e #endif para evitar alterações. Ex: trace e print • Nesta parte - especificação dos subconjuntos sintetizáveis de SystemC e C++ • ações corretivas - geram código sintetizável a partir de código não-sintetizável • em muitos casos - nenhuma ação corretiva existe!! • óbvio - testbenches não precisam de conversão jamais!!
Conversão para o Subconjunto Sintetizável • Construções SystemC não-sintetizáveis
Conversão para o Subconjunto Sintetizável • Construções C/C++ não-sintetizáveis (1)
Conversão para o Subconjunto Sintetizável • Construções C/C++ não-sintetizáveis (2)
Conversão para o Subconjunto Sintetizável • Construções C/C++ não-sintetizáveis (3)
Conversão para o Subconjunto Sintetizável • Construções C/C++ não-sintetizáveis (4)
Modificação de Dados para Síntese • Problemas mais comuns: • tipos nativos C/C++ - largura em bits é dependente de plataforma • C/C++ não suporta operações sobre lógica de 4 valores (0,1,Z,X) • SystemC - conjunto limitado de tipos com controle de precisão/largura e operações sobre estes • Para modificar SystemC para síntese RTL • avaliar - declarações de variáveis, parâmetros formais e tipos de retorno de funções quanto à largura em bits • isto afeta diretamente o custo do hardware!
Modificação de Dados para Síntese • Tipos de dados não-sintetizáveis C/C++/SystemC • ponto flutuante - float, double • ponto fixo - sc_fixed, sc_ufixed, sc_fix, sc_ufix • tipos de acesso - ponteiros • tipos arquivo - FILE • streams de entrada e saída - stdout, cout
Modificação de Dados para Síntese • Tipos de dados recomendados • variáveis/sinais de 1 bit - bool • variáveis/sinais de até 64bits - sc_int, sc_uint • variáveis/sinais com mais de 64bits usados em operações aritméticas - sc_bigint, sc_biguint • usar sc_logic ou sc_lv para modelar sinais e barramentos tristate. Comparações com valores Z e X -> não-sintetizáveis • usar int para contadores em laços • cuidado com tipos nativos C/C++ • para restringir tamanho em bits, sc_int<n> ao invés de int
Modificação de Dados para Síntese • Tipos de dados sintetizáveis (1)
Modificação de Dados para Síntese • Tipos de dados sintetizáveis (2)
Modificação de Dados para Síntese • Operadores sobre vetores de bits
Modificação de Dados para Síntese • Operadores sobre tipos de dados de precisão simples e arbitrária
Modificação de Dados para Síntese • Tipos enumerados - suportados como em C/C++ • Usando agregados - sintetizável desde que todos os membros o sejam • Tipos C++ - cuidado com a dependência de plataforma no que diz respeito à largura em bits • Dados membros de um módulo - não usar para comunicação entre processos
Modificação de Dados para Síntese • Exemplo de uso incorreto de dados-membro • Problema relacionado a atribuição imediata/deferida
Modificação de Dados para Síntese • Exemplo de uso correto de dados-membro • Problema relacionado a atribuição imediata/deferida
Recomendações sobre Modificação para Síntese • Após cada modificação, reverifique o projeto • Procure avaliar ambos, o impacto na sintetizabilidade e o impacto na qualidade da síntese a cada passo • Refinamento para RTL é tedioso, propenso a erro e incremental • próxima Seção recomenda diretivas de codificação para reduzir o problema!
Sumário • Introdução - SystemC, Síntese, Prototipação • Como criar Módulos RTL em SystemC • Usando o Subconjunto Sintetizável de SystemC • Diretivas de Codificação RTL para SystemC • Modelagem e Síntese Comportamental
Diretivas de Codificação RTL para SystemC • Existem diretivas de codificação para três classes de componentes RTL: • inferência de registradores e latches • inferência de buffers tristate • descrição de máquinas de estados finitas (FSMs) • Aqui - estudo de diretivas de codificação para cada classe acima • ênfase em síntese em prototipação • ergo, de-ênfase em latches
Diretivas de Codificação RTL para SystemC • Lembrando - SystemC e HDLs (e.g. VHDL, Verilog) • sem construções para definir explicitamente componentes RTL (registradores, latches, portas lógicas, buffers, etc) • motivo principal - independência de tecnologia!! • ferramentas específicas de síntese - inferem componentes RTL!