FPGA开发在verilog中关于阻塞和非阻塞赋值的区别

一、概念

阻塞赋值 :阻塞赋值的赋值号用"="表示,对应的是串行执行。

对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系 。阻塞赋值的操作可以认为是只有一个步骤的操作,即计算赋值号右边的语句并更新赋值号左边的语句,此时不允许有来自任何其他 Verilog 语句的干扰,直到现行的赋值完成时刻,即把当前赋值号右边的值赋值给左边的时刻完成后,它才允许下一条的赋值语句的执行。串行块(begin-end)中的各条阻塞型过程赋值语句将以它们在顺序块后的排列次序依次执行。 阻塞型过程赋值语句的执行过程是:首先计算赋值号右边的值,然后立即将计算结果赋值给左边,赋值语句结束,变量值立即发生改变。阻塞的概念是指在同一个 always 块中,其后面的赋值语句从概念上是在前一句赋值语句结束后再开始下面的赋值。

非阻塞赋值 :非阻塞赋值的赋值号用"<="表示,对应的是并行执行。

这是因为对应的电路结构往往与触发沿有关系,只有在触发沿的时刻才能进行非阻塞赋值非阻塞操作开始时计算非阻塞赋值符的赋值号右边的语句,赋值操作结束时刻才更新赋值号左边的语句,可以认为是两个步骤(赋值开始时刻和结束时刻)来完成非阻塞赋值 。在计算非阻塞语句赋值号右边的语句和更新赋值号左边的语句期间,其他的 Verilog 语句包括其他的 Verilog 非阻塞赋值语句都能同时计算赋值号右边的语句和更新赋值号左边的语句,允许其他的 Verilog 语句同时进行操作。 非阻塞赋值的操作可以看作为两个步骤的过程:在赋值开始时刻,计算赋值号右边的语句。在赋值结束时刻,更新赋值号左边的语句。注意:非阻塞操作只能用于对寄存器类型变量进行赋值,因此只能用于"initial"和"always"块中,不允许用于连续赋值"assign"。

二、 两者的区别

1.硬件电路的区别
在时序逻辑中使用非阻塞赋值会生成触发器;在组合逻辑仲使用阻塞赋值会综合成一个连线。因此一般非阻塞赋值用于时序逻辑,而阻塞赋值用于组合逻辑。

2.语句执行顺序
非阻塞赋值语句是并行执行的,等到always块结束后,才完成赋值,而阻塞赋值是顺序执行的,下一条赋值语句要等到上一条赋值语句完成后才能赋值,并且阻塞赋值是立即完成的。

3.混用容易产生的错误
在组合逻辑中,使用非阻塞赋值,则和使用阻塞赋值没什么区别;但是在时序逻辑中,使用阻塞赋值进行赋值,除了第一个语句综合为触发器外,后续的语句均综合为一个连线,如下。

4、赋值顺序

阻塞赋值:前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。

cs 复制代码
always @(posedge iclk)

begin

         b = a;

         c = b;

end

非阻塞赋值:always块内,2条语句同时执行。即:前面语句的执行(b=a)不会阻塞后面语句的执行(c=b)。

cs 复制代码
always @(posedge iclk)

begin

         b <= a;

         c <= b;

end
相关推荐
LCMICRO-133108477467 小时前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
fei_sun9 小时前
面经、笔试(持续更新中)
fpga开发·面试
magic334165639 小时前
ESP32S3开发环境介绍和创建工程
vscode·c·头文件
xixixi777779 小时前
通信领域的“中国速度”:从5G-A到6G,从地面到星空
人工智能·5g·安全·ai·fpga开发·多模态
萌萌站起10 小时前
Vscode 中 python模块的导入问题
ide·vscode·python
aqiu~10 小时前
VSCode编辑器用于Unity项目
vscode·unity
Nobody3311 小时前
Verilog always语句详解:从组合逻辑到时序逻辑
fpga开发
李嘉图Ricado13 小时前
FPGA 时序约束与分析
fpga开发
白又白、16 小时前
时序优化和上板调试小结
fpga开发
Z22ZHaoGGGG18 小时前
verilog实现采样电流有效值的计算
fpga开发