system verilog中this的使用


this 类似于python class中的self,用于指代对象

 1 class Packet;
 2     logic [15:0] sig1;
 3     logic [15:0] sig2;
 4     logic [15:0] sig3;
 5 
 6     function new(logic [15:0] sig1,logic [15:0] sig2);
 7         this.sig1 = sig1;
 8               sig2 = sig2;
 9     endfunction
10 
11     function void disp(logic [15:0] sig3);
12         sig3=sig3;
13         $display("sig1 is %h",sig1);
14         $display("sig2 is %h",sig2);
15         $display("sig3 is %h",sig3);
16     endfunction
17 
18     function void disp_sig3();
19         $display("in disp_sig3,sig3 is %h",sig3);
20     endfunction
21 endclass
22 
23 module top_tb;
24     Packet pkt;
25 
26     initial begin
27         pkt = new();
28         pkt.disp('hFFFF);
29         pkt.disp_sig3();
30     end
31 endmodule    
1 #simulation result
2 sig1 is 5050
3 sig2 is xxxx
4 sig3 is FFFF
5 in disp_sig3,sig3 is xxxx

示例中,在packet的new函数的形参列表中,使用了跟packet属性相同的名字,在函数体中,通过“this.sig1 = sig1”将形参sig1赋值给了当前对象的“this.sig1”,此时使用this区分了表达式中的形参和对象的成员sig1,最后通过pkt.disp显示当前对象的sig1,此时sig1的值为对象创建时通过形参传入的数据,即’h5050。但是sig2在new函数中,并没有对表达式sig2进行区分,此时赋值表达式左右的sig2都为new函数的局部变量,即形参sig2,因此,此时并没有对对象的sig2进行赋值,所以通过pkt.disp显示的sig2不能获取到new形参中传入的sig2,此时对象的sig2的值就为“XXXX”。Sig3的情况与sig2类似,通过pkt.disp显示的为disp函数体的局部变量而不是对象成员,而pkt.disp_sig3显示的是当前对象的sig3.通过示例我们可以看到,如果形参中存在与类的属性相同的名字是,为了进行区分,在函数体中必须使用this区分形参和对象的属性,否则函数体中为当前函数体的局部变量(形参)。通过上述示例,this指针在SystemVerilog的特点和用处如下:

  • 通过this可以绑定方法和对象;
  • 通过this可以区分方法体的形参和对象的成员;
  • this指针可以作为实参传递,但是不能作为形参使用;
  • this指针在调用方法时开始存在,当方法调用结束时其生命周期也就结束了,这与一般函数的形参生命周期相同;
  • this指针不能用于static方法中;