system绿皮书随记(二)--过程语句和子程序

3.1过程语句

Continue和break;

3.2任务、函数以及void

Sv和verilog中共同的地方:

任务可以描述组合逻辑和时序逻辑,可以有时延;函数只能描述组合逻辑,仿真时延为0;

在verilog中:

任务能调用任务和函数,但是函数只能调用函数,不能调用任务;

任务可以有任意多个各种类型的输入;函数只能有input端口的输入参数,且至少输入一个参数

任务可以没有返回值;函数必须有一个返回值

在sv中:

允许函数调用任务,但是只能由fork..join none语句生成的线程中调用;

函数可以有任意多个各种类型的输入输出;并且不一定要有返回值(void)

若函数没有返回值,但是有输出参数,在调用函数时,不需要再赋给其他参数;add_and_double(a, b, result); // function void add_and_double(int a, int b, output int result);调用函数并传递参数

若函数有返回值,在调用函数时,需要赋给其他参数;z = add_and_double(x, y);//function int add_and_double(int a, int b, output int result);

function和task的缺省类型都为logic输入0

在 SystemVerilog 中,当声明任务或者函数时,参数的默认值只能在参数列表的末尾设置//task read(int k, int data = 1, int j = 0);//function int calculate(int a, int b = 0, int c = 1);

如果在函数和任务中使用了非缺省输入类型的参数,应该明确指明所有参数的方向;

采用名字进行参数传递

3.3ref的使用

ref是变量(但不能是net)的引用,它的值是该变量最后一次赋值的值。

但是如果将一个变量连接到多个ref端口,就可能产生竞争的问题,因为多个模块的端口都有可能更新同一个变量;

参数列表中如果加了ref,就不能再对限定方向,如ref input [7:0] arr[ ] ,这是非法的形式

参数传递的方式是引用,而不是复制。如果不用ref,直接引用数组,会被复制在堆栈区,影响性能;

在任务中修改变量的结果对调用它的函数随时可见;

const ref 可以使引用的对象在子程序中不被改变;

3.5子程序的返回

3.6局部数据储存

自动储存automatic

静态方法的特点:                                                     

如果方法被static修饰,那么其内部所有的声明的变量都是 static 的;静态方法可以在类没有被实例化时被调用,通过 :: 操作符获取,具有全局的静态生命周期;如果方法被声明为static,那么在仿真开始时即会被创建,且可以被多个进程和方法共享;

动态方法的特点:                                                     

如果方法被修饰为 automatic,那么其内部所有的声明的变量默认都是 automatic的;如果被修饰为 automatic,那么在进入该方法后,automatic变量会被创建,而离开该进程/方法后就被销毁;//当不想任务能的变量在仿真一开始就有初值就需要将任务声明为automatic

3.7时间值

time类型的变量不能保存小数时延,因为它们是64比特的整数,所以时延的小数部分会被四舍五入;

real类型的变量可以保存精确的数值

$time的返回值是一个根据所在模块的时间精度要求进行舍入的整数,不带小数部分

$realtime的返回值是一个带小数的完整实数

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值