在 SV中关于new函数 的一个问题
在我们定义了一个类之后 例如 classPacket ,如果要用它,需要声明一个句柄Packetpkt并用new函数分配 内存地址 。
这个new函数本身系统提供了一个,但是有时候,我看例子都会自己定义一个new函数 。 function new ( Arg1 ,Arg2)
什么时候需要自己去定义一个new函数不用系统提供的呢 ?
多谢了
以下是个人观念:
很多例子上都在例子里面做一些初始化的赋值操作,其实这些操作不会必须在new里面做的,当时有些操作必须在new里做:
(1)子类的new需要重写,至少需要一句super.new(...)
(2)需要更新某些static属性的标识符,如object_id,你可能需要在重写new(...),比如
class ....
staticint id = 0 ;
intthis_inst_id ;
functon new(...)
this_inst_id = id++ ;
....
endfunction:new
.......
endclass
个人观点,仅供参考....
而且你说的一句话也很到位:new是用来分配内存的。
你既然理解了这点,我想其他的都很好理解!
new除了为你定义的object分配空间外,你还可以把一些你想在初始化时做的放进去,由你具体的应用决定。比如连接interface,给一些变量赋值!
多谢楼上两位,收获不少 。在设计的时候,你的每一个 module ,最终都会映射到逻辑器件上的一些门上 。
在仿真的时候,每一个class都需要在计算机里面进行编译,需要一定的内存空间来处理这块class,如果有很多class并行执行,是不是每一个class需要分配不同的内存空间?如果默认的new函数的话,内存的地址是一样的?
1、再次强调:不是所有的初始化不是必须放在new里的,实际上大多数初始化都可以写成set_*函数,我个人更喜欢这样做,包括设置interface。
2、module在仿真的时候也是一块内存区,所谓映射到门是你自己想的,比如与门,在仿真的时候计算机也不过是按照verilog的四值逻辑表做一个&操作,但是有一点就是module是静态驻留在内存中,也就是在仿真的时候它一直存在同样的一片地址中....
3、接着2的说class,仿真的时候也是一块内存区,但是它是动态的,也就是说它可能在整个仿真的时刻一直存在于同样的一块地址中(比如你的transactor一般来属于这种),有些class则是在仿真过程中的一段时间内是存在的,之后就消失了(也就是那块内存回收了,对jave和systemverilog来说这个操作是透明的),之后可能又重新生成了(比如你的transaction一般来说属于这种);
理解了这两点,你上面的问题也该不是问题.........
Systemverilog的内存空间的创建、管理和回收是用EDA工具实现的,用户无需关注。
每一个class都有一个默认的new()函数,但函数内没有内容;如果用户需要在new()函数中增加内容(如参数或执行代码),则可以重新定义new()函数。
多谢各位,身边没有人帮助,还好有网络的帮助