sv 中类和对象的使用疑问
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又会如何执行?
class组合用法。
引用赋值
绑定
搞明白了。应该是因为sv中没有构造函数,所以Line1和Line2相当于定义了NULL的指针/句柄(此处不知用哪个名词,大概就是这种意思吧),
Line3是将创建的对象赋给c11(理解的是:等号左右两边的的类型一致)
讨论:
Line1和Line2两句放到class定义的外部,应该也是一样的。
1、sv中是有构造函数的,就是new函数,line1与2只是定义了1个句柄,没有进行实例化(newc操作),所以不能使用,否则会报null objection(空对象)。
2、line3是1个句柄拷贝操作,这样c13.c11指向了c14的内存空间。
3、放在外面定义与里面定义是不同的,不清楚目前这么用的场景,但是有点复杂,为什么相同的对象要嵌套?
我说的sv没有构造函数是指不像C++那样有同名构造函数,而且sv中new(),我更多的是把他当作一种类似initial的初始化,只要是实现对mailbox、virtual interface等的初始化(再说new()对sv来说其实并不是必须的)。
这个例子是vcs安装目录中自带例子中用到的,从文件名以及里面定义类名来看,应该是跟Blueprint有关。限于经验和理论的匮乏,声明在类中和类外,体会不到区别在哪儿。
求解释~
我的理解是sv中的new函数等同于c++的构造函数(sv中的类构造器),并且是必须的。initial只是其功能之一,还有对象实例化等其他功能,工厂机制也与new函数有关。
放到类外声明,就与c13或c14是同一层次的,line3的写法就不对了,c13类中根本找不到c11
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++中应该是禁止的。
首先,两种写法的变量作用域不同,其次,就像我第一次说的,不清楚这么用的场景,但可能存在这样的场景。sv语法很灵活,但每个人理解或语言背景都不一样,导致实现方法不同。
确实,搞不懂对象为什么要嵌套,也许是不同的人理解不一样,只是感觉这应该不算主流写法,只是对出现在vcs自带例子中,想搞清楚。
还是要谢谢你!