任务和函数结构
任务与函数区别:
1) 任务块可以含有时间控制语句,而函数块则没有(函数块从零仿真时刻开始运行,结束后立即返回即实现组合功能),任务块在继续下面过程之前其初始化代码必须保持到任务全部执行结束或是失败。
2) 一个任务块可以有输入输出,而一个函数块必须有至少一个输入,没有任何输出,函数结构通过自身的名字返回结果。
3) 任务的引发是通过一条语句,而函数块只有当它被引用在一个表达式中才会生效。
时序控制:
仿真之前Verilog有两种时序控制,一种为延迟,一种为事件控制
延迟控制(#)
事件通过运行表达式:->eventb变量来被激发。
等待语句
@event_expression
wait (expression)
延时定义块
延时定义块在一个独立的结构中定义模块的时序部分,这样功能验证就可以与时序验证相独立。
延时定义块的内容在specify和endspecify之间,且必须在某一模块内部,在定义块中还可以使用specparam关键字定义参数。
测试模块的组成:
a) 数据类型的定义
b) 模块实例
c) 施加激励
d) 显示结果monitor($time,”**********”,*,*);
编译指令
编译指令用(`)表示
1) 文本交换(`define)
格式:`define <name> <macro_text>
定义全局参数,如延时,位宽等
+define+命令 重新进行宏定义
2) 文本包含(`include)
格式:`include”<file_name>”
作用:把全局或经常使用的定义单独放到一个文件中,然后包含这个文件
可以包含一些task任务块,但这些任务块中不能有压缩的重复代码
Include最多可嵌套8层
3) 时间尺度(`timescale)
格式:`timescale <time_unit>/<time_precision>
time_unit延时和时间的计量单位
time_precision时间精度在仿真前确定如何驱动时间
功能:`timescale编译指令用来定义时间单位和精度
l 如果时间单位和精度相差太大,仿真速度会大大降低
l 所有时间尺度指令的最小精度作为整个仿真的时间单位