SystemVerilog里面向对象的基本知识点.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面向对象编程OOP 一、OOP术语 1.class类:包含变量和子程序的基本构建块。 2.对象:类的一个实例。 3.句柄:指向对象的指针,一个OOP句柄就像对象的地址,但是它只能保存在一个只能指向单一类型数据类型的指针中。 4.属性:存贮数据的变量。 5.方法:任务和函数 二、创建新对象 1.区别Verilog和SV: (1)Verilog中的一个模块是在代码编译的时候例化的。SV中是运行测试平台时需要的时候才被建立的。 (2)Verilog的例化是静态的,像硬件一样,只有信号值得变化。SV激励对象不断地被创建并且驱动DUT,最后这些对象所占用的内存可以被释放供新对象使用。 (3)Verilog的顶层模块不会被显示的例化,但是SV类在使用之前必须要先例化。 (4)Verilog实例名只可以指向一个实例。而SV句柄可以指向很多对象,当然一次只能指向一个。 2. 构造函数new():例化一个对象时,相当于为对象申请一个新的内存来保存对象的变量。 不能有返回值,因为其返回的是指向一个类对象的句柄,其类型就是类本身。当出现多个同名的对象时,至于new()调用的是哪个new()函数,这取决于赋值操作符左边的句柄类型 ? ? ? ?Trans ?tr; ? //声明一个句柄,初始化为特殊值null ? ? ? ?tr ?= new(); //为一个Trans对象分配空间,将变量初始化为默认值,二值的为0,四值的为x.并返回保存对象的地址 3.将声明和创建分开:若同时会引起顺序问题。若忘记使用automatic存储空间,构造函数将在开始仿真时,而非进入块的时候调用。 *4.声明一个句柄来创建一个对象,在仿真中一个句柄可以指向多个对象。 ? ? ? ? Trans tr1,tr2;//声明两个句柄 ? ? ? ? tr1=new();// 为第一个类对象分配地址空间 ? ? ? ? tr2=tr1;//复制,指向同一个地址,都指向第一个对象 ? ? ? ? tr1=new();//为第二个Trans对象分配地址 *5.SV中分辨对象不再被引用的方法是记住指向它的句柄的数量,当最后一个句柄不在引用某个对象了,SV就将释放这个对象。 三、静态变量 1.静态变量使用范围只在这个类中。通常在声明时初始化,引用时无需句柄,可以用作用域操作符:: 2.不允许静态方法读写非静态变量 四、类的方法默认为自动存储 五、this是什么?将局部变量赋给类一级变量 ? ? class ?tr; ? ? ? string a; ? ? ? function new(string a); ? ? ? ?this.a=a; ? //类变量a=局部变量a ? ? ? endfunction ? ? endclass 六、在类内使用另一个类:通过指向对象的句柄,一个类内部可以包含另一个类的实例。在调用其他类的成员时要记得例化,否则句柄为null,调用失败,一般在构造函数中实现例化。 七、动态对象:在OOP中可能有很多对象,但是只有少数句柄。句柄可能存储在数组或者队列中 1.将对象传给方法:当调用方法的时候,传递的是对象的句柄而不是对象本身。 2.当调用一个标量变量(存储单个数据,不是数字也不是对象)的方法时并且使用ref关键词,SV传递该标量变量的地址,所以方法可以改变标量变量的值。若不带ref则是把标量变量的值复制到参数变量中,对该参数变量的任何改变不会影响原变量的值。若忘记给参数前加ref则在方法的内部对参数的修改不会被调用该方法的代码看到? *3.方法可以改变一个对象,即使方法的句柄参数没有使用ref关键词。因为方法可以在不改变句柄的情况下,将对象改变。如果不想让对象在被方法调用中改变,那就传递一个对象的拷贝给方法,这样就可以保证原来的对象不变?。下面例子中由于没有对参数进行ref声明,尽管在sss中修改了参数tr,调用块中的句柄t仍是null。 ? ?function void sss(trans tr); ? //应改为(ref trans tr) ? ? ? tr=new(); ? ? ? tr.addr=42; ? ? ? ... ? ?endfuction ? ? ? ? trans ?t; ? ? initial ?begin ? ? ? sss(t);//创建一个trans ? ? ? $display(t.addr);//失败,因为t=null ? ? end 4.句柄数组:保存并且引用多个对象,数组的每一个元素指向一个对象(或者多个对象??),由句柄构成,而不是对象构成,所以需要在使用它们之前创建所有对象。 *5对象的复制:防止对象的方法修改原始对象的值 ? ? ?(1)浅复制(shallow copy)使用new复制一个对象,句柄的复制而不是数据da

文档评论(0)

xiaoluping2000 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档