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 控制代碼 指向物件的指標。要...