Declarações Verilog Block
Existem maneiras de agrupar um conjunto de instruções que são sintaticamente equivalentes a uma única instrução e são conhecidas como instruções de bloco . Existem dois tipos de instruções de bloco:sequenciais e paralelas.
Sequencial
As instruções são encapsuladas usando
begin
e end
palavras-chave e serão executados sequencialmente na ordem dada, um após o outro. Os valores de atraso são tratados em relação ao tempo de execução da instrução anterior. Depois que todas as instruções dentro do bloco forem executadas, o controle pode ser passado para outro lugar.
module design0;
bit [31:0] data;
// "initial" block starts at time 0
initial begin
// After 10 time units, data becomes 0xfe
#10 data = 8'hfe;
$display ("[Time=%0t] data=0x%0h", $time, data);
// After 20 time units, data becomes 0x11
#20 data = 8'h11;
$display ("[Time=%0t] data=0x%0h", $time, data);
end
endmodule
No exemplo acima, primeira instrução no
begin-end
bloco será executado em 10 unidades de tempo e a segunda instrução em 30 unidades de tempo devido à natureza relativa. São 20 unidades de tempo após a execução da instrução anterior. Registro de simulação
ncsim> run [Time=10] data=0xfe [Time=30] data=0x11 ncsim: *W,RNQUIE: Simulation is complete.
Paralelo
Um paralelo bloco pode executar instruções concorrentemente e controle de atraso pode ser usado para fornecer ordenação de tempo das atribuições. As instruções são iniciadas em paralelo, envolvendo-as no
fork
e join
palavras-chave.
initial begin
#10 data = 8'hfe;
fork
#20 data = 8'h11;
#10 data = 8'h00;
join
end
No exemplo acima,
fork-join
bloco será lançado após a execução da instrução em 10 unidades de tempo. As instruções dentro deste bloco serão executadas em paralelo e a primeira instrução que será lançada será aquela em que for atribuído um valor de 8'h00 aos dados, pois o atraso para isso é de 10 unidades de tempo após o lançamento do fork-join. Após mais 10 unidades de tempo, a primeira instrução será lançada e os dados terão 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
begin-end
bloco no exemplo acima, e todas as instruções dentro do bloco begin-end serão executadas sequencialmente, mas o próprio bloco será lançado em paralelo junto com as outras instruções. Assim, os dados terão 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
: name_of_block
após as palavras-chave begin
e fork
. Ao fazer isso, o bloco pode ser referenciado em um disable
declaração.
begin : name_seq
[statements]
end
fork : name_fork
[statements]
join
Verilog
- Como a automação da preparação de dados acelera o tempo para insights?
- Tutorial Verilog
- Concatenação Verilog
- Verilog - Em uma casca de noz
- Atribuições Verilog
- Verilog Blocking &Non-Blocking
- Blocos de controle Verilog
- Funções Verilog
- Semântica de agendamento Verilog
- É hora de avançar seu S&OP, dados e sistemas de planejamento