前言
对于阻塞赋值和非阻塞赋值,我在学校电工电子课上和之前的学习中有过粗浅的了解,在这之前的理解只是:组合逻辑只能用阻塞赋值,时序逻辑只能用非阻塞赋值。但经过学习,我对其有了更深的理解,并且我认为,深入了解其中的概念和用法是学习中必不可少的一步。
一、概念
- 阻塞赋值:阻塞赋值的赋值号用“=”表示。对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系。阻塞赋值的操作可以认为是只有一个步骤的操作,即计算赋值号右边的语句并更新赋值号左边的语句,此时不允许有来自任何其他 Verilog 语句的干扰,直到现行的赋值完成时刻,即把当前赋值号右边的值赋值给左边的时刻完成后,它才允许下一条的赋值语句的执行。串行块(begin-end)中的各条阻塞型过程赋值语句将以它们在顺序块后的排列次序依次执行。阻塞型过程赋值语句的执行过程是:首先计算赋值号右边的值,然后立即将计算结果赋值给左边,赋值语句结束,变量值立即发生改变。阻塞的概念是指在同一个 always 块中,其后面的赋值语句从概念上是在前一句赋值语句结束后再开始下面的赋值。
- 非阻塞赋值:非阻塞赋值的赋值号用“<=”表示。这是因为对应的电路结构往往与触发沿有关系,只有在触发沿的时刻才能进行非阻塞赋值。非阻塞操作开始时计算非阻塞赋值符的赋值号右边的语句,赋值操作结束时刻才更新赋值号左边的语句,可以认为是两个步骤(赋值开始时刻和结束时刻)来完成非阻塞赋值。在计算非阻塞语句赋值号右边的语句和更新赋值号左边的语句期间,其他的 Verilog 语句包括其他的 Verilog 非阻塞赋值语句都能同时计算赋值号右边的语句和更新赋值号左边的语句,允许其他的 Verilog 语句同时进行操作。非阻塞赋值的操作可以看作为两个步骤的过程:在赋值开始时刻,计算赋值号右边的语句。在赋值结束时刻,更新赋值号左边的语句。注意:非阻塞操作只能用于对寄存器类型变量进行赋值,因此只能用于“initial”和“always”块中,不允许用于连续赋值“assign”。
二、区别分析
对于概念可能初次接触会觉得云里雾里不知所云,上面(一、概念)部份可以不理解,但是加粗部分应该通透。下面进行实例分析,便可以更好的理解了。
1.简单变量解释
①阻塞赋值:
a=1;
b=2;
c=3;
begin
a=b;
c=a;
end
结果为:
a=2;b=2;c=2;
可以理解为是顺序执行。
②非阻塞赋值:
a=1;
b=2;
c=3;
begin
a<=b;

本文详细解析了Verilog HDL中阻塞赋值与非阻塞赋值的概念及区别,通过实例对比了两种赋值方式在时序逻辑中的行为差异,并提供了官方推荐的使用标准。

6857

被折叠的 条评论
为什么被折叠?



