Verilog中阻塞与非阻塞赋值——学习笔记1

**

阻塞赋值与非阻塞赋值的比较(RTL,时序图分析)

**

1、阻塞赋值(“=”)指在进程语句(initial 和 always)中,当前的赋值语句会阻断其后语句的正常执行,后面的语句必须等到当前的赋值语句执行完毕才能执行。

2、非阻塞赋值(“<=”)指在进程语句(initial 和 always)中,当前的赋值语句不会阻断其后语句的正常执行。

3、下列几个代码风格,可以为解决在综合后仿真中出现绝大多数的冒险竞争问题。

  1. 时序电路建模时,用非阻塞赋值;
  2. 锁存器电路建模时,用非阻塞赋值;
  3. 用 always 块建立组合逻辑模型时,用阻塞赋值;
  4. 在同一个 always 块中建立时序和组合逻辑电路时,用非阻塞赋值;
  5. 在同一个 always 块中不要既用非阻塞赋值又用阻塞赋值;
  6. 不要在一个以上的 always 块中为同一个变量赋值。

具体例子:
一、
【1】非阻塞:
code:

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		out <= 2'b0;
	else begin
		d <= a + b;
		out <= d + c;
		end
end

RTL:
Verilog中阻塞与非阻塞赋值——学习笔记1_第1张图片
值得注意的是,这里RTL有两个触发器。

RTL行为级仿真(功能仿真):
Verilog中阻塞与非阻塞赋值——学习笔记1_第2张图片
详细图:
Verilog中阻塞与非阻塞赋值——学习笔记1_第3张图片
为了更清楚分析时序问题,加入d的时序图:
Verilog中阻塞与非阻塞赋值——学习笔记1_第4张图片
tip:时序图中红圈部分。在黄线时刻上升沿前现态 d=0 c=0 则次态out=0+0=0;现态a=0 b=1 则次态d=a+b=1

门级仿真(综合后仿真):
Verilog中阻塞与非阻塞赋值——学习笔记1_第5张图片

【2】阻塞:
code:

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		out <= 2'b0;
	else begin
		d = a + b;
		out = d + c;
		end
end

RTL:
Verilog中阻塞与非阻塞赋值——学习笔记1_第6张图片
与阻塞赋值比,这里只有1个触发器,其中两个加法器直接相连。

RTL行为级仿真(功能仿真):
图6
如图6,a,b,c一旦有变化,out在clk上升沿时立即变化。

门级仿真(综合后仿真):
图7
在变化后out有时延。

【3】另一种非阻塞:
code:

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		out <= 2'b0;
	else begin
		out = a + b + c;
		end
end

RTL:
Verilog中阻塞与非阻塞赋值——学习笔记1_第7张图片
如图8可知和阻塞赋值的RTL图5一样,均只有1个触发器。

RTL行为级仿真(功能仿真):
图9
门级仿真(综合后仿真):
图10
上述是在看小梅哥的笔记后,自己做的仿真加上个人理解。
下面经过学长指点,做的另一种简洁的例子,这个例子也可以更好的理解时序概念。

二、
【1】非阻塞:
code:

//计数
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
	cnt <= 0;
else if(cnt == 4'd9)
	cnt <= 0;
else
	cnt <= cnt + 1'b1;
end
//赋值
always@(posedge clk)begin
	a <= cnt;
	b <= a;
	c <= b;
end

RTL:
Verilog中阻塞与非阻塞赋值——学习笔记1_第8张图片
RTL行为级仿真(功能仿真):
Verilog中阻塞与非阻塞赋值——学习笔记1_第9张图片
在黄线时刻前,现态:a为1 b为0 c为0;上升沿后,次态:a<=cnt=0 b<=a(现态)=1 c<=b(现态)=0,以此类推。

【2】阻塞:
code:

//计数
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
	cnt <= 0;
else if(cnt == 4'd9)
	cnt <= 0;
else
	cnt <= cnt + 1'b1;
end
//赋值
always@(posedge clk)begin
	a = cnt;
	b = a;
	c = b;
end

RTL:
Verilog中阻塞与非阻塞赋值——学习笔记1_第10张图片
RTL行为级仿真(功能仿真):
Verilog中阻塞与非阻塞赋值——学习笔记1_第11张图片

tip:在时序中,非阻塞赋值只要出现寄存器就需要考虑时序的现态次态问题,而阻塞赋值无需考虑。

你可能感兴趣的:(FPGA,Verilog)