SV의 OOP 기초 지식
8239 단어 SV 구문
객체 선언 및 전송
Transaction t1 t2 ;
t1= new();
t2=t1;
t1=new();
성명 손잡이: 어떤 대상을 가리키는 손잡이 t1, t2를 설명한다.창설 대상: 구조 함수 new는 대상에게 공간을 분배하고 주소를 t1이라는 핸들에 저장합니다.전달 대상: t1 손잡이의 대상도 t2에게 전달한다. 이때 t1과 t2는 같은 대상을 가리킨다.새 대상 만들기: 이 때 t1은 새 대상을 가리키고 t2는 옛 대상을 가리킨다.
전용 용어
OOP의 변수를 속성property OOP의task 또는function이라고 부르는 방법method 서브루틴의 원형prototype은 매개 변수의 목록과 되돌아오는 유형(존재하면)을 가리키는 첫 번째 줄입니다
데이터 형식
SV에서 클래스는 프로그램,module,package에 정의할 수 있지만, 일반적인 클래스나 몇 개의 관련 클래스는 한 파일에 단독으로 작성됩니다.최종적으로 프로그램에서 호출됩니다.그리고 SV에서는 local/protected로 표시되지 않는 한 모든 구성원이 기본적으로public 형식입니다.실제로 SV 클래스의 변수는 가능한 한 퍼블릭과 rand로 제어성을 높여야 한다.local/protected는property와method에 대해 설명할 수 있습니다.local은 member가 이class의 대상만 볼 수 있고 extend에서 나온subclass도 볼 수 없습니다.그러나 이class에서non-local의method는local의method나property를 호출하고 inherit 이후의method도 정상적으로 실행할 수 있다.보호ted는 member가 이class와 그subclass를 모두 볼 수 있음을 나타낸다.외부의 큰 환경을 볼 수 없다.
정적 변수
하나의 클래스의 정적 변수는 이 클래스의 모든 실례에 의해 공유될 수 있으며, 그 사용 범위는 이 클래스에만 한정된다.
정적 방법
정적 방법은 정적 변수에 대한 조작에 쓰이죠.클래스는 임의의 예시가 없어도 정적 방법을 직접 호출할 수 있다.
클래스 방법 / 클래스, 하위 프로그램 클래스의 정의
저장 방식-정적 저장과 동적 저장
정적 저장소: 작업 중의 모든 국부 변수가'정적 변수'로 변한 것과 같다. 이때 테스트 프로그램의 여러 곳에서 같은 작업을 호출하면 국부 변수는 공유된 정적 저장소로 이동하기 때문에 서로 다른 라인에서 이런 국부 변수를 직렬적으로 사용한다.어떤 의미에서 국부 변수는 '정적 변수' 가 됩니다. 작업, 함수, 모듈을 지정하여 자동 저장을 사용할 수 있으며, 모방기가 창고 구역에서 국부 변수를 저장하도록 할 수 있습니다. (즉 automatic을 사용합니다.)SV에서module와 프로그램 블록은 기본적으로 정적 저장소를 사용하지만 클래스와 정반대이며 클래스의 저장소 방식은 자동화입니다.이것 또한 유형이 바로 복용의 목적을 위해 사용하는 포장 방법을 나타낸다.module와 프로그램은 복용을 위한 목적이 아니다. 만약에 필요하다면 프로그램에 여러 라인이 있고 여러 라인에서 변수를 공유할 때 이때 자동화기를 추가하여 변수를 창고에 넣고 충돌하지 않도록 해야 한다.
겉치레
클래스의 함수는virtual형으로 표시되어 필요할 때(대부분 계승할 때) 다시 정의할 수 있습니다.
다태
다중성 (polymorphisn) 은 부모 대상을 하나 이상의 자식 대상과 같은 기술로 설정할 수 있도록 하는 기술로, 값을 부여하면 부모 대상은 현재 값을 부여한 자식 대상의 특성에 따라 다른 방식으로 작동할 수 있다.간단하게 말하자면, 하위 클래스의 바늘을 부모 클래스의 바늘에 값을 부여할 수 있다.
다태적 통속적 해석 1
**C++ 중의 허함수의 역할은 주로 다태적 메커니즘을 실현하는 것이다.다태에 관해서는 간단하게 말하면 부류의 다른 지침으로 부류의 실례를 가리키고 부류의 지침을 통해 실제 부류의 구성원 함수를 호출하는 것이다.이런 기술은 부류의 지침을'다양한 형태'를 가지게 할 수 있다.**
다태적 통속적 해석 2
며칠 전에 인터넷에서 이러한 문제를 보았다. 다태적 현재의 일반적인 용법은 부류의 바늘로 부류에서 다시 쓰는 방법을 호출하는 것이다.그런데 왜 그랬는지 모르겠어요. 우리는 하위 클래스에 같은 이름의 구성원 함수를 써서 상위 클래스의 함수를 숨기면 되지 않을까요?그리고 어떤 사람은 이렇게 대답했다. 부류를 컴퓨터의 외부 인터페이스에 비유하고 부류를 외부 장치에 비유했다. 현재 나는 이동 하드디스크, U디스크와 MP3를 가지고 있는데 그들 3개는 모두 저장할 수 있지만 각각 다르다.만약 내가 드라이브를 쓸 때, 나는 부류로 외부 인터페이스를 표시한 다음, 부류에서 부류가 읽는 장치의 허 함수를 다시 쓴다면, 이렇게 컴퓨터의 외부 인터페이스는 하나만 있으면 된다.만약 내가 이렇게 하지 않고 모든 하위 클래스로 외부 인터페이스를 표시한다면, 내 컴퓨터는 이동 하드디스크, U디스크, MP3를 각각 읽을 수 있는 3개의 인터페이스가 있어야 한다.만약 이후에 내가 SD카드 리더가 있다면, 나는 컴퓨터를 뜯어서 SD카드 리더의 인터페이스를 용접해야 하지 않겠는가?
다태적 실현 방법
멀티태스킹을 실현하는 데는 두 가지 방식이 있다. 덮어쓰기, 재부팅-목록 내용 - 덮어쓰기는 하위 클래스가 부모 클래스의 허함수를 다시 정의하는 방법입니다 -다시 불러오는 것은 여러 개의 같은 이름의 함수가 존재할 수 있도록 허용하는 것을 말한다. 이 함수의 매개 변수 테이블이 다르거나 (매개 변수의 개수가 다르거나, 매개 변수의 유형이 다르거나, 둘 다 다를 수도 있다.)
사실 리셋의 개념은'대상 프로그래밍'에 속하지 않는다. 리셋의 실현은 컴파일러가 함수에 따라 서로 다른 매개 변수표에 따라 동명 함수의 이름을 수식한 다음에 이런 동명 함수는 서로 다른 함수가 된다는 것이다(적어도 컴파일러에게는 이렇다).예를 들어 같은 이름의 함수 두 개가 있습니다: function func (p: integer): integer.및 function func(p:string): integer;.그러면 컴파일러가 수식한 함수의 이름은 다음과 같을 수 있습니다: intfunc、str_func.이 두 함수의 호출은 컴파일러 사이에서 정적 (기억: 정적) 으로 확정되었다.즉, 그들의 주소는 컴파일링 기간에 귀속되어 있기 때문에 재부팅은 다중과 무관합니다!진정으로 다태와 관련된 것은 '덮어쓰기' 다.하위 클래스가 하위 클래스의 허 함수를 다시 정의한 후, 하위 클래스 포인터는 부여된 다른 하위 클래스 포인터에 따라 동적입니다. (기억하십시오: 동적입니다!)의 호출은 하위 클래스에 속하는 이 함수입니다. 이러한 함수 호출은 컴파일하는 동안 확정할 수 없습니다. (호출된 하위 클래스의 허함수 주소는 제공할 수 없습니다.)따라서 이러한 함수 주소는 운행기에 귀속되어 있다.결론은 재부팅은 언어 특성일 뿐 다태와는 상관없고 대상을 향한 것도 상관없다는 것이다!Bruce Eckel의 말을 인용하여 "멍청하게 굴지 마라. 만약 그것이 만방정이 아니라면, 그것은 다태적이지 않다."라고 했다.그렇다면 다태적 역할은 무엇일까?우리는 봉인이 세부 사항을 숨기고 코드를 모듈화할 수 있다는 것을 안다.존재하는 코드 모듈(클래스)을 확장할 수 있음;그것들의 목적은 모두 코드를 다시 사용하기 위해서이다.다태는 또 다른 목적인 인터페이스 재사용을 실현하기 위한 것이다!다태적 역할은 클래스가 계승과 파생할 때'가보'에서 특정한 실례의 특정한 속성을 사용할 때 정확하게 호출하도록 하는 것이다.다시 불러오기: 컴파일기 다중 확인: 실행기 확인 (늦게 귀속)
청사진 모드
청사진 모드란 발생기를 생성기와 드라이브로 나누는 것이 시작이다.(sequencer와driver로도 이해할 수 있다).이렇게 되면우리는 구동 부분을 잘 쓰면 움직이지 않아도 된다.다시 수정할 때, 생성된trans만 수정하면 됩니다
BluePrint pattern:
。
Transaction , Transaction , Transaction ,
Test , Generator Transaction。
UVM sequencer sequence 。
class Environment;
Generator gen;
Driver drv;
mailbox gen2drv;
function void build; //new ,mailbox, drv, gen
task run();
task wrap_up() ;
endclass
---------------------------------------------
class Generator;
mailbox gen2drv;
Transaction tr;
function new (input mailbox gen2drv)
this.gen2drv = gen2drv;
tr = new();
endfunction
task run;
Transaction tr1;
forever begin
assert(tr.randomize() );
tr1 = tr.copy(); //copy driver
gen2drv.put (tr1);
end
endtask
endclass
-----------------------------------------------------
program automatic test;
Environment env;
initial begin
env = new();
env.build(); //new
begin
BadTr bad = new();
env.gen.tr = bad; // ,Transaction 。
end
env.run();
env.wrap_up();
end
endprogram