5.4 Funcionamento do ACMIX
5.4.1 N´ ucleo de sincroniza¸c˜ ao
SystemC domain
A sincroniza¸c˜ao, no SystemC, ´e feita pela thread comm and sync, localizada no m´odulo Sysc component e sens´ıvel aos clocks provenientes do vetor de portas clk vector.
A cada execu¸c˜ao dessa thread, cinco tarefas s˜ao cumpridas conforme a sequˆencia des- crita:
1. Execu¸c˜ao da rotina send to vhdl() na qual o usu´ario deve registrar os sinais de entrada na fila de envio.
2. Varredura da fila de envio, transmitindo cada valor de sinal encontrado atrav´es do pipe comm fifo sysc vhdl.
3. Recebe valores dos sinais atrav´es do pipe comm fifo vhdl sysc e armazena-os no vetor de recep¸c˜ao.
5.4. Funcionamento do ACMIX 43
Figura 5.4: Callbacks gerados pelas bordas do sinal sig out1 s˜ao ignorados 4. Execu¸c˜ao da rotina receive from vhdl() a qual ´e respons´avel por atribuir os va-
lores provenientes do vetor de recep¸c˜ao aos respectivos sinais. 5. Execu¸c˜ao do comando wait(), liberando o controle da thread.
Como a thread s´o libera o controle ao final dos passos cinco passos, a simula¸c˜ao s´o pode continuar ap´os o envio e a recep¸c˜ao dos sinais, criando um ponto de sincroniza¸c˜ao a cada borda dos clocks registrados.
VHDL domain
No VHDL domain a sincroniza¸c˜ao ´e feita no VPI plugin, cuja execu¸c˜ao se d´a uma vez a cada per´ıodo de simula¸c˜ao (utilizando-se a callback VPI ReadWriteSynch), contanto que haja mudan¸ca no valor de algum sinal veja figura 5.4). Assim, para garantir a periodicidade da execu¸c˜ao da callback, o ACMIX faz uso de um gerador de est´ımulo stimuli generator, o qual faz com que a chamada do callback aconte¸ca periodicamente o que permite ao ACMIX propagar os valores de forma correta.
Note que ´e poss´ıvel que ocorram mudan¸cas nos sinais do m´odulo do usu´ario entre duas bordas do gerador de est´ımulo (em decorrˆencia de atrasos, por exemplo) o que poderia acarretar em um callback adicional, consequentemente destruindo a sincroniza¸c˜ao entre os dom´ınios. Para evitar esse tipo de problema, o VPI plugin verifica se o sinal alterado foi o stimuli generator. Em caso negativo, o callback ´e simplesmente descartado. A figura 5.4 ilustra essa situa¸c˜ao atrav´es do sinal sig out1 ligado a uma porta de sa´ıda do m´odulo VHDL, cujos callbacks s˜ao descartados.
5.4. Funcionamento do ACMIX 44
Sincroniza¸c˜ao utilizando o canal de comunica¸c˜ao
Para haver sincroniza¸c˜ao definitiva entre os dom´ınios, ´e necess´ario que o m´odulo stub espere pelo wrapper VHDL quando este ´ultimo escreve os valores dos sinais e vice-versa. A solu¸c˜ao encontrada foi atrav´es do uso do mecanismo de bloqueio do canal de comunica¸c˜ao; esse bloqueio sempre ocorre quando um dos m´odulos tenta acessar o canal para leitura, sem que haja dados no mesmo. A execu¸c˜ao da leitura continua t˜ao logo o outro m´odulo escreva no canal, o que garante checkpoints de sincroniza¸c˜ao entre cada borda do clock do m´odulo SystemC. A figura 5.5 ilustra o efeito do uso do canal de comunica¸c˜ao no fluxo de execu¸c˜ao de ambos os dom´ınios.
Note que n˜ao h´a possibilidade de ocorrer deadlocks (por exemplo, os dois dom´ınios esperam para ler dados), pois no in´ıcio da execu¸c˜ao o m´odulo Sysc component escreve valores no canal de comunica¸c˜ao, enquanto o VPI plugin lˆe valores do canal e ambos os lados tˆem acesso ao n´umero de bytes do canal e v˜ao escrever/ler exatamente esse n´umero de bytes.
Efeito colateral do ACMIX nos sinais do VHDL domain
Atrav´es da descri¸c˜ao do n´ucleo de simula¸c˜ao, ´e poss´ıvel notar que a transmiss˜ao dos sinais depende de dois principais fatores: os geradores de est´ımulo, no VHDL Domain e a thread comm and sync que ´e sens´ıvel `as bordas do sinal de clock registrado, no SystemC Domain.
A dependˆencia mencionada acarreta um atraso nas transmiss˜oes de sinais entre os dom´ınios com exce¸c˜ao do sinal de clock2; atraso esse igual a metade do per´ıodo do sinal
registrado no vetor de clocks clk vector cuja frequˆencia ´e a maior dentre todos os sinais registrados nesse vetor. A figura 5.6 demonstra o atraso, exibindo as formas de onda de ambos os dom´ınios em um uma co-simula¸c˜ao que transmite dois sinais: clk e sig1.
Note que esse atraso pode ser reduzido introduzindo-se no SystemC um sinal que sirva exclusivamente como gerador de eventos de comunica¸c˜ao, contanto que esse sinal respeite as restri¸c˜oes descritas na se¸c˜ao se¸c˜ao 5.3. Observe tamb´em que esse sinal n˜ao deve ser enviado para o VHDL domain.
Vale ressaltar que o procedimento de acrescentar um gerador de est´ımulos adicional acarreta em um aumento no n´umero de eventos e, consequentemente, em uma redu¸c˜ao na performance da simula¸c˜ao e maior uso de mem´oria. Mais informa¸c˜oes sobre o memory leak do GHDL na se¸c˜ao 7.2.1).
5.4. Funcionamento do ACMIX 45
5.4. Funcionamento do ACMIX 46
Figura 5.6: Formas de onda de uma co-simula¸c˜ao utilizando o ACMIX. Note o atraso produzido no sinal sig1.
Erros ocasionados pelo efeito colateral
O atraso mencionado n˜ao acarretou problemas nas simula¸c˜oes feitas neste trabalho. ´E poss´ıvel que ocorram erros em simula¸c˜oes que utilizem as duas bordas do clock na borda entre os dom´ınios. Nesse caso ´e poss´ıvel resolver o problema atrav´es da j´a mencionada solu¸c˜ao para reduzir o atraso: acrescentando um gerador de est´ımulos adicional com uma frequˆencia maior.