class,是面向對象編程(object-oriented programming (OOP))的基礎,而OOP可以讓你創建更高抽象級別的驗證環境(如UVM)。
class就是相對于verilog更高級別的抽象,因為verilog太過關注細節,不利于驗證和建模。
隨著SystemVerilog中class的引入,這一切都變了。
class包括變量(類屬性,properties)和子程序(類方法,methods)。
SystemVerilog中的類方法一般就是SystemVerilog task(可能消耗時間)/function(不能消耗時間)。
簡言之,類屬性和類方法定義了這個類有什么以及能夠干什么。
通過類屬性和類方法,我們可以更加容易地創建模塊化的驗證平臺,因為在事務級而不是RTL級別,能夠更容易理解設計和編碼驗證用例。
一般,類中會有一個構造函數(new,我們可以理解為RTL中module的例化,只有調用構造函數后,才真正存在類的實體,在這之前就只是一個文本的定義而已。
在一個類沒有指向任何的對象實體時,Systemverilog的垃圾回收機制會自動地釋放相應的內存空間。
Base Class
基類是類層次結構中最頂層的類,從這個基類可以派生出更加豐富多彩的派生類。
下面是一個基類PCI的例子,類中有command、address,data,CycleType等屬性。此外,這個基類還可以基于這些屬性,做各種各樣的事情,例如命令的發送。
每個設計中PCI總線支持的特性都是不同的,但是作為一個基類,PCI具有一些可以統一封裝在定義中的公共屬性和方法。
module class_TOP( ); class PCI; //Class properties logic [3:0] command; logic [31:0] address; logic [31:0] data; logic [3:0] CycleType; //base class constructor - initialization function new( ); command = 0; address = 0; CycleType = 4'hf; data = 64'bz; $display("PCI Init: data=%h command=%b addr=%h CycleType=%b", data, command, address, CycleType); endfunction task PCIWriteCycle (clk); begin command = $urandom; address = $urandom; CycleType = $urandom; $display("PCI Write Cycle : clk=%b data=%h command=%b addr=%h CycleType=%b", clk, data, command, address, CycleType); end endtask endclass : PCI bit clock; PCI PCI1; //defne variable PCI1 of type PCI initial begin PCI1 = new( ); //instantiate class – allocate memory //PCI1 now holds an object handle. end initial begin clock = 0; forever begin #10; clock=!clock; end end always @(posedge clock) begin //access class property using object handle PCI1 PCI1.data = $urandom; //Call Class method PCIWriteCycle PCI1.PCIWriteCycle(clock); end initial #60 $finish(2); endmodule
1、首先,我們聲明一個名為PCI的類。在這個類中,我們聲明了類屬性:
logic [3:0] command; logic [31:0] address; logic [31:0] data, mem; logic [3:0] CycleType;
2、然后聲明類構造函數new(),用于初始化類屬性。如果不聲明,當類被實例化時會調用隱式的new()函數。
在本例中,函數new()將初始化為類中各個屬性的默認值。2態變量初始化為0,4態變量初始化為x。
function new( ); command = 0; address = 0; CycleType = 4'hf; data = 64'bz; $display("PCI Init: data=%h command=%b addr=%h CycleType=%b", data, command, address, CycleType); endfunction
3、然后定義一個名為PCIWriteCycle的方法,這里是一個systemverilog function。
在這個方法我們我們完成一些類屬性的簡單賦值,從設計的含義上就是隨機發送不同的命令/地址/傳輸類型等信息。
task PCIWriteCycle (clk); begin command = $urandom; address = $urandom; CycleType = $urandom; $display("PCI Write Cycle : clk=%b data=%h command=%b addr=%h CycleType=%b", clk, data, command, address, CycleType); end endtask
4、在類定義之后,我們繼續聲明一個類的對象并示例化。注意:只有在調用new()之后才分配了實際的內存,PCI1(對象)就是一個指向這個內存空間的指針(或者是句柄,handle)。
而如果不示例化,變量PCI1就是一個空指針“null”。
PCI PCI1; //defne variable PCI1 of type PCI PCI1 = new( ); //instantiate class – allocate memory
5、然后,我們使用對象句柄PCI1去調用類的方法PCIWriteCycle。
always @(posedge clock) begin //access class property using object handle PCI1 PCI1.data = $urandom; //Call Class method PCIWriteCycle PCI1.PCIWriteCycle(clock); end
仿真log:
PCI Init: data=zzzzzzzz command=0000 addr=00000000 CycleType=1111 PCI Write Cycle : clk=1 data=12153524 command=0001 addr=8484d609 CycleType=0011 PCI Write Cycle : clk=1 data=06b97b0d command=1101 addr=b2c28465 CycleType=0010 PCI Write Cycle : clk=1 data=00f3e301 command=1101 addr=3b23f176 CycleType=1101 $fnish called from fle "testbench.sv", line 52. $fnish at simulation time 60 V C S S i m u l a t i o n R e p o r t
審核編輯:劉清
-
UVM
+關注
關注
0文章
182瀏覽量
19206 -
OOP
+關注
關注
0文章
14瀏覽量
8804 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8288
原文標題:SystemVerilog中class的基本概念
文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論