terminology
class(類,藍圖) -> object(物件,表示具體的物件) -> handle(控制代碼,指向物件的指標/位址)-> properties(屬性,類當中定義的變數)-> methods(方法,控制屬性的方法)
sv當中盡量不要寫always,而是用task和function處理任務的過程(偏軟體思維)
oop的三大特點:封裝、繼承、多型
語法
class bustran;
bit[31:0] addr,crc,data[8];//data是8x32的陣列
function calc_crc;
crc = addr^data.xor;
endfunction:calc_crc
function display;
$display("bustran:%h",addr);
endfunction:display
endclass:bustran //最後的名字可以不寫
bustran b;
b = new();
new有三個作用:1.在記憶體中分配空間給b,2.給b當中的變數賦初值,(二太賦0,四態賦x),3.返回儲存了物件的位址
***也可以自己編寫乙個針對物件初始化的new函式。
***若對同乙個object進行new,則新new的空間賦給object後原來的空間被釋放,new的時候要確定object確實需要乙個新的空間。
b = null;
使用null關鍵字可以手動釋放空間
b.addr = 32'h42; //給b當中的變數賦值
b.display(); //呼叫b中的函式
變數
handles
b2 = new b1 ;
語句屬於淺拷貝,只能拷貝class本身含有的屬性,但是class中巢狀的class只能複製其指標,因此兩個b模組(b1和b2)指向的是同乙個指標,也就是同乙個a模組。
關鍵字:extends
在類之間共享**的方式:1.例化另乙個類 2.繼承另乙個類
繼承能夠增加額外的properties和methods,因此能夠讓**具有很高的復用性。
class transaction;
bit [31:0] src,dst,data[1024],crc;
endclass
class badtr extends transaction;
bit bad_crc;
endclass
badtr bt;
bt = new;
bt.src = 42;
bt.bad_crc = 1;
可以看到在上面的例子中badtr繼承了transaction,transaction所有的屬性都能夠在badtr中看到。
除此之外還能修改原來的method,關鍵字:super
class transaction
bit [31:0] src,dst,data[1024],crc;
function void calc_crc();
crc = src^dst^data.xor;
endfunction
endclass
class badtr extends transaction;
rand bit bad_crc;
function void calc_crc();
super.calc_crc();
if(bad_crc) crc = ~crc;
endfunction
endclass
可以看到在用super呼叫了父類的函式之後,又新增了新的語句來修改crc的演算法。 第八單元總結
第八單元總結 一.系統服務的控制 1.systemd 系統初始化程式,系統開始的第乙個程序,pid為1 2.systemctl 命令 systemctl list units 列出當前系統服務的狀態 systemctl list unit files 列出服務的開機狀態 systemctl stat...
第八講作業
控制姓名長度為6 20 號碼長度11 性別只能允許輸入男或女 每一樣資訊不允許為空 coding utf 8 global gender global judge global slect global tel global name defmenu global slect print 名片 功能...
回歸第八題
無向圖縮點,不知道為啥我寫tarjan就是過不了 注意最後一定要把縮點後的大小按照從大到小開始刪邊 比如說你刪4條,在乙個環中可以另外得到3個分量,但是如果放在兩個環裡面分別為刪兩邊,則總和只能得到2個分量 我的 只能過80的點 我真的盡力了,現在晚上1.55我困得喲死 includeusing n...