文章目录

  • 前言
  • 正文
    • 延迟控制语句
    • 事件控制语句
    • Named Events
    • Event or operator
  • 往期回顾
  • 参考资料及推荐关注

前言

Verilog中的延迟控制有两种类型–延迟和事件表达式。

下面一一道来。

正文

延迟控制语句

如果延迟表达式的值为未知值或高阻抗值,将被解释为零延迟。对于这个语句会用即可,用于仿真延时使用嘛,例如:

`timescale 1ns/1psmodule tb;reg [3:0] a, b;initial begin{a,b} = 0;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);#10a = 10;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);#(2*10)b = 8;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);     #('dz)a = 2;b = 2;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);      #('h10)a = 3;b = 3;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);     endendmodule
# run 1000ns
T=0 a=0 b=0
T=10000 a=10 b=0
T=30000 a=10 b=8
T=30000 a=2 b=2
T=46000 a=3 b=3

事件控制语句

线网和变量的值变化可以作为同步事件来触发执行其他程序语句,是一个隐含事件。该事件也可以基于变化的方向,比如朝0的变化使其成为negedge,朝1的变化使其成为posedge。(并不一定非要是时钟)

  • negedge是指从1到X、Z或0,以及从X或Z到0的过渡。
  • posedge是指从0到X、Z或1,以及从X或Z到1的过渡。
module tb;reg a, b;initial begina <= 0;#10 a <= 1;#10 b <= 1;#10 a <= 0;#15 a <= 1;  end
// Start another procedural block that waits for an update to
// signals made in the above procedural block initial begin @(posedge a); $display ("T=%0t Posedge of a detected for 0->1", $time); @(posedge b); $display ("T=%0t Posedge of b detected for X->1", $time);@(posedge (a + b)) $display ("T=%0t Posedge of a+b", $time);@(a) $display ("T=%0t Change in a found", $time);end
endmodule

Time resolution is 1 ps
T=10000 Posedge of a detected for 0->1
T=20000 Posedge of b detected for X->1
T=30000 Posedge of a+b
T=45000 Change in a found

如果是这样:

module tb;reg a, b;initial begina <= 0;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);#10 a <= 1;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);#10 b <= 1;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);#10 a <= 0;$display ("T=%0t a=%0d b=%0d", $realtime, a, b);#15 a <= 1;  end
// Start another procedural block that waits for an update to
// signals made in the above procedural block initial begin @(posedge a); $display ("T=%0t Posedge of a detected for 0->1", $time); @(posedge b); $display ("T=%0t Posedge of b detected for X->1", $time);@(posedge (a + b)) $display ("T=%0t Posedge of a+b", $time);@(a) $display ("T=%0t Change in a found", $time);end
endmodule

则仿真log为:

Time resolution is 1 ps
T=0 a=x b=x
T=10000 a=0 b=x
T=10000 Posedge of a detected for 0->1
T=20000 a=1 b=x
T=20000 Posedge of b detected for X->1
T=30000 a=1 b=1
T=30000 Posedge of a+b
T=45000 Change in a found

Named Events

关键字event可以用来声明一个可以明确触发的命名事件。一个事件不能保存任何数据,没有时间长度,可以在任何特定的时间发生。命名的事件可以通过在命名的事件句柄前加上->操作符来触发。命名事件可以通过使用上面描述的@操作符来等待。

module tb;event a_event;event b_event;initial begin#20 -> a_event;#30;->a_event;#50 ->a_event;#10 ->b_event;endalways @ (a_event) $display ("T=%0t [always] a_event is triggered", $time);initial begin#25;@(a_event) $display ("T=%0t [initial] a_event is triggered", $time);#10 @(b_event) $display ("T=%0t [initial] b_event is triggered", $time);end
endmodule
Time resolution is 1 ps
T=20000 [always] a_event is triggered
T=50000 [initial] a_event is triggered
T=50000 [always] a_event is triggered
T=100000 [always] a_event is triggered
T=110000 [initial] b_event is triggered

Event or operator

或操作符可以用来等待,直到表达式中的任何一个事件被触发。也可以用逗号 ,代替or操作符。

module tb;reg a, b;initial begin$monitor ("T=%0t a=%0d b=%0d", $time, a, b);{a, b} <= 0;#10 a <= 1;#5  b <= 1;#5  b <= 0;end// Use "or" between eventsalways @ (posedge a or posedge b)$display ("T=%0t posedge of a or b found", $time);// Use a comma betweenalways @ (posedge a, negedge b)$display ("T=%0t posedge of a or negedge of b found", $time);always @ (a, b)$display ("T=%0t Any change on a or b", $time);
endmodule
Time resolution is 1 ps
T=0 Any change on a or b
T=0 posedge of a or negedge of b found
T=0 a=0 b=0
T=10000 Any change on a or b
T=10000 posedge of a or b found
T=10000 posedge of a or negedge of b found
T=10000 a=1 b=0
T=15000 Any change on a or b
T=15000 posedge of a or b found
T=15000 a=1 b=1
T=20000 Any change on a or b
T=20000 posedge of a or negedge of b found
T=20000 a=1 b=0

好了,不再多说,其实最常用还是:

@(posedge a)
...@(b)
...#10
....

往期回顾

Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

Verilog初级教程(19)Verilog中的参数

Verilog初级教程(18)Verilog中的函数与任务

Verilog初级教程(17)Verilog中的case语句

Verilog初级教程(16)Verilog中的控制块

Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

Verilog初级教程(14)Verilog中的赋值语句

Verilog初级教程(13)Verilog中的块语句

Verilog初级教程(12)Verilog中的generate块

Verilog初级教程(11)Verilog中的initial块

Verilog初级教程(10)Verilog的always块

Verilog初级教程(9)Verilog的运算符

Verilog初级教程(8)Verilog中的assign语句

Verilog初级教程(7)Verilog模块例化以及悬空端口的处理

Verilog初级教程(6)Verilog模块与端口

Verilog初级教程(5)Verilog中的多维数组和存储器

Verilog初级教程(4)Verilog中的标量与向量

Verilog初级教程(3)Verilog 数据类型

Verilog初级教程(2)Verilog HDL的初级语法

Verilog初级教程(1)认识 Verilog HDL

芯片设计抽象层及其设计风格

Verilog以及VHDL所倡导的的代码准则

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

参考资料及推荐关注

Verilog `ifdef Conditional Compilation

个人微信公众号: FPGA LAB

交个朋友

Verilog初级教程(21)Verilog中的延迟控制语句相关推荐

  1. Verilog初级教程(23)Verilog仿真中的显示任务

    文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...

  2. Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

    文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...

  3. Verilog初级教程(11)Verilog中的initial块

    文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...

  4. Verilog初级教程(19)Verilog中的参数

    文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...

  5. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

    文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...

  6. Verilog初级教程(14)Verilog中的赋值语句

    文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...

  7. Verilog初级教程(12)Verilog中的generate块

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

  8. Verilog初级教程(16)Verilog中的控制块

    文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...

  9. Verilog初级教程(9)Verilog的运算符

    博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...

最新文章

  1. Redhat7 samba配置(部分)
  2. redis 同步化操作
  3. 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结
  4. 用户态和核心态的转换
  5. Docker(十二)关于deployment 创建的小坑
  6. JQuery EasyUI datagrid 键盘上下控制选中行
  7. 系统的延时与定时任务
  8. delphi组件读写机制
  9. 当前日期或 *(星号)显示在 think-cell 标签中
  10. 小丸工具箱压制字幕注意
  11. 无人机在环保行业中的应用
  12. rasp 系统_RASP技术分析
  13. 小程序微信运动时间戳格式转换+列表渲染微信运动数据
  14. matlab 图片RGB颜色提取
  15. cublas_学习笔记2
  16. win10系统全角半角切换
  17. CIMPLICITY标签导入导出功能简单介绍
  18. mcs 4微型计算机,全国自考(微型计算机原理与接口技术)模拟试卷4
  19. 零基础无实物一步一步学PLCS7-1200仿真(八)-按键控制数码管显示
  20. 算法-----一苇渡江

热门文章

  1. WPF和Silverlight设计实例
  2. 基于android的家庭财务通 .apk,毕业论文(设计)基于Android的家庭财务管家的设计与实现.doc...
  3. get post put delete 区别_GET 和 POST 的区别?
  4. arduino串口监视器显示nan_使用Arduino开发板制作摩尔斯电码生成器
  5. 新手学python还是c语言_py和c语言究竟新手该学哪个?
  6. 网页提示未认证授权的应用服务器,授权认证(IdentityServer4)
  7. 对IOC,AOP的理解
  8. php 复选框 数组,php数组的复选框
  9. html div 可鼠标滚动,js实现鼠标拖拽div左右滑动
  10. qt5中字符串转字符串数组_Qt中的对象类型转换(Qstring 转换char*有三种方法)