Verilog初级教程(21)Verilog中的延迟控制语句
文章目录
- 前言
- 正文
- 延迟控制语句
- 事件控制语句
- 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中的延迟控制语句相关推荐
- Verilog初级教程(23)Verilog仿真中的显示任务
文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(11)Verilog中的initial块
文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...
- Verilog初级教程(19)Verilog中的参数
文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...
- Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog初级教程(16)Verilog中的控制块
文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...
- Verilog初级教程(9)Verilog的运算符
博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...
最新文章
- Redhat7 samba配置(部分)
- redis 同步化操作
- 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结
- 用户态和核心态的转换
- Docker(十二)关于deployment 创建的小坑
- JQuery EasyUI datagrid 键盘上下控制选中行
- 系统的延时与定时任务
- delphi组件读写机制
- 当前日期或 *(星号)显示在 think-cell 标签中
- 小丸工具箱压制字幕注意
- 无人机在环保行业中的应用
- rasp 系统_RASP技术分析
- 小程序微信运动时间戳格式转换+列表渲染微信运动数据
- matlab 图片RGB颜色提取
- cublas_学习笔记2
- win10系统全角半角切换
- CIMPLICITY标签导入导出功能简单介绍
- mcs 4微型计算机,全国自考(微型计算机原理与接口技术)模拟试卷4
- 零基础无实物一步一步学PLCS7-1200仿真(八)-按键控制数码管显示
- 算法-----一苇渡江
热门文章
- WPF和Silverlight设计实例
- 基于android的家庭财务通 .apk,毕业论文(设计)基于Android的家庭财务管家的设计与实现.doc...
- get post put delete 区别_GET 和 POST 的区别?
- arduino串口监视器显示nan_使用Arduino开发板制作摩尔斯电码生成器
- 新手学python还是c语言_py和c语言究竟新手该学哪个?
- 网页提示未认证授权的应用服务器,授权认证(IdentityServer4)
- 对IOC,AOP的理解
- php 复选框 数组,php数组的复选框
- html div 可鼠标滚动,js实现鼠标拖拽div左右滑动
- qt5中字符串转字符串数组_Qt中的对象类型转换(Qstring 转换char*有三种方法)