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方法中;