SV2 过程语句和子程序

SV2 过程语句和子程序

1 过程语句

  • 可以在for循环中定义循环变量,其作用范围仅限于循环内部。
  • 增加了自增、自减运算符++、- -。
  • 可以定义块名。
  • 为循环语句增加了continue和break语句。

2 任务、函数以及void函数

  • 函数:可以有返回值,也可以无返回值,不能包含延时语句
  • 任务:不能有返回值,可以包含延时语句
  • SV扩展:函数可以调用包含延时的任务,但只能在fork...join_none中进行

3 任务和函数概述

  • 不带参数的子程序在定义和调用时可以不加小括号
  • begin...end块可以省略

4 子程序参数

4.1 C语言风格的子程序参数

在这里插入图片描述

4.2 参数的方向

  • 缺省的类型和方向为“logic 输入”

4.3 高级的参数类型

  • SV中,参数的传递方式可以指定为引用而不是复制
  • 声明为ref参数后,可以修改变量值,并且修改结果对调用它的函数随时可见
    在这里插入图片描述
    注:const修饰符使得函数内不能修改数组的值。
    在这里插入图片描述
    在这里插入图片描述

4.4 参数的缺省值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5 采用名字进行参数传递

在这里插入图片描述

5 子程序的返回

5.1 return语句

在这里插入图片描述

5.2 从函数中返回一个数组

  • 建立一个数组类型,在函数声明中使用该类型
    在这里插入图片描述
  • 通过引用进行数组参数的传递
    在这里插入图片描述
  • 将数组包装到类中,然后返回类的句柄

6 局部数据存储

6.1 自动存储

Verilog中,如果试图在测试程序里的多个地方调用同一个任务,由于任务里的局部变量会使用共享的静态存储区,所以不同的线程之间会窜用这些局部变量。可以使用automatic声明为自动存储。
在这里插入图片描述

6.2 变量的初始化

  • 局部变量在仿真开始前就会被初始化
    在这里插入图片描述

7 时间值

7.1 时间单位和精度

  • timeunit 和 timeprecision 声明语句可以明确地为每个模块指明时间值
  • 当使用这两个语句代替 `timescale 时,需要把它们放到每个带有延时的模块中

7.2 时间参数

在这里插入图片描述

7.3 时间和变量

  • time类型的变量不能保存小数值
    在这里插入图片描述
    在这里插入图片描述

7.4 $time 和 $realtime的对比

  • $time:不带小数部分
  • $realtime:带小数部分的完整实数
posted @ 2021-09-23 20:35  thompsonm  阅读(177)  评论(0)    收藏  举报