객체 지향 프로그래밍(object-oriented programming, OOP)
객체를 정의하는 템플릿. RTL의 module과 비슷한 역할.
module과의 차이점
class의 member : properties, methods
class packet;
//data properties
bit [3:0] addr;
bit [3:0] data;
//initialization
function new();
addr = 0;
data = 0;
endfunction
//method
function void display();
$display("addr: %0h, data: %0h", addr, data);
endfunction
endclass
object는 class를 instance하여 생성
object의 실제 memory는 new()를 call하는 것으로 할당됨
아래 예시에서 pkt1, pkt2가 object
packet pkt1 = new(); //pkt1 memory할당
packet pkt2;
initial begin
pkt2 = new(); //pkt2 memory할당
end
상위 class의 properties, mothods를 재사용하고 확장할 수 있게 함.
공통된 기능을 하나의 상위 class에 모아 코드의 재사용성을 높임.
class packet_child extends packet;
function void display();
$display("child_packet");
endfunction
endclass
packet packet1 = new(1,2);
packet_child packet2 = new();
packet1.display(); //addr: 1, data:2
packet2.display(); //child_packet
여기서 child_packet은 packet을 상속받아 display를 overide(재정의)
사전적 의미로는 본질적이고 공통적인 것들을 모아 추출한다는 의미.
virtual class를 사용하여 공통 method를 정의하고, 하위 class에서 구현.
상속과 다른점: 상속은 상위 class의 속성과 기능들을 하위 class에서 그대로 사용하거나, overide 가능. but 추상화는 virtual class에 정의된 method의 내용이 반드시 하위 class에 구현되어야 함.
//추상화
//공통 method를 모아 virtual class에 정의하고, 하위 class에서 구현
virtual class packet;
virtual function void display();
endclass
class packet_child1 extends packet;
function void display();
$display("child1);
endfunction
endclass
class packet_child2 extends packet;
function void display();
$display("child2");
endfunction
endclass
어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질을 의미
동일한 interface(method)를 사용하여 서로 다른 class의 객체를 처리
추상화와 함께 쓰이는 경우가 많음
module test;
initial begin
packet mypacket;
//다형성: 하나의 virtual class를 통하여 여러개의 class를 표현할 수 있음.
//기존에는 따로 존재한 packet_child1,2가 packet이라는 하나의 class로 묶였다고 봐도 됨.
mypacket = new packet_child1();
mypacket.display(); //출력:child1
mypacket = new packet_child2();
mypacket.display(); //출력:child2
end
endmodule
class안에 서로 연관있는 속성과 기능들을 하나의 capsule로 만들어 데이터를 외부로부터 보호하는 것.
즉 서로 관련있는 properties와 methods를 한곳에 모아 관리하는 것.
접근 제한자