ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SystemVerilog] 클래스 3 다형성
    개발/SystemVerilog 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

     

Designed by Tistory.