在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3999|回复: 9

[求助] sv 中类和对象的使用疑问

[复制链接]
发表于 2015-7-24 16:27:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 似水如烟 于 2015-7-24 16:29 编辑

program p;
class c0;
  ...
endclass

class c1 extends c0;
  ...

  c1 c11;                     //Line1
  c1 c12;                     //Line2

  ...
endclass


c1 c13, c14;

initial begin
   c13 = new;   c14 = new;
   c13.c11 = c14;                                                    //Line3
   ...
end

endprogram


//-------------------------------------------------------------------------------
Line1和Line2的用法算是什么用法?
Line3又会如何执行?




发表于 2015-7-24 17:01:33 | 显示全部楼层
class组合用法。
引用赋值
发表于 2015-7-28 09:56:49 | 显示全部楼层
回复 1# 似水如烟


   绑定
 楼主| 发表于 2015-7-30 11:21:27 | 显示全部楼层
回复 2# A1985


搞明白了。应该是因为sv中没有构造函数,所以Line1和Line2相当于定义了NULL的指针/句柄(此处不知用哪个名词,大概就是这种意思吧),
Line3是将创建的对象赋给c11(理解的是:等号左右两边的的类型一致)

讨论:
Line1和Line2两句放到class定义的外部,应该也是一样的。
发表于 2015-7-30 15:23:26 | 显示全部楼层
1、sv中是有构造函数的,就是new函数,line1与2只是定义了1个句柄,没有进行实例化(newc操作),所以不能使用,否则会报null objection(空对象)。
2、line3是1个句柄拷贝操作,这样c13.c11指向了c14的内存空间。

3、放在外面定义与里面定义是不同的,不清楚目前这么用的场景,但是有点复杂,为什么相同的对象要嵌套?
 楼主| 发表于 2015-8-3 09:22:56 | 显示全部楼层
回复 5# qyxu1979

我说的sv没有构造函数是指不像C++那样有同名构造函数,而且sv中new(),我更多的是把他当作一种类似initial的初始化,只要是实现对mailbox、virtual interface等的初始化(再说new()对sv来说其实并不是必须的)。
这个例子是vcs安装目录中自带例子中用到的,从文件名以及里面定义类名来看,应该是跟Blueprint有关。限于经验和理论的匮乏,声明在类中和类外,体会不到区别在哪儿。


求解释~
发表于 2015-8-3 13:51:39 | 显示全部楼层
我的理解是sv中的new函数等同于c++的构造函数(sv中的类构造器),并且是必须的。initial只是其功能之一,还有对象实例化等其他功能,工厂机制也与new函数有关。

放到类外声明,就与c13或c14是同一层次的,line3的写法就不对了,c13类中根本找不到c11
 楼主| 发表于 2015-8-3 15:01:30 | 显示全部楼层
本帖最后由 似水如烟 于 2015-8-3 15:02 编辑

回复 7# qyxu1979

new()必须不必须这个问题先不讨论。就说Line1和Line2放到类外进行声明,Line3语句在写法上肯定是要改变的。

program p;
class c0;
  ...
endclass

class c1 extends c0;
  ...

//  c1 c11;                     //Line1
//  c1 c12;                     //Line2

  ...
endclass

c1 c11;                     //Line1
c1 c12;                     //Line2

c1 c13, c14;

initial begin
   c13 = new;   c14 = new;
//   c13.c11 = c14;                                                    //Line3

c11 = c14;                                               //Line3
   ...
end

endprogram  

黑色注释的语句执行结果和采用红色注释语句执行的结果是一样的。(试验过的)
那在Line1和Line2在类中声明,只是一种纯粹的用法呢还是有什么特殊的作用,这点不太明白。毕竟这种用法在C++中应该是禁止的。
发表于 2015-8-3 17:36:29 | 显示全部楼层
首先,两种写法的变量作用域不同,其次,就像我第一次说的,不清楚这么用的场景,但可能存在这样的场景。sv语法很灵活,但每个人理解或语言背景都不一样,导致实现方法不同。
 楼主| 发表于 2015-8-4 10:43:52 | 显示全部楼层
回复 9# qyxu1979

确实,搞不懂对象为什么要嵌套,也许是不同的人理解不一样,只是感觉这应该不算主流写法,只是对出现在vcs自带例子中,想搞清楚。

还是要谢谢你!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 22:23 , Processed in 0.023314 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表