개발/SystemVerilog

[SystemVerilog] 클래스 3 다형성

개발과 공부 사이 2022. 1. 24. 13:07

객체지향에서 다형성이란

 

베이스클래스에서 하위 클래스의 속성과 메서드를 직접 사용 할 수 있는것을 의미한다.

 

 

아래와 같은 클래스가 정의되어있다.

class packet;
    bit [31:0] addr;
    
    function new (bit [31:0] addr);
    	this.addr = addr;
    endfunction
    
    task display();
    	$display("[base] addr = 0x%0h", addr);
    endtask
    
endclass


class extpacket extends packet;
    bit [31:0] data;
    
  	function new (bit [31:0] addr, data);
    	super.new(addr);
        this.data = data;
    endfunction
    
    task display();
    	$display("[child] addr = 0x%0h, data = 0x%0h", addr, data);
    endtask
endclass

 

      
module tb;
    packet bc;
    extpacket sc;
    
    initial begin
    	sc = new(32'hfeeed_feed, 32'h1234_5678);
        
        bc = sc;
        bc.display();
        sc.display();
    end

endmodule

sc 핸들을 bc에 넘겨주고 각각 메서드를 실행했다.

똑같은 display() 메서드라도 핸들이 가르키는 오브젝트가 아닌, 핸들 타입에 의해서 메서드가 결정된다.

 

 

 

 

부모클래스 핸들이 자식클래스 오브젝트를 가르키더라고 부모클래스 핸들로 자식클래스의 변수를 직접 접근할 수 없다.

      
module tb;
    packet bc;
    extpacket sc;
    
    initial begin
    	sc = new(32'hfeeed_feed, 32'h1234_5678);
        
        bc = sc;
        $display("data = 0x%0h", bc.data);	// illegal usage
    end

endmodule

실행하면 에러가 발생한다.

 

 

 

부모클래스 핸들을 자식클래스 핸들로 할당하는것도 에러가 발생한다.

      
module tb;
    packet bc;
    extpacket sc;
    
    initial begin
    	bc = new(32'hfeeed_feed);
        sc = bc;
    end

endmodule

 

 

 

 

부모클래스 핸들이 이미 자식클래스를 가르키더라도 부모클래스 핸들을 다시 자식클래스 핸들로 할당하는것은 안된다.

module tb;
    packet bc;
    extpacket sc1, sc2;
    
    initial begin
    	sc1 = new(32'hfeed_feed, 32'hface_cafe);
        bc = sc1;
        sc2 = bc;	// error
    end

endmodule

 

위의 오류를 해결하려면 다이나믹 캐스팅을 써야한다.

module tb;
    packet bc;
    extpacket sc1, sc2;
    
    initial begin
    	sc1 = new(32'hfeed_feed, 32'hface_cafe);
        bc = sc1;
        $cast(sc2, bc);	// dynamic cast
        sc2.display();
    end

endmodule