Sincronização em SystemVerilog: Eventos e Semáforos

Imagine que você tem vários processos executando em paralelo dentro do seu projetoIntroduçã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. 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. e que, em determinado ponto, cada um deles precisa aguardar ou sinalizar que algo ocorreu. Além disso, considere que certos recursos devem ser compartilhados de forma organizada para evitar conflitos ou sobrecarga. É justamente para esses cenários que entram em cena dois elementos fundamentais: eventosSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. e 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..

Neste tutorial, vamos explorar de forma narrativa como esses mecanismos funcionam e como podem ajudar na implementação de fluxo de execução concorrente em seus projetosIntroduçã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. 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. ou design em hardware.

Motivação para Controle de Fluxo Concorrente🔗

Em sistemas digitais modernos, é comum termos várias instâncias de módulosOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. ou processos rodando ao mesmo tempo. Como controlar quem executa o quê em determinado instante? Ou como garantir que um recurso crítico não seja acessado simultaneamente por mais de um processo? Esse tipo de sincronização e coordenação de tarefas é essencial para evitar comportamentos indesejados - e, consequentemente, bugs.

O 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. oferece mecanismos poderosos para esse tipo de controle:

1. EventosSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. (events) para sincronização de processos.

2. 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. (semaphores) para gerenciamento de recursos compartilhados.

Eles funcionam como peças de um quebra-cabeça, ajudando a orquestrar a execução simultânea de diferentes partes do seu código.

Eventos em SystemVerilog🔗

O que são Eventos?

EventosSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. 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 construções que permitem a um processo sinalizar a ocorrência de algo e a outros processos esperar por esse sinal para prosseguir. Assim, você pode imaginar o eventoSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. como um tipo de “bandeira” que pode ser levantada (disparada) em um local e verificada ou aguardada em outro.

Criação e Acionamento

Para declarar um evento, basta utilizar 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 eventSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks.:

event my_event;

Para acionar (sinalizar) o eventoSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks., utiliza-se o operador ->:

  • > my_event;

Quando esse disparo ocorre, todos os processos que estiverem esperando (wait) por my_event serão imediatamente liberados (assim que o delta-cycle de 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. for processado). A sintaxe para aguardar um evento é:

wait (my_event.triggered);

Isso pode ser feito também através de wait(my_event), dependendo da sintaxe da ferramenta, mas a forma com .triggered é mais explícita e clara em muitos ambientes.

Exemplos em Ação

Suponha que você queira que um processo A execute uma lógica de preparação e libere outro processo B apenas quando terminar. O processo B, por sua vez, deve permanecer aguardando até esse sinal. Aqui está um esboço de código:

module event_example;
  event my_event;
  // Processo A: Realiza algo e dispara o evento
  initial begin
    $display("Processo A iniciando trabalho...");
    #10;
    $display("Processo A concluído, disparando evento...");
  • > my_event;
end // Processo B: Espera até o evento ser disparado initial begin $display("Processo B aguardando sinal..."); wait (my_event.triggered); $display("Processo B liberado."); end endmodule

Neste exemplo, B só prossegue após A ter sinalizado o evento. Assim, eventosSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. são uma forma simples e eficaz de sincronizar processos que precisam acontecer em sequência ou coordenadamente.

Semáforos em SystemVerilog🔗

Por que Semáforos?

Enquanto os eventosSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. servem para indicar o momento certo em que algo ocorre, os 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. cuidam do quantitativo de recursos que podem ser acessados simultaneamente. Na maioria das vezes, utilizamos 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. para gerenciar a concorrência em recursos limitados, como buffers, memória ou mesmo slots de execução.

Por exemplo, digamos que você possua um buffer que comporta até 2 acessos simultâneos. Um 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. pode ser criado com o valor inicialProcessos Always e Initial: Diferenças e AplicaçõesProcessos Always e Initial: Diferenças e AplicaçõesAprenda as diferenças e aplicações dos blocos always e initial em SystemVerilog, otimizando testes e projetos com explicações claras e práticas. igual a 2, indicando que há duas “permissões” disponíveis.

Criação e Métodos Fundamentais

A criação de um 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. é feita por meio de uma instanciação de objetoClasses e Objetos: Criando Estruturas ReutilizáveisClasses e Objetos: Criando Estruturas ReutilizáveisDescubra neste tutorial como usar classes e objetos em SystemVerilog para desenvolver testbenches modulares e eficientes, otimizando a manutenção do código.:

semaphore sem;
initial begin
  sem = new(2); // Cria um semáforo com 2 permissões.
end

O número passado ao construtor new() corresponde ao conteúdo inicialProcessos Always e Initial: Diferenças e AplicaçõesProcessos Always e Initial: Diferenças e AplicaçõesAprenda as diferenças e aplicações dos blocos always e initial em SystemVerilog, otimizando testes e projetos com explicações claras e práticas. 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., ou seja, quantos processos podem simultaneamente adquirir esse recurso.

Para pegar (ou adquirir) uma permissão 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., utiliza-se o método get():

sem.get();

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. estiver disponível (ou seja, se houver pelo menos 1 permissão livre), a chamada libera o processo imediatamente. Caso contrário, o processo bloqueia até que alguém libere (ou devolva) uma permissão.

Para devolver (ou liberar) o recurso, usa-se:

sem.put();

Exemplo Prático

Vamos supor que você tenha 3 processos que precisam acessar um dispositivo que suporta apenas 2 acessos concorrentes. Nesse caso, um dos processos terá de aguardar os outros liberarem acesso antes de prosseguir.

module semaphore_example;
  semaphore sem;
  initial begin
    sem = new(2); // Duas permissões
  end
  // Processo 1
  initial begin
    sem.get();
    $display("Processo 1 obteve permissão");
    #10;           // Simula uso do recurso por 10 unidades de tempo
    sem.put();
    $display("Processo 1 liberou permissão");
  end
  // Processo 2
  initial begin
    sem.get();
    $display("Processo 2 obteve permissão");
    #20;          // Usa o recurso por 20 unidades de tempo
    sem.put();
    $display("Processo 2 liberou permissão");
  end
  // Processo 3
  initial begin
    sem.get();
    $display("Processo 3 obteve permissão");
    #5;           // Usa o recurso por 5 unidades de tempo
    sem.put();
    $display("Processo 3 liberou permissão");
  end
endmodule

Caso os processos 1 e 2 alcancem o sem.get() antes do processo 3, esse último terá que esperar até que um dos anteriores execute sem.put(). Assim, garantimos um controle ordenado mesmo em cenários de alta concorrência.

Comparação Rápida entre Eventos e Semáforos🔗

Para ilustrar de forma simples as principais diferenças, segue uma tabela comparativa:

CaracterísticaEventosSemáforos
PropósitoSincronizar momento de ocorrênciaControlar acesso a recursos simultâneos
Criaçãoevent nome_evento;semaphore nome_sem = new(X);
Disparo-> nome_evento;Não se aplica
Esperawait(nome_evento.triggered);sem.get(); (bloqueia se indisponível)
LiberaçãoNão se aplicasem.put(); (aumenta disponibilidade)
Bloqueio condicionadoNão bloqueia por recursoBloqueia se não houver permissões suficientes

Conclusão🔗

Os mecanismos de eventosSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. e 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. 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 recursos poderosos para controlar fluxos de execução concorrentes. Enquanto os eventosSincronização e Comunicação Entre ProcessosSincronização e Comunicação Entre ProcessosDomine a sincronização e comunicação em SystemVerilog com exemplos práticos de events, semáforos e mailboxes para evitar conflitos e deadlocks. permitem o disparo de ocorrências que sincronizam processos em instantes específicos, os 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. fazem o controle do compartilhamento de recursos, garantindo que múltiplos processos não entrem em conflito ao tentar acessar algo simultaneamente.

Aprender a usar esses dois elementos de maneira coesa ajuda a criar testbenchesCriando Testbenches Estruturados: Estratégias de VerificaçãoCriando Testbenches Estruturados: Estratégias de VerificaçãoAprenda a criar testbenches estruturados em SystemVerilog com estratégias de verificação, modularização e boas práticas para designs digitais confiáveis. e designs mais robustos, modulares e fáceis de manter. Por meio deles, você poderá lidar com cenários cada vez mais complexos em que diversos processos precisam, simultaneamente, aguardar ou coordenar-se para atingir o comportamento desejado.

Em resumo:

Dominar esse uso vai tornar seu projetoIntroduçã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. mais profissional e confiável, agregando valor à sua prática como engenheiro, projetista ou entusiasta de tecnologias de hardware.

Próximos Passos: Explore exemplos mais avançados no seu testbench, combine eventos e semáforos com outros dispositivos de sincronização oferecidos pelo 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. (mantendo em mente que há diversos mecanismos para tratar de threads, fork-joinFork-Join e Threads: Executando Tarefas em ParaleloFork-Join e Threads: Executando Tarefas em ParaleloDomine o uso de fork-join e threads em SystemVerilog, executando tarefas paralelas com eficiência. Conheça variações e técnicas para simulações realistas. e outros recursos que vão além do propósito deste tutorial). Esse domínio poderá fazer toda a diferença na hora de desenhar e verificar sistemas de grande complexidade. Boa exploração!

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