[Verilog Basics] A diferença entre atribuição de bloqueio e atribuição sem bloqueio

contente

 

atribuição de bloqueio

atribuição sem bloqueio

Simulação real de engenharia

Simulação de atribuição de bloqueio

Escrever código Verilog

Escreva o código do arquivo de teste

Visão abrangente do diagrama RTL

Faça a simulação real

Simulação de atribuição sem bloqueio

Escrever código Verilog

Escreva o código do arquivo de teste

Visão abrangente do diagrama RTL

Diagrama de simulação real

Resumir


 

atribuição de bloqueio

O número de atribuição de atribuição de bloqueio é representado por "=", e a estrutura de circuito correspondente geralmente não tem nada a ver com o disparo de Yan Ni, mas está relacionada apenas à mudança do nível de entrada. Sua operação pode ser considerada como uma operação de uma etapa, ou seja, calcular a instrução do lado direito do número de atribuição e atualizar a instrução do lado esquerdo do número de atribuição. Neste momento, nenhuma interferência de qualquer outra instrução Verilog é permitido e o próximo não é permitido até que a atribuição atual seja concluída.

Um bloco serial também é chamado de begin end e as instruções de atribuição de bloqueio são executadas na ordem em que são listadas no bloco sequencial.

atribuição sem bloqueio

O número de atribuição de atribuição sem bloqueio é representado por "<=", a estrutura de circuito correspondente geralmente está relacionada à borda de disparo e a atribuição sem bloqueio pode ser realizada apenas no momento da borda de disparo.

Sua operação pode ser vista como um processo de duas etapas: ao final da atribuição, a instrução à esquerda do número da atribuição é atualizada.

Outras instruções Verilog podem operar simultaneamente enquanto a instrução à direita do número de atribuição da instrução sem bloqueio atualiza a instrução à esquerda do número de atribuição.

Os slots esquerdos não bloqueantes só podem ser usados ​​para atribuição a variáveis ​​de tipo de registro (reg), portanto, eles só podem ser usados ​​em blocos "inicial" e "sempre" e não são permitidos para atribuição contínua "atribuir".

Simulação real de engenharia

Simulação de atribuição de bloqueio

Escrever código Verilog

A primeira é a simulação de atribuição de bloqueio (blocking), utilizando "=" para atribuição, indicando a atribuição de bloqueio.

module	blocking
(			
	input	wire			clk,
	input	wire			rst_n,
	input	wire	[1:0]	in,
	output	reg		[1:0]	out

);

reg		[1:0]	in_reg;

always @(posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		in_reg = 2'b0;
		out    = 2'b0;
	end
	else begin
		in_reg = in;
		out    = in_reg;
	end
end
endmodule

Escreva o código do arquivo de teste

`timescale 1ns / 1ns

module tb_blocking();
	
	reg				clk;
	reg				rst_n;
	reg		[1:0]	in;

	wire	[1:0]	out;

	initial	begin
		clk = 1'b1;
		rst_n <= 1'b0;
		in <= 2'b0;
		#20
		rst_n <= 1'b1;
	end
	always #10 clk = ~clk;
	always #10 in <= {$random} % 4;


blocking tb_blocking(
	.clk(clk),
	.rst_n(rst_n),
	.in(in),
	.out(out)
	);
endmodule

Visão abrangente do diagrama RTL

Pode-se ver que há apenas um registrador, então o diagrama de simulação real deve mostrar que os sinais in_reg e out devem mudar ao mesmo tempo, e ambos os sinais são atrasados ​​por uma batida do sinal in.

marca d'água,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

Faça a simulação real

como esperado

marca d'água,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

Simulação de atribuição sem bloqueio

Escrever código Verilog

Da seguinte forma: Basta alterar o código de atribuição de bloqueio de "=" para "

module	blocking
(			
	input	wire			clk,
	input	wire			rst_n,
	input	wire	[1:0]	in,
	output	reg		[1:0]	out

);

reg		[1:0]	in_reg;

always @(posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		in_reg <= 2'b0;
		out	   <= 2'b0;
	end
	else begin
		in_reg <= in;
		out    <= in_reg;
	end
end
endmodule

Escreva o código do arquivo de teste

Igual ao arquivo de teste para tarefas de bloqueio

`timescale 1ns / 1ns

module tb_blocking();
	
	reg				clk;
	reg				rst_n;
	reg		[1:0]	in;

	wire	[1:0]	out;

	initial	begin
		clk = 1'b1;
		rst_n <= 1'b0;
		in <= 2'b0;
		#20
		rst_n <= 1'b1;
	end
	always #10 clk = ~clk;
	always #10 in <= {$random} % 4;


blocking tb_blocking(
	.clk(clk),
	.rst_n(rst_n),
	.in(in),
	.out(out)
	);
endmodule

Visão abrangente do diagrama RTL

Pode-se ver que existem dois registradores, um registrador é atribuído do sinal in para o sinal in_reg, e também há um registrador que é atribuído do sinal in_reg para o sinal out, então o diagrama de simulação real deve mostrar que o O sinal in_reg é atrasado em relação ao sinal de entrada. O tempo é de uma batida, e o sinal de saída é atrasado em uma batida em relação ao sinal de entrada, ou seja, duas batidas em relação ao sinal de entrada.

marca d'água,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

Diagrama de simulação real

Consistente com o que foi assumido após observar o gráfico RTL.

marca d'água,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 

Resumir

A atribuição de bloqueio e a atribuição sem bloqueio não podem ser usadas indiscriminadamente no uso real, caso contrário, podem ocorrer consequências imprevisíveis. De acordo com as recomendações oficiais, ao escrever circuitos lógicos combinatórios, use atribuição de bloqueio; ao escrever lógica sequencial, use atribuições não bloqueantes. Atribuição de bloqueio .

 

Acho que você gosta

Origin blog.csdn.net/m0_61298445/article/details/123622639
Recomendado
Clasificación