Systemverilog 第八課 物件導向程式設計

2021-10-08 22:16:14 字數 2292 閱讀 7225

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...