基于SystemVerilog和基于verilog的驗證平臺有什么不同
SystemVerilog是對于Verilog的擴(kuò)展,但是這種擴(kuò)展幾乎是一個新語言的誕生,因為SystemVerilog增加了對于面向?qū)ο蠹夹g(shù)(Object Orientated
Programming,OOP)的支持從而更加適合于EDA仿真驗證。
SystemVerilog語言增強的關(guān)鍵就是class,基于class構(gòu)建測試平臺更符合當(dāng)今驗證環(huán)境越來越復(fù)雜的現(xiàn)狀。
目前工業(yè)界最通用的UVM就是提供了一些用于創(chuàng)建通用測試平臺的SystemVerilog基類庫,這個基類庫可以在任何支持IEEE 1800標(biāo)準(zhǔn)的仿真器上運行。
class是所需要創(chuàng)建對象的模板,只有在實際創(chuàng)建對象的時候才會占用內(nèi)存,當(dāng)該對象不被使用后就會自動被后臺進(jìn)程回收內(nèi)存。class中定義了成員變量和方法,這個方法可以是不消耗時間的function,也可以是消耗時間的task。
在創(chuàng)建類對象之前,這個類的定義必須要已經(jīng)存在于內(nèi)存當(dāng)中,因此在SystemVerilog測試平臺中需要在module中定義不同驗證組件類,因為module中存在的都是靜態(tài)對象,其在仿真過程中會一直存在。同理,一個class定義中不能包含一個module。因為class是動態(tài)對象,會在仿真過程中被回收。?下面是一個如何在靜態(tài)module中創(chuàng)建對象和回收對象的示例:
一個包含數(shù)據(jù)message和相應(yīng)的函數(shù)的class:
class example;
string message;
function void set_message(string ip_string);
message = ip_string;
endfunction: set_message
function void print();
$display("%s", message);
endfunction: print
endclass: example
在module中仿真開始創(chuàng)建對象和釋放對象內(nèi)存:module tb;
example C; // Null handle after elaboration
initial begin
C = new(); // Handle points to C object in memory
C.set_message("This object has been created");
#10;
C.print();
C = null; // C has been dereferenced, object can be garbage collected
end
endmodule: tb