sv编程语言_SV及UVM高级话题篇之一:SystemVerilog开源公共库(上)
伴隨著SV推廣的熱浪,SV已經(jīng)不只是作為一種驗證語言流行開來,實際上它同樣在早期也作為了一種硬件描述語言和一種通用編程語言得到了應(yīng)用。在軟件編程的過程中,SV同Java一般也有了更為豐富的數(shù)據(jù)類型和類的相應(yīng)概念,這種面向?qū)ο缶幊痰乃枷胧沟靡恍┸浖こ處熢凇耙泼瘛钡津炞C領(lǐng)域時的陣痛期并不會太久,但隨后他們會感到一些失望,因為SV盡管有著類Java的編程方式、內(nèi)存管理方式等等,但又缺少一些東西,比如在一些底層數(shù)據(jù)類型操作的函數(shù)在使用起來有點掣肘,下面是一些數(shù)據(jù):
這張表格是對于各個主流編程語言中對于字符串String類型的函數(shù)數(shù)量對比,而更習(xí)慣于軟件編程的用戶(同時精通于Java、Python等)就會對SV目前底層函數(shù)的支持表示不滿。這些軟件用戶們更懷念過去在Java、Python中各種豐富的底層函數(shù)應(yīng)用,而從硬件一側(cè)遷移到SV的新用戶們則有點“劉姥姥進大觀園”,已經(jīng)覺得新添加的特性有點應(yīng)接不暇,夠?qū)W幾輩子的了(比起之前的hdl硬件編程需要的語法來看)。
Python的忠實粉絲都知道Python世界的一句諺語“Batteries included”,這指的是官方發(fā)行的Python版本自帶了相當(dāng)齊全的軟件庫,拿來就可以直接寫程序,一般不需要安裝額外的庫,就同一出生就含著金鑰匙為自己生命代言的天才一樣,做什么都是手到擒來。而SV的用戶,尤其在適應(yīng)了軟件編程思維,同時又熟悉一些其它編程語言特性的時候,就對SV缺少像Python一樣豐富底層函數(shù)的氣質(zhì)頗有微詞了。
所以,那些見識過“好東西”的verifier們就局部地聯(lián)合了起來(公共的驗證開源項目數(shù)量少而死亡率太高),他們首先在自己的公司內(nèi)部按照所處項目的實際要求,試圖在SV基礎(chǔ)上開發(fā)一些擴展地庫,來彌補一些SV應(yīng)該具備的底層庫;同時,在這些庫后來日益完善的基礎(chǔ)上,經(jīng)過公司的同意,他們將這些庫開源了出來,并希望不斷更新(或者被收入SV的標(biāo)準(zhǔn)第三方庫)。我們本節(jié)為大家分享兩個開源質(zhì)量較高且至今保持活力的SV的第三方庫,通過簡明地介紹它們的主要特性,希望讀者們首先知道這些庫提供的基本特性,而在后期項目使用中,如果有需要就可以快速安裝它們,不必再重復(fù)造輪子。同時,我們也希望通過本節(jié),讀者在以后的工作中,可以有目的性地將庫分為公共庫(有更廣的使用潛力)和VIP庫(更有針對性),而將過去那些有收錄進公共庫潛力的方法、類可以整理到一起,相應(yīng)地做好單元測試(庫開發(fā)的標(biāo)準(zhǔn)流程)和文檔,造福公司內(nèi)更多的同事,或者在允許的情況下也開源出來。
SV開源庫之一:svlib
verilog公司開源了他們之前開發(fā)的SV的擴展底層庫svlib,這個庫可以從這個鏈接中找到。另外既然推薦了他們的功德庫svlib,也簡單介紹一下這家公司,作為他們共享svlib的一點回報吧。路桑跟這家公司之前在項目中有過合作,他們是一家“高端”的驗證咨詢公司,可以說里面的接觸到的每一位工程師都很有氣質(zhì)(驗證工程師的軟硬通吃的氣質(zhì)),而且個個以一當(dāng)十。截止到目前他們在中國還沒有直接的業(yè)務(wù),但如果接下來他們進入中國尋求業(yè)務(wù)而且在招聘質(zhì)量不打折的前提下,這是一家提供良好咨詢服務(wù)平臺的公司。好了,這一段軟廣告就嵌入到這里吧。
www.verilab.com/resources
svlib分成了若干個分支,不同分支具備相應(yīng)的功能,這些可以拆解和獨立開發(fā)的功能包括有:通用的字符串處理和正則表達式功能。
可以對文件和目錄操作的功能,包括目錄查找、列表、文件屬性征詢的功能。
可以同操作系統(tǒng)互動的功能,包括有查找環(huán)境變量、傳入命令行、時鐘日期信息查詢等功能。
各種其它方便的功能,例如與枚舉類型相關(guān)的函數(shù)操作。
成套的插件用來從.ini或者YAML配置文件讀入,繼而存儲為配置數(shù)據(jù)格式DOM;或者反之,從DOM格式,存為.ini或者YAML標(biāo)準(zhǔn)格式。
另外,svlib也有類似uvm_macros.svh的宏文件svlib_macros.svh,該文件也定義了一些易用的宏,方便使用者。下面我們就上面的幾種主要的功能做簡單介紹。
字符串處理
正如上面拿字符串string類型的例子,SV的string有一點尷尬的是,它并不允許直接讓用戶在string類型上面擴展,而盡管它看起來就有點像類,但又無法去繼承。
string S = " ? Some text ? ";
int n = S.len();
S = S.toupper();
對于上面字符串的操作,跟對象的使用很像,但如果像擴展string類型,只能考慮在svlib中添加一個新的類Str,通過類的方法來實現(xiàn)擴展。例如下面的例子:
Str ss = Str::create(" ? Some text ? ");
ss.trim(Str::Right);
$display("\"%s\"", ss.get());
輸出結(jié)果:
" ? Some text"
通過添加新的字符串類Str(內(nèi)嵌string變量并且對其操作),這可以在原有string類型的基礎(chǔ)上擴展更多需要的方法,例如上面的去除字符串右邊的空格。這個新的方法看起來可以帶來更多新的特性,但同時也帶來了一點麻煩。例如原有的SV用戶已經(jīng)習(xí)慣于對string變量本身的操作、通過操作符例如{}來合并字符串、或者直接賦值的形式來獲取字符串內(nèi)容等,這一點同新添加的Str類通過自帶函數(shù)的操作有明顯的差別。
如果SV的用戶不習(xí)慣新的方式,又或者原有的SV代碼不想大規(guī)模改動的時候怎么辦呢?svlib同時也提供了經(jīng)典的package內(nèi)建函數(shù)的形式,將一些主要的函數(shù)也同時按照就有的函數(shù)操作的形式來實現(xiàn)。
$display("\"%s\"", str_strim(S, Str::BOTH));
輸出結(jié)果:
"Some text"
上面這個方式更貼近于原有的字符串操作,用戶可以選擇任何一種方式來實現(xiàn)字符串的操作。
正則表達式處理
對于熟悉正則表達式的讀者,尤其是Python中正則表達式習(xí)慣的讀者,對于svlib中新添加的正則表達式類Regex和其函數(shù)處理應(yīng)該不會感到陌生。
Regex re;
re = regex_match("06/07/17", "([0-9]+)/([0-9]+)/([0-9]+)");
if (re != null) begin
$display("Looks like a data");
void'(re.subst("$2-$1-20$3"));
$display("data = %s", re.getStrContents());
end
輸出結(jié)果:
Look like a data
07-06-2017
svlib提供非常全面的跟正則表達式相關(guān)的匹配和替換的方法,更多的函數(shù)可以在svlib的文檔中找到。
文件和目錄操作
文件和目錄的操作在腳本語言中是經(jīng)常使用到的,而SV欠缺這一點(或者說現(xiàn)有的文件打開、讀寫的操作不滿足多樣需求)。svlib提供了與路徑相關(guān)的類、與文本信息相關(guān)的類等等。譬如,SV無法批量地得到相關(guān)的文件名,而這一些與目錄有關(guān)的操作,svlib提供了方法。下面的例碼就可以將當(dāng)前目錄下所有后綴名以sv結(jié)尾的文件都找到并寫入到一個字符串的隊列中。
string dirList [$];
dirList = sys_fileGlob("*sv");
下面通過Pathname類來完成文件路徑的有關(guān)操作,通過自帶的函數(shù)可以取得文件的擴展名、路徑名以及文件名本身。
Pathname path = Pathname::create("/home/svlib/src/svlib_pkg.sv");
$display(path.extension()); // .sv
$diaplay(path.dirname()); // /home/svlib/src
$display(path.tAIl()); // svlib_pkg.sv
總結(jié)
以上是生活随笔為你收集整理的sv编程语言_SV及UVM高级话题篇之一:SystemVerilog开源公共库(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小样本点云深度学习库_小样本学习综述报告
- 下一篇: 飞桨模型保存_史上最全解读|飞桨模型库重