关于verilog阻塞赋值与非阻塞赋值的一些浅见

最近学到了关于verilog的阻塞赋值与非阻塞赋值的一些区别,经过网上查阅与仿真实验,有了一些理解。希望能够记下来。

说到verilog的阻塞与非阻塞赋值,不得不说的就是verilog的事件表,如下:

阻塞赋值,属于活跃事件,计算完RHS(Right Hand Side)立即更新左值。期间同一块内其他语句不能执行,即阻塞其他语句执行。

而非阻塞右值计算属于活跃事件,非阻塞左值更新属于非活跃事件,即计算完RHS,不能立即更新左值,而要等所有活跃事件完成,才能完成左值更新,出事件队列。

 

然后说说$display与$strobe

显示任务($display)在执行到该语句时立即执行显示

选通任务($strobe)要推迟到事件列表当前时阶结束时进行。

$strobe:
当该时刻的所有事件处理完后,在这个时间步的结尾打印一行格式化的文本,
规则
这些系统任务的变量的语法几乎和$display 任务一样

但是$strobe 被调用时,在该块中所有活动都完成了,$strobe 才打印文本,这包括所有阻塞性和非阻塞性赋值的作用

提示
在写仿真结果时请尽量使用$strobe 少用$display 或$write 
举例
initial
begin
x = 1‘b0;
$display("x1=%d",x);        
$strobe("x2=%d",x);           
x = 1‘b1;                   
end

最后显示 x1=0;x2=1;

(1)

(若无延时,计算完所有RHS,同步更新到RLS,加了延时,

并且此时延时在最前边,表示计算右值与赋值都被延时)

#50延时,clk上升沿,

#100延时,RHS_a ->a

#50 RHS_b -> b

#50 RHS_c ,$display, RHS_c -> c;

打印结果:

波形结果:

(2)

(此时延时,指的是输入与输出间的延时)

#50延时,clk上升沿RHS_a,RHS_b,RHS_c, $display

#50延时,RHS_b->b,RHS_c->c

#50延时,(另一个clk上升沿)$display  RHS_a->a

 

打印结果:

波形结果:

(3)

#50延时,clk上升沿

#100延时,RHS_a->a

#50延时,RHS_b->b

#50延时,RHS_c->c,$display

 

打印结果:

波形结果:

(4)

#50 lk上升沿

RHS_a  #100延时  RHS_a->a

RHS_b  #50延时  RHS_b->b

RHS_c  #50延时  RHS_c->c,$display

 

打印结果:

波形结果:

因此,将begin-end改为fork-join,系统运行结果如下;

 

(1)

打印结果:

波形结果:

 

(2)

打印结果:

波形结果:

(3)

打印结果:

波形结果:

(4)

打印结果:

波形结果:

其实$display的执行时间与仿真器有关,硬件上,$display的运行时间与并行的程序的相对时间是不确定的,而仿真器则设置了固定的开始时间。

本文只是个人的一点薄见,希望能够抛砖引玉,愿各位高手不吝赐教。转载请说明。

关于verilog阻塞赋值与非阻塞赋值的一些浅见

时间: 2024-08-24 19:52:34

关于verilog阻塞赋值与非阻塞赋值的一些浅见的相关文章

Verilog阻塞赋值与非阻塞赋值

今天又个兄弟求助,数据库里一个表有数据如下: no  name 1    a 2    b 3    c 4    d 如何用一个sql显示如下结果: ab ac ad bc bd cd 对于这种构造数据,是分析函数的强项,下面来做个试验: create table t (no number,name varchar(2)); insert into t values(1,'a'); insert into t values(2,'b'); insert into t values(3,'c')

阻塞赋值与非阻塞赋值

     过程赋值:用于对reg型变量赋值,改变寄存器的值或为以后排定改变.      语法 {阻塞性(blocking)赋值} RegisterLValue = [ TimingControl] Expression; {非阻塞性(non-blocking)赋值} RegisterLValue <= [ TimingControl] Expression; 阻塞:在本语句中"右式计算"和"左式更新"完全完成之后,才开始执行下一条语句: 非阻塞:当前语句的执行

阻塞赋值与非阻塞赋值(转载)

 前言:阻塞与非阻塞赋值是Verilog语言中最基本的部分,也是让大部分Verilog新手最困惑的地方.关于阻塞与非阻塞的著作文章可谓汗牛充栋,这些文章对阻塞与非阻塞赋值的原理进行了非常详细的讲解,但新手读了之后依然有种似懂非懂的感觉,编码过程中一如既往的犯错.所以,本文的目的立足于提供一种实用化的解决方案,用最简单的语言和形象的类比让新手能够一目了然的明白正确的编码方式以及相应的电路行为逻辑,关于仿真细节的讲解不是本文重点,需要了解更多细节的朋友可以参考文后列举的参考文献. 本文共分为三部分,

07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: ????阻塞赋值,操作符为"=","阻塞"是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行.而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量. ????非阻塞赋值,操作符为"<=","非阻塞"是指在进程语句(

FPGA之阻塞赋值与非阻塞赋值

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情.而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:1.阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要2.非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序3.在assign的结构中,必须使用的是阻塞赋值 //阻塞modu

阻塞赋值和非阻塞赋值

2017-12-01 在Verilog语言中,赋值语句经常使用,阻塞赋值和非阻塞赋值经常带给我们很多困扰.在此讨论两种赋值方式的差异性. 首先根据表面含义深刻理解阻塞和非阻塞: 阻塞:在进程语句块中(initial或者always或者其他),当前赋值语句的执行阻塞了后面语句的执行.即后面语句的赋值需要等到当前赋值过程完成才能得以执行,即可认为执行过程是顺序执行的(我们要明白Verilog中,大多数情况模块都是并发执行的). 非阻塞:当前赋值语句的执行不会阻塞后续语句的执行,即可以认为当前赋值语句

用一个例子来学习阻塞赋值和非阻塞赋值

阻塞赋值与非阻塞赋值 阻塞赋值的一般表达式为:目标变量名=驱动表达式  阻塞赋值是一种理想化的数据传输,赋值立即发生,不存在延时行为 非阻塞赋值一般表达式为:目标变量名<=驱动表达式   非阻塞赋值比较接近真实的电路工作状态,应为他从综合的角度考虑到了延时和并行性. 在过程启动中,非阻塞赋值使三条语句同时运行,而阻塞赋值是按顺序方式完成更新的数据的. 新建工程,编写示例代码 module block_nonblock(clk,rst_n,a,b,c,out ); input clk,rst_n,

Verilog HDL中阻塞语句和非阻塞语句的区别

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情.而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:1.阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要2.非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序3.在assign的结构中,必须使用的是阻塞赋值 下面给出实例来说

Verilog堵塞赋值与非堵塞赋值

verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1.堵塞赋值与非堵塞赋值: 2.代码測试: 3.组合逻辑电路和时序逻辑电路. 堵塞赋值与非堵塞赋值: 1.堵塞赋值"="(组合逻辑电路).非堵塞赋值"<="(时序逻辑电路): 2.Verilog模块编程的8个原则: (1)  时序电路建模时,用非堵塞赋值. (2)  锁存器电路建模时,用非堵塞赋值. (3)  用always块建立组合逻辑模型时.用堵塞赋值. (4)  在同一个always块中