阻塞赋值是什么

Fanly QA 2020-10-05 21:49:14 阅读(...)

在Verilog HDL的概念中阻塞赋值操作符用等号(即=)表示。在赋值时先计算等号右手部分的值,这时赋值语句不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,才允许别的赋值语句的执行。

在 Verilog HDL 的概念中阻塞赋值操作符用等号(即=)表示。在赋值时先计算等号右手部分的值,这时赋值语句不允许任何别的 Verilog 语句的干扰,直到现行的赋值完成时刻,才允许别的赋值语句的执行。

阻塞赋值是什么

简介

定义

在 Verilog HDL 的概念中阻塞赋值操作符用等号(即=)表示。在赋值时先计算等号右手方向(RHS)部分的值,这时赋值语句不允许任何别的 Verilog 语句的干扰,直到现行的赋值完成时刻,即把 RHS 赋值给 LHS(等号左手方向)的时刻,它才允许别的赋值语句的执行。一般可综合的阻塞赋值操作在 RHS 不能设定有延迟(即使是零延迟也不允许)。从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质上的延迟。若在 RHS 上加延迟,则在延迟期间会阻止赋值语句的执行,延迟后才执行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。

问题

如果在一个过程块中阻塞赋值的 RHS 变量正好是另一个过程块中阻塞赋值的 LHS 变量,这两个过程块又用同一个时钟沿触发,这时阻塞赋值操作会出现问题,即如果阻塞赋值的顺序安排不好,就会出现竞争。若这两个阻塞赋值操作用同一个时钟沿触发,则执行的顺序是无法确定的。

使用要点

主要是下面两个要点:

(1)在描述组合逻辑的 always 块中用阻塞赋值,则综合成组合逻辑的电路结构:

(2)在描述时序逻辑的 always 块中用非阻塞赋值,则综合成时序逻辑的电路结构。

为什么一定要这样做呢?这是因为要使综合前仿真和综合后仿真一致的缘故。如果不按照上面两个要点来编写 Verilog 代码,也有可能综合出正确的逻辑,但前后仿真的结果就会不一致。

为了更好地理解上述要点,需要对 Verilog 语言中的阻塞赋值和非阻塞赋值的功能和执行时间上的差别有深入的了解。为了解释问题方便,下面定义两个缩写字:

RHS——方程式右手方向的表达式或变量可分别缩写为 RHS 表达式或 RHS 变量;

LHS——方程式左手方向的表达式或变量可分别缩写为 LHS 表达式或 LHS 变量。

IEEEVerilog 标准定义了有些语句有确定的执行时间,有些语句没有确定的执行时间。若有两条或两条以上语句准备在同一时刻执行,但由于语句的排列顺序不同(而这种排列顺序的不同是 IEEEVerilog 标准所允许的),却产生了不同的输出结果。这就是造成 Verilog 模块冒险和竞争现象的原因。

操作过程

阻塞赋值的执行可以认为是只有一个步骤的操作,即计算 RHS 并更新 LHS,且不能允许有来自任何其他 Verilog 语句的干扰。所谓阻塞的概念是指在同一个 always 块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。

与非阻塞赋值区别

在状态变量的赋值或开关变量的赋值中,已明确建议大家使用非阻塞赋值。这不但是因为综合工具要求这样做,最根本的原因是与非阻塞赋值语句语意对应的电路结构正是我们想要实现的。这两种赋值语句对应着两种不同的电路结构。阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系。而非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。

阻塞和非阻塞赋值的区别在阻塞是顺序执行而非阻塞是并行执行。

以下面的语句举例

非阻塞赋值

always@(posedge clk)

begin

b<=a;

c<=b;

end

阻塞赋值

always@(posedge clk)

begin

b=a;

c=b;

end

两种不同的赋值方式结果是不同的,非阻塞赋值 b<=a;c<=b;两条语句是同时执行的,而阻塞赋值 b=a;c=b;两条语句先执行 b=a 后执行 c=b。

收藏 0个人收藏
走进科技生活方式

评论交流

泪雪默认头像 请「登录」后参与评论
  1. 加载中..

相关推荐