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