专栏首页用户7494468的专栏Verilog初级教程(22)赋值间延迟语句与赋值内延迟语句

Verilog初级教程(22)赋值间延迟语句与赋值内延迟语句

前言

Verilog延迟语句可以在赋值运算符的左侧或右侧指定延迟。

所谓的左侧就是:

// Delay is specified on the left side
#<delay> <LHS> = <RHS>

右侧就是:

// Delay is specified on the right side
<LHS> = #<delay> <RHS>

下面详细讲解。

正文

赋值间延迟语句

// Delay is specified on the left side
#<delay> <LHS> = <RHS>

赋值间延迟语句在赋值运算符的LHS上有延迟值。这表示语句本身在延迟到期后执行,是最常用的延迟控制形式。

module tb;
  reg  a, b, c, q;

  initial begin
    $monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);

    // Initialize all signals to 0 at time 0
    a <= 0;
    b <= 0;
    c <= 0;
    q <= 0;

    // Inter-assignment delay: Wait for #5 time units
    // and then assign a and c to 1. Note that 'a' and 'c'
    // gets updated at the end of current timestep
    #5  a <= 1;
     c <= 1;

    // Inter-assignment delay: Wait for #5 time units
    // and then assign 'q' with whatever value RHS gets
    // evaluated to
    #5 q <= a & b | c;

    #20;
  end

endmodule

请注意,q在时间10单位时变成了1,因为语句在10个时间单位时被计算,RHS是a、b和c的组合,计算为1。

这是其仿真结果:

[0] a=0 b=0 c=0 q=0
[5000] a=1 b=0 c=1 q=0
[10000] a=1 b=0 c=1 q=1

赋值间延迟仿真

注:看到代码的注释了吗?

Inter-assignment delay: Wait for #5 time units and then assign a and c to 1. Note that 'a' and 'c' gets updated at the end of current timestep

这是很基础的一句话,这句话说明了Verilog这门语言的基本特点,或者说Verilog中非阻塞赋值的基本特点,如下:

    // Inter-assignment delay: Wait for #5 time units
    // and then assign a and c to 1. Note that 'a' and 'c'
    // gets updated at the end of current timestep
    #5  a <= 1;
     c <= 1;

这条语句,在第5ns时候虽然给a与c均赋值了1,但是此刻并不生效,而会在当前时间步长结束时生效,例如,我们在此刻加一个语句,使用a与c的值:

  // Inter-assignment delay: Wait for #5 time units
    // and then assign a and c to 1. Note that 'a' and 'c'
    // gets updated at the end of current timestep
    #5  a <= 1;
     c <= 1;
     q <= a&c;

非阻塞赋值特点仿真

此时,q的值不会为1,而时为0,这就是因为此刻q的值没有生效,我们在第6秒再看就可以看到生效了:

非阻塞赋值特点仿真

由于一般timescale默认为1ns/1ps,因此,步长应该为1ns。也就是在1ns末生效。

赋值内延迟语句

// Delay is specified on the right side
<LHS> = #<delay> <RHS>

赋值内延迟是指在赋值运算符的RHS上有一个延迟。这表示语句被计算,RHS上的所有信号的值首先被捕获。然后在延时过后才对结果信号进行赋值。

module tb;
  reg  a, b, c, q;

  initial begin
    $monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);

 // Initialize all signals to 0 at time 0
    a <= 0;
    b <= 0;
    c <= 0;
    q <= 0;

    // Inter-assignment delay: Wait for #5 time units
    // and then assign a and c to 1. Note that 'a' and 'c'
    // gets updated at the end of current timestep
    #5  a <= 1;
     c <= 1;

    // Intra-assignment delay: First execute the statement
    // then wait for 5 time units and then assign the evaluated
    // value to q
    q <= #5 a & b | c;

    #20;
  end
endmodule

仿真结果为:

非阻塞赋值特点仿真

很多人就感觉奇怪了,为什么q没有了为1的时候,不应该在10ns时候为1吗?

如果出现这个疑问?很正常,但是需要再次理解理解,这个赋值内延迟的含义与非阻塞赋值的特点。

在第5ns时候,a,b,q同时被赋值,a和c在第5s被非阻塞赋值,也就是在第5ns末有效。第5ns时,q也被赋值,但是在第5ns时(起始),q经过计算为0,它经过5ns后被赋值,因此,会一直为0,好像1被吞掉了似的,其实理解了二者的含义,很好理解。

为了对比,我们在第5ns时,对a和c都进行阻塞赋值:

// Non-blocking changed to blocking and rest of the
// code remains the same
    #5  a = 1;
     c = 1;

    q <= #5 a & b | c;

我们可以得到不一样的结果:

阻塞赋值特点仿真

这才是你想要的结果。什么原因呢?还是在第5ns时候(初),a和c都已经为1了,此时,q经过计算也为1,然后延迟5ns,赋值给q,因此,q在10ns时候为1。

参考资料

[1]

Verilog初级教程(21)Verilog中的延迟控制语句: https://blog.csdn.net/Reborn_Lee/article/details/107752232

[2]

Verilog初级教程(20)Verilog中的ifdef 条件编译语句: https://reborn.blog.csdn.net/article/details/107746871

[3]

Verilog初级教程(19)Verilog中的参数: https://blog.csdn.net/Reborn_Lee/article/details/107448941

[4]

Verilog初级教程(18)Verilog中的函数与任务: https://reborn.blog.csdn.net/article/details/107447734

[5]

Verilog初级教程(17)Verilog中的case语句: https://reborn.blog.csdn.net/article/details/107446020

[6]

Verilog初级教程(16)Verilog中的控制块: https://blog.csdn.net/Reborn_Lee/article/details/107437358

[7]

Verilog初级教程(15)Verilog中的阻塞与非阻塞语句: https://blog.csdn.net/Reborn_Lee/article/details/107436015

[8]

Verilog初级教程(14)Verilog中的赋值语句: https://reborn.blog.csdn.net/article/details/107431511

[9]

Verilog初级教程(13)Verilog中的块语句: https://reborn.blog.csdn.net/article/details/107427568

[10]

Verilog初级教程(12)Verilog中的generate块: https://blog.csdn.net/Reborn_Lee/article/details/107308629

[11]

Verilog初级教程(11)Verilog中的initial块: https://reborn.blog.csdn.net/article/details/107307958

[12]

Verilog初级教程(10)Verilog的always块: https://blog.csdn.net/Reborn_Lee/article/details/107052261

[13]

Verilog初级教程(9)Verilog的运算符: https://blog.csdn.net/Reborn_Lee/article/details/106985414

[14]

Verilog初级教程(8)Verilog中的assign语句: https://reborn.blog.csdn.net/article/details/106985139

[15]

Verilog初级教程(7)Verilog模块例化以及悬空端口的处理: https://reborn.blog.csdn.net/article/details/106982280

[16]

Verilog初级教程(6)Verilog模块与端口: https://blog.csdn.net/Reborn_Lee/article/details/106977581

[17]

Verilog初级教程(5)Verilog中的多维数组和存储器: https://blog.csdn.net/Reborn_Lee/article/details/106974813

[18]

Verilog初级教程(4)Verilog中的标量与向量: https://blog.csdn.net/Reborn_Lee/article/details/106973708

[19]

Verilog初级教程(3)Verilog 数据类型: https://blog.csdn.net/Reborn_Lee/article/details/106970881

[20]

Verilog初级教程(2)Verilog HDL的初级语法: https://blog.csdn.net/Reborn_Lee/article/details/106960366

[21]

Verilog初级教程(1)认识 Verilog HDL: https://blog.csdn.net/Reborn_Lee/article/details/106960243

[22]

芯片设计抽象层及其设计风格: https://blog.csdn.net/Reborn_Lee/article/details/106958187

[23]

Verilog以及VHDL所倡导的的代码准则: https://blog.csdn.net/Reborn_Lee/article/details/106872978

[24]

FPGA/ASIC初学者应该学习Verilog还是VHDL?: https://blog.csdn.net/Reborn_Lee/article/details/106793593

[25]

交个朋友: https://blog.csdn.net/Reborn_Lee/article/details/107322084

本文分享自微信公众号 - FPGA LAB(gh_af38c08c9983),作者:李锐博恩

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FPGA设计心得(12)如何正确使用 in_system_ibert ?

    对应的IP端口处也会出现相应的端口,例如上图选择了2个Quad,也就是8个通道的串行收发器,那么对应的drp接口就有8个。

    Reborn Lee
  • Verilog设计实例(4)详解全类别加法器(一)

    本文详细地总结了一系列的加法器,包括半加器、全加器、等波纹进位加法器,虽然FPGA设计工程师不会设计这些东西作为模块来使用,因为综合工具足够智能,能够识别数据相...

    Reborn Lee
  • FPGA/ASIC初学者应该学习Verilog还是VHDL?

    对于FPGA或者ASIC的初学者来说,选择哪种语言貌似应该根据自身的需求而定,例如实验室项目需要使用哪种语言,或者实验室师兄师姐使用了哪种语言,或者导师推荐你学...

    Reborn Lee
  • 用js控制frame的页面跳转

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • 项目更新:OpenStack Neutron的下一步是什么

    在最近的温哥华峰会上,OpenStack项目团队负责人(PTL)和其核心团队成员介绍了OpenStack项目的相关更新,以及如何参与并影响路线图。

    SDNLAB
  • 测试

    答:为了区分新版的倍速播放教程,解压密码与以前的不一样了,新的解压密码是紫猫zimaoxy.com

    用户5739303
  • Openstack Neutron的新特性[Openstack]

    OpenStack的Stein版本提供了多种网络连接即服务增强,以支持5G、IIoT和边缘计算用例

    用户6667850
  • 漫谈单点登录(SSO)

    人生不如戏
  • SSO详解(转)

    人生不如戏
  • 漫谈单点登录(SSO)

    SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开源的有OpenSSO、CAS ,微软的AD SSO,及...

    人生不如戏

扫码关注云+社区

领取腾讯云代金券