SV理论知识二:过程语句和子程序

1. function和task的区别?
   (1) 函数能调用另一个函数,但不能调用任务,任务能调用另一个任务,也能调用另一个函数
   (2) 函数总是在仿真时刻0就开始执行,任务可以在非零时刻执行
   (3) 函数一定不能包含任何延迟、事件或者时序控制声明语句,任务可以包含延迟、事件或者时序控制声明语句
   (4) 函数至少有一个输入变量,任务可以没有或者多个输入(input)、输出(output)和双向(inout)变量
   (5) 函数只能返回一个值,函数不能有输出(output)或者双向(inout)变量,任务不返回任何值,任务可以通过输出(output)或者双向(inout)变量传递多个值

2. task中如何返回一个数组?
   (1) 定义一个数组类型的变量,当作output/inout参数的类型 
   (2) 将参数方向定义为ref
   (3) 将数组包含在类中

3. ref和output有何区别?
   output类型的参数在进去子程序时,会将变量值复制一份,执行完毕后返回,因此返回的是对复制后的变量进行操作的;
   而ref是直接对原变量进行引用,类似于直接拿到句柄,因此对ref进行修饰的变量进行的任何修改都会改变原来的变量值

4. 静态变量与动态变量/全局变量与局部变量
   在SV中,将数据的生命周期分为动态(automatic)和静态(static)。
   (1) 动态变量
       1)动态变量的生命周期同其所在域共存亡,如function/task中的临时变量,在其方法调用结束后,临时变量的生命也将终结,所以它们是动态生命周期。
       2)如果数据变量被声明为automatic,那么在进入该进程/方法后,automatic变量会被创建,而在离开该进程/方法后,automatic变量会被销毁。
       3)class中成员和方法默认为automatic
   (2) 全局变量
       1)伴随着程序开始执行到结束一直存在,它们是静态生命周期。
       2)static变量在仿真开始时就会被创建,自身不会被销毁,可以被多个进程/方法共享。
       3)在硬件世界中,例如module/program/interface/package模块中的变量默认是静态类型的,begin...end、fork...join以及非动态的任务和函数中,缺省时为静态变量
   (3) 静态方法的特点:
       如果方法被static修饰,那么其内部所有的声明的变量都是 static 的;
       静态方法可以在类没有被实例化时被调用,通过 :: 操作符获取,具有全局的静态生命周期(注意在静态方法中不能使用动态的变量,因为静态方法在没有实例化时就能使用);
       如果方法被声明为static,那么在仿真开始时即会被创建,且可以被多个进程和方法共享;
   (4) 动态方法的特点:
       如果方法被修饰为 automatic,那么其内部所有的声明的变量默认都是 automatic的;
       如果被修饰为 automatic,那么在进入该方法后,automatic变量会被创建,而离开该进程/方法后就被销毁;
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值