verilog中赋值运算符(=和<=)的用法

目录

原理

RTL 图

运算符优先级


原理

“=”阻塞赋值,”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。如下面的阻塞赋值代码:

(CSDN代码块不支持Verilog,代码复制到notepad++编辑器中,语言选择Verilog,看得更清楚)

module top(din,a,b,c,clk);
input din;
input clk;
output reg a,b,c;
always @(posedge clk) 
begin
 a = din;
 b = a;
 c = b;
end
endmodule

对应的激励文件:

`timescale 1 ns/1 ns 
module top_tb() ;
reg din ;
reg clk ;
wire a,b,c ;
initial
begin
 din = 0 ;
 clk = 0 ;
 forever
 begin 
 #({$random}%100)
 din = ~din ;
 end
end
always #10 clk = ~clk ;
top t0
(
.din(din),
.a(a),
.b(b),
.c(c),
.clk(clk)
) ;
endmodule

在 clk 的上升沿,a 的值等于 din,并立即赋给 b,b 的值赋给 c。

如果改为非阻塞赋值,仿真结果如下,在 clk 上升沿,a 的值没有立即赋值给 b,b 为 a 原来的值,同样,c 为 b 原来的值。

RTL 图

可以从两者的 RTL 图看出明显不同:
一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免仿真时出现竞争冒险现象;在组合逻辑使用阻塞赋值,执行赋值语句后立即改变;在 assign 语句中必须用阻塞赋值。

运算符优先级

相关推荐

  1. Veriloggenerate

    2024-04-23 08:00:05       36 阅读
  2. C#索引范围运算符

    2024-04-23 08:00:05       29 阅读
  3. Verilog 14: 阻塞非阻塞赋值异同

    2024-04-23 08:00:05       26 阅读
  4. C++赋值运算符重载

    2024-04-23 08:00:05       26 阅读
  5. js 扩展运算符(...)

    2024-04-23 08:00:05       19 阅读
  6. MyBatis#{}${}

    2024-04-23 08:00:05       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 08:00:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 08:00:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 08:00:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 08:00:05       18 阅读

热门阅读

  1. 资料总结分享:临床重要数据库

    2024-04-23 08:00:05       13 阅读
  2. 可信通信(TLS/SSL协议)

    2024-04-23 08:00:05       13 阅读
  3. <基础数学> 平面向量基本定理

    2024-04-23 08:00:05       10 阅读
  4. 数学分析复习:中值定理、反函数定理

    2024-04-23 08:00:05       15 阅读
  5. linux系统安装docker-compose

    2024-04-23 08:00:05       12 阅读
  6. Stable Diffusion模型介绍

    2024-04-23 08:00:05       14 阅读