SystemVerilog中的Virtual總結

2021-10-02 07:26:40 字數 3432 閱讀 7556

virtual inte***ce

隔離抽象模型(class)和實際訊號(port wire reg),可在**過程中動態控制連線訊號。

在class內使用,這樣class的不同例項可連外部不同的inte***ce例項。

inte***ce

sbus; // a ****** bus inte***ce

logic

req, grant;

logic

[7:0] addr, data;

endinte***ce

class

sbustransactor;

virtual

sbus bus;

function new

(virtual

sbus s );

bus = s; // initialize the virtual inte***ce

endfunction

...

endclass

virtual class

模板class,只能被繼承,而不能被例項化

virtual class

basepacket;

...endclass

virtual method

能被子類方法覆蓋的方法(可繼承,可另起爐灶、以下犯上),可只在父類中表明virtual。

如果把乙個class的方法定義為virtual,那麼在進行呼叫的時候,是根據物件的型別,而非控制代碼的型別,如果方法沒有使用virtual進行修飾,則會呼叫控制代碼型別的方法,而非物件型別的方法。這個體現了oop中的多型的特性。

子類控制代碼賦值給父類控制代碼時:當定義了virtual時,在子類中呼叫某function/task,會先查詢在子類中是否定義該function/task,如果沒有定義該function/task,則在父類中查詢。未定義virtual時,只在子類中查詢,沒有定義就是編譯錯誤。

class

basepacket;

int

a = 1;

int

b = 2;

function void

printa;

$display("basepacket::a is %d", a);

endfunction

: printa

virtual function void

printb;

$display("basepacket::b is %d", b);

endfunction

: printb

endclass

: basepacket

class

my_packetextends

basepacket;

int

a = 3;

int

b = 4;

function void

printa;

$display("my_packet::a is %d", a);

endfunction

: printa

virtual function void

printb;

$display("my_packet::b is %d", b);

endfunction

: printb

endclass

: my_packet

basepacket p1 = new;

my_packet p2 = new;

initial begin

p1.printa;   // displays 'basepacket::a is 1'

p1.printb;   // displays 'basepacket::b is 2'

p1 = p2;     // p1 has a handle to a my_packet object

p1.printa;   // displays 'basepacket::a is 1'

p1.printb;   // displays 'my_packet::b is 4' – latest derived method

p2.printa;   // displays 'my_packet::a is 3'

p2.printb;   // displays 'my_packet::b is 4

end

pure virtual method

virtual class中不包含具體實現的virtual method

因為virtual class永遠不會直接例化,所以其method沒實現也沒關係。

但是,在其非virtual子類中必須給出method的實現。如果這樣總給「空頭支票」,例項呼叫該method還有什麼意義呢。

-------------------

virtual class

basepacket;

pure virtual function integer

send(bit

[31:0] data); // no implementation

endclass

class

etherpacketextends

basepacket;

virtual function integer

send(bit

[31:0] data);

// body of the function

...endfunction

endclass

Systemverilog中物件的複製

class transaciton static count 0 int id statics status function new status new id count endfunction endclass transaction src,dst initial begin src new...

systemverilog中關於事件的那些事

說道systemverilog中的執行緒間通訊,不得不說一下事件 event 事件也就兩種 邊沿阻塞 e 和電平阻塞 wait e.triggered 1.事件通過 操作符來觸發事件,通過 或者wait等待事件的觸發。2.相當於verilog中的邊沿觸發,一定要先於 只在觸發的那一瞬間有效 而tri...

SystemVerilog中的型別向下轉換

寫在前面 1 一直以來對這塊理解都不是那麼清楚,只知道個大概,比如只知道 cast做型別向下轉換。今天好好看了下相關的內容,發現自己之前的理解確實有很大的偏差,今天就好好總結下了。2 難得的六一兒童節,祝各位大齡兒童節日快樂。start 1 物件 物件是類的乙個例項。2 控制代碼 指向物件的指標。要...