systemverilog学习 ---- class assignment

对象只有在对于一个class句柄使用new方法来可以被创造。

packet	pkt_1;
pkt_1 = new();
packet pkt_2;
pkt_2 = pkt_1;

在上面的代码我们可以看出,只是为句柄pkt_1创建了对象,而pkt_2仅仅只是类packet的一个句柄。随后pkt_1被赋值给pkt_2,由于只有一个对象被创造,因此pkt_1和pkt_2这两个句柄都指向同一个对象。因此两者时相互影响的,一个句柄对对象做出了改动,那么也会影响另一个句柄。如下图所示:
在这里插入图片描述
下面举一个类赋值的例子:

class packet;
    //class properties
    bit [31:0]  addr    ;
    bit [31:0]  data    ;
    bit         write   ;
    string      pkt_type;

    //constructor
    function new();
        addr    =   32'h10      ;
        data    =   32'hFF      ;
        write   =   1           ;
        pkt_type =  "GOOD_PKT"  ;
    endfunction

    //method to display class properties
    function void display();
        $display("---------------------------------------------");
        $display("\t addr = %0d", addr);
        $display("\t data = %0h", data);
        $display("\t write = %0d", write);
        $display("\t pkt_type = %0s", pkt_type);
        $display("---------------------------------------------");
    endfunction
endclass

module class_assignment;
    packet  pkt_1 ;
    packet  pkt_2 ;

    initial begin
        pkt_1 = new();
        $display("\t***  calling pkt_1 display  ***");
        pkt_1.display();
        //assign pkt_1 to pkt_2
        pkt_2 = pkt_1;
        $display("\t***  calling pkt_2 displlay  ***");
        pkt_2.display();
        //changing value with pkt_2 handle
        pkt_2.addr = 32'hAB;
        pkt_2.pkt_type = "BAD_PKT";

        //changes made with pkt_2 handle will reflect on pkt_1
        $display("\t***  calling pkt_1 display  ***");
        pkt_1.display();
    end

endmodule

输出结果是:
在这里插入图片描述
由这个例子可以看出通过句柄pkt_2对对象的改动的影响可以同步到pkt_1加载的对象上。

shallow copy 浅拷贝

上例子的赋值并没有创造出新的存储空间,而浅拷贝可以重新分配新的存储空间,一个例子如下:

packet pkt_1;
pkt_1 = new();
packet pkt_2;
pkt_2 = new pkt_1;

浅拷贝可以分配存储空间,并且拷贝变量的值,并且可以返回这块memory的句柄。但是需要注意的时不会赋值对象,只是赋值句柄。
在这里插入图片描述
但是这样又存在一个问题,但一个类的实例作为另一个类的成员时,就会出现不足。在下面的例子中,类packet又一个address_range的实例ad_r。对于pkt_1 new之后,就会分配addr,data和一个句柄的内存空间。但是当使用浅拷贝时,pkt_2的句柄只会单纯的拷贝句柄值,但是pkt_2的成员ad_r仍然指向原来pkt_1中的成员ad_r指向的内存空间,因此这样就会相互影响。
在这里插入图片描述

// --- class ----
class address_range;
    bit [31:0]  start_address   ;
    bit [31:0]  end_address     ;
    function new();
        this.start_address = 10;
        this.end_address = 50;
    endfunction
endclass

//--- class ---
class packet;
    //class properties
    bit [31:0]  addr    ;
    bit [31:0]  data    ;
    address_range ar    ;           //class handle

    //constructor
    function new();
        addr    =   32'h10  ;
        data    =   32'hFF  ;
        ar      =   new()   ;       //creating object
    endfunction
    //method to display class properties
    function void display();
        $display("---------------------------------------------------");
        $display("\t addr   =   %0h", addr);
        $display("\t data   =   %0h", data);
        $display("\t start_address  =   %0d", ar.start_address);
        $display("\t end_address    =   %0d", ar.end_address);
        $display("---------------------------------------------------");
    endfunction
endclass

//--- module ---
module class_assignment;
    packet  pkt_1   ;
    packet  pkt_2   ;

    initial begin
        pkt_1 = new();              //creating pkt_1 object
        $display("\t *** calling pkt_1 display ***");
        pkt_1.display();

        pkt_2 = new pkt_1;          //creating pkt_2 object and coping pkt_1 to pkt_2
        $display("\t *** calling pkt_2 display ***");
        pkt_2.display();

        //changing values with pkt_2 handle
        pkt_2.addr = 32'h68;
        pkt_2.ar.start_address = 60;
        pkt_2.ar.end_address = 80;
        $display("\t *** calling pkt_1 display after changing pkt_2 properties ***");

        //changing made to pkt_2.ar properties reflected on pkt_1.ar,so only handle of the object get copied, this is called shallowed copy
        pkt_1.display();
        $display("\t *** calling pkt_2 display after changing pkt_2 properties ***");
        pkt_2.display();
    end
endmodule

其输出结果是:
在这里插入图片描述

深拷贝

systemverilog的深拷贝拷贝它所有的类成员和嵌套拷贝,浅拷贝只是拷贝句柄。为了实现这样的机制,需要用户自己增加自定义方法,编译器没这么智能。下图,类address_range定义了返回句柄的方法copy,他会创建新的存储区域,并把指针返回。类packet定义了拷贝方法copy,该方法创建新的packet实例,并把调用实例的addr和data值赋给copy的addr和data,同时调用addr_range的copy方法,从而新建存储区域。

在这里插入图片描述
其描述代码如下:

//-- class ---
class address_range;
  bit [31:0] start_address;
  bit [31:0] end_address  ;
 
  function new();
    start_address = 10;
    end_address   = 50;
  endfunction
  //copy method
  function address_range copy;
    copy = new();
    copy.start_address = this.start_address;
    copy.end_address   = this.end_address;
    return copy;
  endfunction
endclass
 
//-- class ---  
class packet;
  //class properties
  bit [31:0] addr;
  bit [31:0] data;
  address_range ar; //class handle
 
  //constructor
  function new();
    addr  = 32'h10;
    data  = 32'hFF;
    ar = new(); //creating object
  endfunction
 
  //method to display class prperties
  function void display();
    $display("---------------------------------------------------------");
    $display("\t addr  = %0h",addr);
    $display("\t data  = %0h",data);
    $display("\t start_address  = %0d",ar.start_address);
    $display("\t end_address  = %0d",ar.end_address);
    $display("---------------------------------------------------------");
  endfunction
 
  //copy method
  function packet copy();
    copy = new();
    copy.addr = this.addr;
    copy.data = this.data;
    copy.ar   = ar.copy;//calling copy function of tr
    return copy;
  endfunction
endclass
 
// -- module ---
module class_assignment;
  packet pkt_1;
  packet pkt_2;
  initial begin
    pkt_1 = new();   //creating pkt_1 object
    $display("\t****  calling pkt_1 display  ****");
    pkt_1.display();
    pkt_2 = new();   //creating pkt_2 object
    $display("\t****  calling pkt_2 display  ****");
    pkt_2.display();
    pkt_2 = pkt_1.copy(); //calling copy method
    //changing values with pkt_2 handle
    pkt_2.addr = 32'h68;
    pkt_2.ar.start_address = 60;
    pkt_2.ar.end_address = 80;
    $display("\t****  calling pkt_1 display after changing pkt_2 properties ****");
    pkt_1.display();
    $display("\t****  calling pkt_2 display after changing pkt_2 properties ****");
    pkt_2.display();
  end
endmodule

其输出结果为:

**** calling pkt_1 display ****
---------------------------------------------------------
addr = 10
data = ff
start_address = 10
end_address = 50
---------------------------------------------------------
**** calling pkt_2 display ****
---------------------------------------------------------
addr = 10
data = ff
start_address = 10
end_address = 50
---------------------------------------------------------
**** calling pkt_1 display after changing pkt_2 properties ****
---------------------------------------------------------
addr = 10
data = ff
start_address = 10
end_address = 50
---------------------------------------------------------
**** calling pkt_2 display after changing pkt_2 properties ****
---------------------------------------------------------
addr = 68
data = ff
start_address = 60
end_address = 80
---------------------------------------------------------
### 回答1: SystemVerilog讲座-PDF教程是一本关于Verilog和SystemVerilog语言的详细介绍和使用手册。该教程适合想要学习Verilog和SystemVerilog语言的初学者和工程师。 该教程覆盖了Verilog和SystemVerilog语言的基础知识,包括数据类型和运算符、模块和端口、决策和循环语句、函数和任务、时序建模、测试和调试等。此外,该教程还介绍了使用SystemVerilog进行OVM/UVM验证和设计模式。 该教程包含了大量的示例程序和练习题,帮助读者深入理解Verilog和SystemVerilog语言的使用和应用。通过学习该教程,读者可以掌握系统级设计和验证流程,并在工作中使用SystemVerilog语言进行设计和验证。 值得注意的是,学习Verilog和SystemVerilog语言需要具备一定的数字电路设计和计算机编程基础。因此,初学者可以先学习电路设计和计算机编程基础,再进一步学习Verilog和SystemVerilog语言。 ### 回答2: SystemVerilog是基于Verilog的扩展语言,它是一种高级硬件描述语言,具有强大的设计与验证功能。SystemVerilog极大地拓展了Verilog的能力,增强了硬件设计的复杂性,使得对于SystemVerilog熟练掌握的工程师来说,能够更快速、更有效地完成硬件的设计与验证工作。 针对学习SystemVerilog的人们,提供了一些SystemVerilog讲座和PDF教程,这些资源非常有用。讲座中的专家们详细介绍了SystemVerilog的特性和用法,通过讲解实例,让学习者深入了解SystemVerilog的基本结构、体系架构、语法等方方面面。而PDF教程则提供了更加系统化、深入的学习材料,非常适合有一定编程基础的学习者使用。 在SystemVerilog讲座和PDF教程的学习中,学习者需要逐步掌握SystemVerilog的语言规则和特性。首先要掌握数据类型、运算符、模块定义、分层设计、控制流等基本概念。通过这些基础的学习和实践,可以逐渐提升自己的编程技能和系统设计能力。 总之,SystemVerilog讲座和PDF教程是学习SystemVerilog的重要资源,对于想要深入了解硬件设计与验证的工程师和学生而言,这些资源将是非常有用的学习资料,也有利于其提升自己的技能和能力,为将来的工作或学习做好准备。 ### 回答3: SystemVerilog讲座-PDF教程是一种与计算机领域相关的教学材料,旨在向学生和专业人士介绍SystemVerilog的基本概念和用法。SystemVerilog是一种现代的硬件描述语言,它在硬件设计领域和系统级开发中得到了广泛应用。 SystemVerilog讲座-PDF教程的内容丰富多样,包括SystemVerilog的基本语法和数据类型、控制流语句、模块化设计、仿真和调试等方面的内容。通过这些学习材料的使用,学生可以掌握SystemVerilog的核心概念,不仅能够编写规范的硬件描述代码,同时也能够使用SystemVerilog实现复杂的硬件系统。 SystemVerilog讲座-PDF教程还提供了大量的实例和案例,帮助学生更好地理解SystemVerilog的各种应用场景。此外,在教程中还提供了大量的练习题,帮助学生巩固自己的学习成果。 总之,SystemVerilog讲座-PDF教程是一种非常实用的教学资源,它为学生和专业人士提供了非常有价值的SystemVerilog学习资料,帮助大家快速掌握这种重要的硬件描述语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值