Guia Prático: Sincronização e Comunicação em SystemVerilog

Neste tutorial, exploraremos como processos podem cooperar e comunicar-se de maneira concorrente em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., utilizando recursos de sincronização e troca de dados. O objetivo é entender as diversas opções existentes para garantir que múltiplos processos trabalhem corretamente, evitando condições de corrida, garantindo acesso ordenado a recursos compartilhados e trocando informações de forma segura.

Visão Geral da Concorrência em SystemVerilog🔗

Em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., diversos blocos de código (_always_, _initial_ ou threads) podem ser executados em paralelo. Essa característica é fundamental em sistemas de hardware, pois muitos eventos ocorrem simultaneamente. Apesar de ser algo natural em descrição de hardware, é preciso ter cuidado ao compartilhar recursos ou coordenar a execução de ações simultâneas. Para isso, são utilizados mecanismos de sincronização e comunicação.

A sincronizaçãoEventos e Semáforos: Controle de Fluxo ConcorrenteEventos e Semáforos: Controle de Fluxo ConcorrenteDescubra como eventos e semáforos facilitam a sincronização e o controle de recursos em SystemVerilog, otimizando fluxos concorrentes. certifica que determinados pontos do código sejam coordenados, enquanto a comunicação permite que dados e sinais transitem entres processos de forma organizada.

Mecanismos de Sincronização🔗

Events

O recurso de _events_ em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. permite que um processo aguarde a ocorrência de um evento específico, disparado por outro processo. Dessa forma, dois ou mais processos podem se sincronizar respeitando uma ordem de execução ou um ponto de encontro comum.

  • Declaração de um event

Um evento é declarado como qualquer variável, mas usando a palavraIntrodução à Eletrônica Digital: Conceitos básicos: bits, bytes, palavras, sinais de clock e sua importânciaIntrodução à Eletrônica Digital: Conceitos básicos: bits, bytes, palavras, sinais de clock e sua importânciaDomine fundamentos da eletrônica digital: bits, bytes, palavras e clock que impulsionam o desempenho e eficiência de sistemas modernos.-chave event:

event my_event;

Para disparar (ou "acionar") o eventoEventos e Semáforos: Controle de Fluxo ConcorrenteEventos e Semáforos: Controle de Fluxo ConcorrenteDescubra como eventos e semáforos facilitam a sincronização e o controle de recursos em SystemVerilog, otimizando fluxos concorrentes., utiliza-se o operador ->:

l>
  • > my_event;
  • Para fazer um processo aguardar o disparo de um evento, usamos a sensibilidadeTiming e Sensitivity: Disparando Ações em Eventos EspecíficosTiming e Sensitivity: Disparando Ações em Eventos EspecíficosDomine o timing e sensibilidade em SystemVerilog com nosso tutorial completo. Aprenda a sincronizar eventos e controlar processos com precisão e boas práticas. ao evento ou o @:

    @my_event; // bloqueia até esse evento ser acionado

    Exemplo Simplificado com Events:

    module event_example;
      event data_ready;
      initial begin
        // Processo 1: gera um dado e dispara o evento
        #10; // simula tempo de processamento
    
    • > data_ready;
    $display("Processo 1: Evento data_ready disparado em %0t", $time); end initial begin // Processo 2: aguarda o evento @data_ready; $display("Processo 2: Detectou data_ready em %0t", $time); end endmodule

    Neste exemplo, um processo dispara o eventoEventos e Semáforos: Controle de Fluxo ConcorrenteEventos e Semáforos: Controle de Fluxo ConcorrenteDescubra como eventos e semáforos facilitam a sincronização e o controle de recursos em SystemVerilog, otimizando fluxos concorrentes. data_ready e outro processo fica bloqueado até que esse disparo ocorra.

    Semáforos

    SemáforosMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada. são recursos de alto nível para garantir acesso controlado a recursos compartilhados. Eles funcionam como “contadoresRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasAprenda as diferenças entre contadores assíncronos e síncronos, e descubra como utilizar sequências personalizadas para otimizar sistemas digitais.” que definem quantos processos podem acessar um recurso simultaneamente. Podem ser usados tanto na simulaçãoSimulação e Depuração: Ferramentas e Dicas PráticasSimulação e Depuração: Ferramentas e Dicas PráticasAprenda técnicas de simulação e depuração em SystemVerilog, utilizando ferramentas, waveforms, asserts e logs para garantir designs confiáveis. quanto em testes de verificaçãoIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., cuidando para que não haja conflitos de acesso.

    Usa-se o construtor new passando a contagemRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasAprenda as diferenças entre contadores assíncronos e síncronos, e descubra como utilizar sequências personalizadas para otimizar sistemas digitais. inicial:

    semaphore sem = new(1); // 1 = recurso exclusivo

    Um processo tenta adquirir (sem.get()) o semáforo. Se o semáforoMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada. não estiver disponível, o processo fica bloqueado até que seja liberado.

    sem.get();
    // ... região crítica ...

    Após terminar a operação na _região crítica_, o processo devolve (sem.put()) o semáforoMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada. para permitir que outros processos tenham acesso.

    sem.put();

    Exemplo de SincronizaçãoEventos e Semáforos: Controle de Fluxo ConcorrenteEventos e Semáforos: Controle de Fluxo ConcorrenteDescubra como eventos e semáforos facilitam a sincronização e o controle de recursos em SystemVerilog, otimizando fluxos concorrentes. com Semáforo:

    module semaphore_example;
      // Semáforo com apenas 1 'token' -> acesso exclusivo
      semaphore sem = new(1);
      initial begin : task_consumer_1
        $display("Consumer1: Tentando acessar recurso em %0t", $time);
        sem.get(); // Aguarda até obter acesso
        $display("Consumer1: Entrou na região crítica em %0t", $time);
        #10;       // Simula uso do recurso
        sem.put();
        $display("Consumer1: Liberou o recurso em %0t", $time);
      end
      initial begin : task_consumer_2
        $display("Consumer2: Tentando acessar recurso em %0t", $time);
        sem.get(); // Aguarda até obter acesso
        $display("Consumer2: Entrou na região crítica em %0t", $time);
        #5;        // Simula uso do recurso
        sem.put();
        $display("Consumer2: Liberou o recurso em %0t", $time);
      end
    endmodule

    Nesse exemplo, os dois _consumers_ competem por um recurso exclusivo. Por meio do semáforoMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada., apenas um _consumer_ por vez consegue acessar o recurso.

    Mecanismos de Comunicação🔗

    Mailboxes

    As Mailboxes são estruturasEstruturas e Uniões: Organizando Dados ComplexosEstruturas e Uniões: Organizando Dados ComplexosAprenda como aplicar estruturas e uniões em SystemVerilog. Descubra a diferença entre packed e unpacked com exemplos práticos e dicas para um design otimizado. similares a filas de mensagens que permitem a troca de dados entre processos. Um processo pode enviar uma mensagem (put) e outro processo recebe essa mensagem (get). A Mailbox pode ser de tamanho fixo ou ilimitado (_infinite_).

    • Criação de uma mailbox
    mailbox mbox = new();
    // ou mailbox mbox = new(<tamanho>);
    • Enviando dados (put)

    Um processo chama mbox.put(dado), onde dado pode ser qualquer tipo (int, structEstruturas e Uniões: Organizando Dados ComplexosEstruturas e Uniões: Organizando Dados ComplexosAprenda como aplicar estruturas e uniões em SystemVerilog. Descubra a diferença entre packed e unpacked com exemplos práticos e dicas para um design otimizado., etc.).

    • Recebendo dados (get)

    Outro processo chama mbox.get(dado). Se não houver dado disponível, ele bloqueia.

    Exemplo de Comunicação com Mailbox:

    module mailbox_example;
      mailbox mbox = new();
      // Processo produtor
      initial begin
        int data_to_send = 100;
        $display("Produtor: Enviando dado = %0d em %0t", data_to_send, $time);
        mbox.put(data_to_send);
        #10;
        data_to_send = 200;
        $display("Produtor: Enviando dado = %0d em %0t", data_to_send, $time);
        mbox.put(data_to_send);
      end
      // Processo consumidor
      initial begin
        int received_data;
        mbox.get(received_data);
        $display("Consumidor: Recebeu dado = %0d em %0t", received_data, $time);
        mbox.get(received_data);
        $display("Consumidor: Recebeu dado = %0d em %0t", received_data, $time);
      end
    endmodule

    Neste exemplo, um processo envia dados para a Mailbox e o outro recebe os valores. Caso o consumidor tente fazer mbox.get() sem que haja dados disponíveis, ele aguardará até que o produtor envie alguma informação.

    Boas Práticas de Uso🔗

    O uso de events, semáforosMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada. e mailboxes costuma ser combinado para resolver diversas situações de sincronizaçãoEventos e Semáforos: Controle de Fluxo ConcorrenteEventos e Semáforos: Controle de Fluxo ConcorrenteDescubra como eventos e semáforos facilitam a sincronização e o controle de recursos em SystemVerilog, otimizando fluxos concorrentes. e comunicação em projetos de hardware e verificação:

    1. Planeje as Regiões Críticas: Identifique trechos de código em que mais de um processo pode alterar recursos ao mesmo tempo. Use semáforosMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada. quando houver necessidade de exclusividade ou de acesso controlado.

    2. Evite Esperas Infinita: Sempre verifique se há timeouts ou estratégias de fallback para evitar deadlocks.

    3. Mantenha a Organização: Nomeie eventos, semáforosMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada. e mailboxes de forma clara, descrevendo a função de cada um para facilitar a leitura do código.

    4. Combine Mecanismos: Pode ser útil disparar um event após completar uma etapa de escrita numa mailbox, por exemplo.

    Exemplo Consolidado🔗

    No trecho de código a seguir, combinamos event e mailbox. Um processo aguarda um sinal para começar a produzir dados e, assim que finaliza, dispara um eventoEventos e Semáforos: Controle de Fluxo ConcorrenteEventos e Semáforos: Controle de Fluxo ConcorrenteDescubra como eventos e semáforos facilitam a sincronização e o controle de recursos em SystemVerilog, otimizando fluxos concorrentes. para sinalizar outro processo de que os dados já estão na Mailbox.

    module combined_example;
      event start_production, production_done;
      mailbox data_mbox = new();
      // Processo que produz dados somente depois de receber um evento
      initial begin : producer
        @start_production;
        $display("Producer: Iniciando produção de dados em %0t", $time);
        // Enviando múltiplos valores
        for (int i = 0; i < 3; i++) begin
          data_mbox.put(i);
          $display("Producer: Enviou valor = %0d em %0t", i, $time);
          #5;
        end
        // Dispara evento de conclusão
    
    • > production_done;
    end // Processo que dispara a produção e depois aguarda o resultado initial begin : controller #10; $display("Controller: Disparando start_production em %0t", $time);
    • > start_production;
    // Espera a finalização da produção @production_done; $display("Controller: Recebeu sinal de production_done em %0t", $time); end // Processo que consome valores da Mailbox a qualquer momento initial begin : consumer int value; forever begin data_mbox.get(value); $display("Consumer: Recebeu valor = %0d em %0t", value, $time); end end endmodule

    1. O controller dispara o eventoEventos e Semáforos: Controle de Fluxo ConcorrenteEventos e Semáforos: Controle de Fluxo ConcorrenteDescubra como eventos e semáforos facilitam a sincronização e o controle de recursos em SystemVerilog, otimizando fluxos concorrentes. start_production para iniciar a produção.

    2. O producer aguarda esse sinal, produz dados e envia cada valor para a Mailbox. Ao terminar, dispara production_done.

    3. O controller também aguarda production_done para saber quando a produção finalizou.

    4. O consumer permanece em loop infinito, retirando e registrando valores que chegam na Mailbox.

    Conclusão🔗

    A sincronização e comunicação entre processos em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. são essenciais para lidar com a concorrência e compartilhamento de recursos. Mecanismos como events, semáforosMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaMáquinas de Estado Finito (FSMs): Projeto prático: semáforo ou máquina de venda automáticaAprenda a criar uma Máquina de Estado Finito aplicada a um semáforo. Tutorial prático com diagramas, tabelas e lógica de transição detalhada. e mailboxes fornecem diversas formas de controlar o fluxo de execução, dividir tarefas de forma coerente e transferir dados sem risco de corrupção ou perda.

    Com esses elementos, projetos em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. ganham robustez e clareza, garantindo um fluxo concorrente bem definido e seguro para desenvolvimento de hardware e verificaçãoIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital..

    Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

    Referências🔗

    Compartilhar artigo

    Artigos Relacionados