Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Dominando Blocos de Instruções Verilog: Execução Sequencial e Paralela

Existem maneiras de agrupar um conjunto de instruções que são sintaticamente equivalentes a uma única instrução e são conhecidas como blocos de instruções. Existem dois tipos de blocos de instruções: sequencial e paralelo.

Sequencial

Instruções são envolvidas usando palavras-chave begin e end e serão executadas sequencialmente na ordem dada, uma após a outra. Valores de atraso são tratados relativos ao tempo de execução da instrução anterior. Após todas as instruções dentro do bloco serem executadas, o controle pode ser passado para outro lugar.


module design0;
    bit [31:0] data;

    // Bloco "initial" começa no tempo 0
    initial begin
        // Após 10 unidades de tempo, data torna-se 0xfe
        #10 data = 8'hfe;
        $display ("[Time=%0t] data=0x%0h", $time, data);

        // Após 20 unidades de tempo, data torna-se 0x11
        #20 data = 8'h11;
        $display ("[Time=%0t] data=0x%0h", $time, data);
    end
endmodule

No exemplo acima, a primeira instrução no bloco begin-end será executada em 10 unidades de tempo, e a segunda instrução em 30 unidades de tempo por causa da natureza relativa. São 20 unidades de tempo após execução da instrução anterior.

Log de Simulação

ncsim> run
[Time=10] data=0xfe
[Time=30] data=0x11
ncsim: *W,RNQUIE: Simulation is complete.

Paralelo

Um bloco paralelo pode executar instruções concorrentemente e controle de atraso pode ser usado para fornecer ordenação temporal das atribuições. Instruções são lançadas em paralelo envolvendo-as dentro das palavras-chave fork e join.


initial begin
    #10 data = 8'hfe;
    fork
        #20 data = 8'h11;
        #10 data = 8'h00;
    join
end

No exemplo acima, o bloco fork-join será lançado após executar a instrução em 10 unidades de tempo. Instruções dentro deste bloco serão executadas em paralelo e a primeira instrução que será lançada será aquela onde data é atribuído um valor de 8'h00 já que o atraso para isso é 10 unidades de tempo após o lançamento do fork-join. Após 10 unidades de tempo mais, a primeira instrução será lançada e data obterá o valor 8'h11.


initial begin
    #10 data = 8'hfe;
    fork
        #10 data = 8'h11;
        begin
            #20 data = 8'h00;
            #30 data = 8'haa;
        end
    join
end

Há um bloco begin-end no exemplo acima, e todas as instruções dentro do bloco begin-end serão executadas sequencialmente, mas o bloco em si será lançado em paralelo junto com as outras instruções. Então, data obterá 8'h11 em 20 unidades de tempo, 8'h00 em 30 unidades de tempo e 8'haa em 60 unidades de tempo.

Nomeação de blocos

Blocos sequenciais e paralelos podem ser nomeados adicionando : nome_do_bloco após as palavras-chave begin e fork. Ao fazer isso, o bloco pode ser referenciado em uma instrução disable.


begin : nome_seq
    [instruções]
end

fork : nome_fork
    [instruções]
join

Verilog

  1. Acelerando Geração de Insights via Preparação Automatizada de Dados
  2. Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
  3. Dominando Concatenação Verilog: Guia Prático
  4. Verilog Essencial: Visão Geral Concisa
  5. Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
  6. Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
  7. Dominando Fluxo de Controle em Verilog: IF-ELSE, Case, Loops e Mais
  8. Dominando Funções em Verilog para Design RTL Eficiente
  9. Entendendo Semântica de Escalonamento em Verilog: Timing, Eventos e Ordem de Execução
  10. Eleve seu S&OP, Dados e Sistemas de Planejamento para Sucesso Futuro