阻塞赋值与非阻塞赋值

描述

”=“阻塞赋值”<=“非阻塞赋值verilog语言中的两种不同的赋值方式,下面将对两种赋值方式进行比较。方便进行理解和使用。

阻塞赋值:=阻塞赋值为执行完一条赋值语句之后再执行下一条,可以理解为顺序执行,而且赋值是立即执行;

非阻塞赋值:<=可以理解为并行执行,不考虑顺序,在always块语句执行完成之后才进行赋值。

下面提供一段黑金官方的仿真程序,各位可以自行进行仿真对比:

(源程序)

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 1ns / 1ns

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

同时也可以通过RTL图的不同来发现两者的区别:

RTL

注意 :一般情况下,在时序逻辑电路中使用非阻塞赋值,可以避免仿真时出现竞争冒险现象;在组合逻辑中使用阻塞赋值,执行赋值语句之后立即改变;在assign语句中必须使用阻塞赋值。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
20000223qc 2023-09-19
0 回复 举报
大佬 666 收起回复
jf_94710502 2023-09-19
0 回复 举报
大佬,太厉害了 收起回复
全部评论

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分