class,是面向?qū)ο?a href="http://www.cshb120.cn/v/tag/1315/" target="_blank">編程(object-oriented programming (OOP))的基礎(chǔ),而OOP可以讓你創(chuàng)建更高抽象級別的驗證環(huán)境(如UVM)。
class就是相對于verilog更高級別的抽象,因為verilog太過關(guān)注細(xì)節(jié),不利于驗證和建模。
隨著SystemVerilog中class的引入,這一切都變了。
class包括變量(類屬性,properties)和子程序(類方法,methods)。
SystemVerilog中的類方法一般就是SystemVerilog task(可能消耗時間)/function(不能消耗時間)。
簡言之,類屬性和類方法定義了這個類有什么以及能夠干什么。
通過類屬性和類方法,我們可以更加容易地創(chuàng)建模塊化的驗證平臺,因為在事務(wù)級而不是RTL級別,能夠更容易理解設(shè)計和編碼驗證用例。
一般,類中會有一個構(gòu)造函數(shù)(new,我們可以理解為RTL中module的例化,只有調(diào)用構(gòu)造函數(shù)后,才真正存在類的實體,在這之前就只是一個文本的定義而已。
在一個類沒有指向任何的對象實體時,Systemverilog的垃圾回收機(jī)制會自動地釋放相應(yīng)的內(nèi)存空間。
Base Class
基類是類層次結(jié)構(gòu)中最頂層的類,從這個基類可以派生出更加豐富多彩的派生類。
下面是一個基類PCI的例子,類中有command、address,data,CycleType等屬性。此外,這個基類還可以基于這些屬性,做各種各樣的事情,例如命令的發(fā)送。
每個設(shè)計中PCI總線支持的特性都是不同的,但是作為一個基類,PCI具有一些可以統(tǒng)一封裝在定義中的公共屬性和方法。
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、然后聲明類構(gòu)造函數(shù)new(),用于初始化類屬性。如果不聲明,當(dāng)類被實例化時會調(diào)用隱式的new()函數(shù)。
在本例中,函數(shù)new()將初始化為類中各個屬性的默認(rèn)值。2態(tài)變量初始化為0,4態(tài)變量初始化為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。
在這個方法我們我們完成一些類屬性的簡單賦值,從設(shè)計的含義上就是隨機(jī)發(fā)送不同的命令/地址/傳輸類型等信息。
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、在類定義之后,我們繼續(xù)聲明一個類的對象并示例化。注意:只有在調(diào)用new()之后才分配了實際的內(nèi)存,PCI1(對象)就是一個指向這個內(nèi)存空間的指針(或者是句柄,handle)。
而如果不示例化,變量PCI1就是一個空指針“null”。
PCI PCI1; //defne variable PCI1 of type PCI PCI1 = new( ); //instantiate class – allocate memory
5、然后,我們使用對象句柄PCI1去調(diào)用類的方法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
+關(guān)注
關(guān)注
0文章
183瀏覽量
19892 -
OOP
+關(guān)注
關(guān)注
0文章
14瀏覽量
8976 -
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8708
原文標(biāo)題:SystemVerilog中class的基本概念
文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
SystemVerilog中的Virtual Methods
SystemVerilog中的“const”類屬性
更好地理解SystemVerilog的多態(tài)Polymorphism
SystemVerilog的斷言手冊
SystemVerilog中$cast的應(yīng)用
SystemVerilog中可以嵌套的數(shù)據(jù)結(jié)構(gòu)
SystemVerilog中class的基本概念
SystemVerilog中的Semaphores
C++中struct和class的區(qū)別?
Systemverilog里class類型的記錄
Systemverilog中的Driving Strength講解

SystemVerilog中class是什么意思
評論