A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

SystemC 2.0.1 Tiago Salmito SystemC Biblioteca de classes para C++. Suporta o co-design do hardware-software e a descrição da arquitetura.

Apresentações semelhantes


Apresentação em tema: "SystemC 2.0.1 Tiago Salmito SystemC Biblioteca de classes para C++. Suporta o co-design do hardware-software e a descrição da arquitetura."— Transcrição da apresentação:

1 SystemC Tiago Salmito

2 SystemC Biblioteca de classes para C++. Suporta o co-design do hardware-software e a descrição da arquitetura de sistemas complexos que consistem de componentes de software e hardware. Serve para criar a "especificação executável" de um sistema.

3 Por que C? C++ provê a abstração de controle e de dados necessários para descrição de sistemas. A orientação a objeto e as macros do C++ nos permite estender a linguagem com classes, sem mudar a sua sintaxe.

4 Benefícios da "Especificação Executável" Evitar inconsistências, erros e garantir a completude do sistema; Assegurar uma interpretação não ambígua para a especificação do sistema. Verificar a funcionalidade do sistema antes do inicio da sua implementação. Criar modelos de performance do sistema, ou validar a performance do sistema. Os casos de testes usados na EE podem ser usados no teste da implementação do sistema. O exato comportamento do sistema pode ser validado usando-se o Waveform Tracing.

5 Definições Módulos: São entidades hierárquicas onde podem conter outros módulos ou processos. Processos: São usados para descrever as funcionalidades dos módulos. Portas: Módulos possuem portas nas quais o conecta a outros módulos. Podem ser unidirecionais ou bidirecionais. Sinais: São usados para se conectar portas (fios). Podem ser controlados por um (unresolved) ou vários (resolved) drivers. Clocks: É um sinal especial usado para a sincronização do sistema durante a simulação.

6 Metodologia de design sem SystemC

7 Metodologia de design com SystemC

8 SystemC Módulos São os blocos de construção básicos no SystemC para particionar o design. Eles encapsulam as representações dos dados internos e algoritmos de outros módulos. São declarados: – Com a Macro: SC_MODULE(nome) {... }; – Usando OO: struct nome : sc_module {... }; Um módulo pode conter diversos outros atributos como portas, sinais locais, dados locais, outros módulos, e construtores. O construtor é declarado com a macro: SC_CTOR(nome_do_modulo) {... }

9 Módulos: Portas Passam dados de (ou para) processos de um módulo. Podem ser declaradas de 3 maneiras: – Entrada - sc_in nome; – Saída - sc_out nome; – Entrada/Saída - sc_inout nome; Os tipos das portas podem ser qualquer tipo do C++, do SystemC ou tipos definidos pelo usuário. Exemplo: Flip Flop D SC_MOLDULE(dff) { sc_in din; sc_in clock; sc_out dout;... };

10 Módulos: Sinais Representam os fios que interconectam os dispositivos de mesma hierarquia na implementação física do sistema. Sinais carregam dados, e pode ser conectado a várias portas. Exemplo: Filtro

11 Módulos: Maneiras de conectar sinais – "Positional mapping" SC_CTOR(filtro) { s1 = new sample ("s1"); (*s1)(q,s); c1 = new coeff ("c1"); (*c1)(c); m1 = new mult ("m1"); (*m1)(s,c,q); } – "Named mapping" SC_CTOR(filtro) { s1 = new sample ("s1"); s1->din(q); s1->dout(s); c1 = new coeff ("c1"); c1->out(c); m1 = new mult ("m1"); m1->a(s); m1->b(c); m1->q(q); }

12 Módulos: Armazenamento interno de dados Para isso o designer precisa apenas declarar variáveis locais aos módulos. Podem ser de qualquer tipo do C++, do SystemC ou definidos pelo usuário. Exemplo: #include "systemc.h" SC_MODULE(count) { sc_in load; sc_in din; sc_in clock; sc_out dout; int count_val; //armazenamento void count_up() { if (load) { count_val = din;} else { count_val++; } dout = count_val; } SC_CTOR(count) { SC_METHOD(count_up); sensitive_pos << clock; } };

13 Módulos: Processos O verdadeiro trabalho dos módulos são feitos em processos. Processos são funções registradas no kernel do SystemC e são sensíveis a sinais. São "executados" a qualquer troca de valor do sinal na qual o processo é sensível. Exemplo: #include "systemc.h" SC_MODULE(dff) { sc_in din; sc_in clock; sc_out dout; void doit() { dout = din; } SC_CTOR(dff) { SC_METHOD(doit); sensitive_pos << clock; } };

14 Módulos: Construtor É executado sempre que houver uma instanciação a um módulo. Define a estrutura de processos no kernel do SystemC e inicializa as variáveis internas. Exemplo: SC_MODULE(ram) { sc_in addr; sc_in datain; sc_in rwb; sc_out dout; int memdata[64]; // memoria local int i; void ramread(); //processos void ramwrite(); SC_CTOR(ram){ SC_METHOD(ramread); sensitive << addr << rwb; SC_METHOD(ramwrite) sensitive << addr << datain << rwb; for (i=0; i++; i<64) { memdata[i] = 0; } };

15 Módulos: Casos de teste São feitos através de módulos que geram estímulos e módulos que checam se a saída é coerente com a pós- condição

16 Processos São a unidade básica de execução no SystemC, são chamados para simular o comportamento do dispositivo ou sistema. Existem 3 tipos de processos: – Métodos (SC_METHOD) – Threads (SC_THREAD) – Clocked Threads (SC_CTHREAD) Não são hierárquicos. Possuem uma lista de sensitividade e para estimular um processo deve-se ocorrer um evento.

17 Processos: Métodos (SC_METHOD) Executam quando ocorre um evento e retornam ao final da execução para o kernel do SystemC. SC_MODULE(mux2) { //mux de 2 portas sc_in pin1; sc_in pin2; sc_in controle; sc_out pout; void fazer() { if(controle==0) pout=pin1; else pout=pin2; } SC_CTOR(mux2) { SC_METHOD(fazer); sensitive << pin1; sensitive << pin2 << controle; pout.initialize(true);} };

18 Processos: Threads (SC_THREAD) Executam indefinidamente e podem ser suspendidas e reativadas. Podem executar o comando wait() para suspender. São o são o caso mais geral de processo e podem ser usados para praticamente tudo. Threads são implementados usando co-rotinas e a biblioteca do SystemC. Exemplo: Sinal de transito. – SC_THREAD(sinal);

19 Processos: Clocked Threads (SC_CTHREADS) São um caso especial de Threads. São usados para criar maquinas de estado implícitas. Um estado é definido entre dois comandos wait() ou wait_until(). Só pode ser sensível ao clock. Exemplo: Um controlador de barramento.

20 Diferenças entre threads e clocked threads O processo Cthread especifica um objeto do tipo clock. Cthread não possui lista de sensitividade. A instrução wait_until só pode ser chamada através de um processo Cthread. – Um uso para o wait_until: wait_until(sensor.delayed() == true);

21 Processos: Watching Watching só pode ser usado por um processo Cthread. Processos Cthread são loops infinitos. Watching é a maneira de se controlar o loop. – Exemplo: SC_CTHREAD(gen_data, clk.pos()); watching(reset.delayed() == true);

22 Portas e Sinais: Para ler sinais das portas: – Use os métodos read() ou write() das portas ou o operador de atribuição. – -Se precisar fazer conversões de tipo use os métodos read() e write();

23 Portas e Sinais: Resolved Logic Vectors São usados para sinais que possuem mais de um driver. Declarando a porta: sc_inout_rv x; Declarando o sinal: sc_signal_rv x; Exemplo:

24 Conectando sinais e portas Para conectar uma porta a um sinal eles devem ser do mesmo tipo. – Se for entre portas de mesmo nível de abstração: Deve-se usar sinais. Usa-se os métodos de positional ou named mapping – Se for entre portas de níveis diferente. Não necessita de sinal (porta a porta). Usa-se o método named mapping

25 Clocks É um objeto especial do SystemC. Para criar um sinal de clock: – sc_clock clock(nome, 20, 0.5, 0, true); Para se acessar o sinal de clock usa-se o método clock.signal();

26 Tipos de dados do SystemC sc_bit –2 value single bit type – sc_bit v=1; sc_bit f=0; sc_logic – 4 value single bit type – sc_logic l=Z; l=X; l=

27 Tipos de dados do SystemC sc_int – 1 to 64 bit signed integer type – sc_int int_de_40bits; sc_uint – 1 to 64 bit unsigned integer type – sc_uint uint_de_22bits; sc_bigint – arbitrary sized signed integer type – sc_bigint b; sc_biguint – arbitrary sized unsigned integer type

28 Tipos de dados do SystemC sc_bv – arbitrary sized 2 value vector type – sc_bv vetor_de_10_bits= ; sc_lv – arbitrary sized 4 value vector type – sc_lv vetor_de_3_bits=ZX01;

29 Tipos de dados do SystemC Tipos definidos pelo usuário: – Exemplo: struct tipo_pacote { long info; int seq; int reenvios; inline bool operator == (const tipo_pacote& rhs) const { return (rhs.info == info && rhs.seq == seq && rhs.reenvios == reenvios); } };

30 Simulação A instanciação dos módulos é feita na rotina sc_main(); Após instanciar e conectar os módulos aos sinais, é feita uma chamada a função sc_start(double); A simulação pode ser parada, através da função sc_stop(); Pode-se saber o tempo atual de simulação através da função double sc_simulation_time(); Para ajudar no debug, todos as variáveis, portas e sinais podem ter seus sinais lidos e impressos.

31 Simulação avançada O SystemC te dá a opção de controlar o controle de sinais assincronamente. – Criar seu próprio clock. – Criar sinais assíncronos para teste do sistema. É feito através das performativas sc_initialize() e sc_cycle(); Exemplo: sc_signal clock;...; sc_initialize(); for (int i = 0; i <= 200; i++) clock = 1;sc_cycle(10); clock = 0;sc_cycle(10); } Equivale à: sc_clock clk(meu clock, 20, 0.5); sc_start(200);

32 Traçando Formas de Ondas SystemC pode criar arquivos nos formatos: – VCD (Value Change Dump) – ASCII WIF (Waveform Intermediate Format) – ou ISDB (Integrated Signal Data Base) As formas de onda geradas podem ser visualizadas com qualquer software que suporte esses formatos. Podem ser traçadas: – Somente variáveis que estão no escopo durante toda a simulação. – Sinais escalares, vetores ou de tipos agregados.

33 Traçando Formas de Ondas Criando arquivos: – sc_trace_file * my_trace_file; – my_trace_file = sc_create_vcd_trace_file(my_trace); Fechando arquivos – sc_close_vcd_trace_file(my_trace_file); Traçando variáveis e sinais escalares: – sc_trace(my_trace_file, var, Variável); – O primeiro argumento e um arquivo do tipo sc_trace_file. – O segundo argumento é uma referencia a variável a ser traçada. – O terceiro é uma string de referência.

34 Traçando Formas de Ondas Exemplo: sc_signal a; float b; sc_trace(trace_file, a, MyA); sc_trace(trace_file, b, B); Traçando variáveis de tipo agregado: struct bus { unsigned end; bool read_write; unsigned dado; }; void sc_trace(sc_trace_file *tf, const bus& v, const sc_string& NAME) { sc_trace(tf, v.end, NAME +.end); sc_trace(tf, v.read_write, NAME +.rw); sc_trace(tf, v.dado, NAME +.dado); }

35 Traçando Formas de Ondas Traçando vetores: void sc_trace(sc_trace_file *tf, sc_signal *v, const sc_string& NAME, int len) { char stbuf[20]; for (int i = 0; i< len; i++) { sprintf(stbuf, [%d], i); sc_trace(tf, v[i], NAME + stbuf); }

36 Pequeno Exemplo: Módulos #include SC_MODULE(produtor) { sc_out dout; sc_in clock; int dado; void produz() { dout = dado++; } SC_CTOR(produtor) { SC_METHOD(produz); sensitive_pos << clock; dado=0; } }; SC_MODULE(consumidor) { sc_in din; void consome() { int tmp=din; printf(Dado = %d,tmp); } SC_CTOR(consumidor) { SC_METHOD(consome); sensitive << din; } };

37 Pequeno Exemplo: Juntando módulos #include modulos.h int sc_main(int argdc, char ** argc) { sc_signal barramento; sc_clock clk(clock, 20); produtor p(produtor); p.dout(barramento); p.clock(clk); consumidor c(consumidor); c << barramento; sc_trace_file * tf=sc_create_vcd_trace_file(produtor_consumidor); sc_trace(tf, barramento, Barramento"); sc_trace(tf, clk.signal(), Clock"); sc_start(-1); }

38 Estendendo o SystemC – SystemC 2.0 A descrição estrutural do SystemC é suficiente para modelar sistemas (portas e módulos). Porem a comunicação e a sincronização não é geral o suficiente para modelar em todos os níveis de sistema. O SystemC 2.0 introduz novos conceitos para preencher essa lacuna. – Canais – Interfaces – Eventos

39 Tempo relativo vs Tempo absoluto Definição do clock: – SystemC 1.0: sc_clock clk( clk, 20 ); – SystemC 2.0:sc_clock clk( clk, 20, SC_NS ); ou sc_time t1( 20, SC_NS ); sc_clock clk( clk, t1 ); SC_FS – femtoseconds SC_PS – picoseconds SC_NS – nanoseconds SC_US – microseconds SC_MS – milliseconds SC_SEC – seconds Para se setar a unidade de tempo: sc_set_default_time_unit( 1, SC_PS ); (deve ser uma potência de 10)

40 Eventos - SystemC 2.0 Processos são sensíveis a eventos – O caso do SystemC 1.0 (portas) são um caso especial. Wait() agora recebe o evento a ser esperado (lista de sensibilidade dinâmica) – wait( e1 | e2 | e3 ); – wait( 200, SC_NS ); – wait( 200, SC_NS, e1 | e2 | e3 ); – wait(); //systemc 1.0 sc_event my_event; – my_event.notify(); //notifica agora – my_event.notify( 10, SC_NS ); //notifica em 10 nanosegundos – my_event.notify( SC_ZERO_TIME ); //proximo delta-cycle

41 Interfaces – SystemC 2.0 Definem métodos a serem implementados em um canal: template class sc_read_if : virtual public sc_interface { public: virtual const T& read() const = 0; }; – Métodos de sc_interface: void register_port( sc_port_base&, const char* ) – Usado para verificação quando se conecta uma porta a essa interface. const sc_event& default_event() – Usado para a sensibilidade estática do SystemC 1.0.

42 Portas – SystemC 2.0 Possuem interfaces. – Exemplo: sc_in possui a interface sc_read_if. Exemplo de porta: template class meu_sc_in: public sc_port > { public: operator const T&() const { return (*this)->read(); } }; Uma porta deve possuir pelo menos uma interface.

43 Canais – SystemC 2.0 Um canal implementa uma ou mais interfaces: – Exemplo de canal: sc_signal é um canal que implementa as interfaces if_read e if_write. Porém o sc_signal só pode possuir uma porta de saída conectada. (essa verificação é feita no método register_port()). Exemplo: – Canal sc_fifo: Só pode ter uma porta de entrada e uma de saída (nenhuma bidirecional).

44 Canais: sc_fifo O método register_port verifica as condições de conexão dos canais. template void sc_fifo ::register_port( sc_port_base& port,const char* if_typename ) { sc_string nm( if_typename ); if( nm == typeid( inout_interface ).name() ) { error( cannot connect to a bi-directional port ); } else if( nm == typeid( in_interface ).name() ) { if( no input port registered so far ) input_port = port; else error( cannot connect to multiple inputs ); } else { // nm == typeid( out_interface ).name() if( no output port registered so far ) output_port = port; else error( cannot connect to multiple outputs ); }

45 Implementando Canais O método update() de um canal irá ser chamado na fase de atualização dos canais. – É a hora de se determinar se há algum evento a ser gerado. – Exemplo de update: sc_signal virtual void update() { if( !( m_new_val == m_cur_val ) ) { m_cur_val = m_new_val; m_value_changed_event.notify( SC_ZERO_TIME ); }

46 Pequeno Exemplo: Canais – sc_signal template class sc_signal: public sc_prim_channel, public sc_signal_inout_if { public: sc_signal() : m_output( 0 ), m_driver( 0 ) {} virtual void register_port( sc_port_base& port, const char* if_typename ) { sc_string nm( if_typename ); if( nm == typeid( sc_signal_inout_if ).name() ) { // a write or read/write port; only one can be connected if( m_output != 0 )error( more than one write port\n ); m_output = &port; } // any number of read ports can be connected: no check needed } virtual const T& read() const { return m_cur_val; } virtual const sc_event& default_event() const{ return m_value_changed_event; } virtual void write( const T& value ) { // dynamic design rule checking if( current_process() != m_driver ) { if( m_driver == 0 ) m_driver = current_process(); else error( more than one driver\n ); } m_new_val = value; if( m_new_val != m_cur_val ) request_update(); }

47 Pequeno Exemplo: Canais – sc_signal protected: virtual void update() { if( !( m_new_val == m_cur_val ) ) { m_cur_val = m_new_val; m_value_changed_event.notify(SC_ZERO_TIME ); //notifica no próximo delta-cycle } sc_port_base* m_output; // for static design rule checking sc_process_b* m_driver; // for dynamic design rule checking T m_cur_val; T m_new_val; sc_event m_value_changed_event;

48 Fim


Carregar ppt "SystemC 2.0.1 Tiago Salmito SystemC Biblioteca de classes para C++. Suporta o co-design do hardware-software e a descrição da arquitetura."

Apresentações semelhantes


Anúncios Google