中文版本由空白的貝塔君
整理發(fā)布
鏈接為https://github.com/recogni/svlib
第一章 關(guān)于本文檔
1.1 概要
本文檔是對systemverilog使用庫svlib
的說明和編程指導。
1.2 版本信息
版本號 | 日期 | 作者 | 說明 |
---|---|---|---|
0.0 | 2014.02.10 | J Bromley | Initial release for discussion |
0.1 | 2014.02.23 | J Bromley | Working towards a first release |
0.2 | 2014.03.02 | J Bromley | All sections present, ready for initial release. Some explanatory text is still missing. |
0.3 | 2014.06.05 | J Bromley | Fix issues #18, #19 and various other minor errors. Complete most of the text. |
0.4 | 2015.01.04 | J Bromley | Fix issues #20, #21, #22. |
0.5 | 2015.07.14 | J Bromley | Fixes #24, #27, #28, #29, #31 |
1.3 版權(quán)信息
本文版權(quán)所有©Verilab Inc. 2014-2015。本文作為svlib使用庫的附加信息。本文件允許無限復制,但必須包括第一章的全部內(nèi)容,不得修改。
1.3.1 責任限制
Verilab公司對該軟件包的運行不承擔任何責任。如果你想使用它,你將自行承擔全部責任。
1.3.2 作者
這份文件是由Jonathan Bromley、Paul Marriott和André Winkelmann在Verilab, Inc (www.verilab.com)準備的。
1.3.3 開源許可
svlib是一個開放源代碼包,所以您可以自由地使用源代碼并以任何您想要的方式修改它。為了方便使用,本文檔以PDF格式提供,因此并不是嚴格的開源。原始的可編輯文檔可根據(jù)要求從作者處獲得。
1.4 作者聯(lián)系方式
可以通過電子郵件地址svlib@verilab.com聯(lián)系此軟件包和文檔的作者。作者很高興收到意見與建議,并盡可能迅速回復。
第二章 簡介與概述
本文檔介紹了systemverilog的實用程序庫svlib。svlib為我們的日常驗證工作提供了SystemVerilog所缺乏的功能:字符串處理、操作系統(tǒng)接口和許多其他有用的函數(shù)。
- 第三章介紹了如何在仿真器和你的驗證環(huán)境中使用svlib第四章介紹了了svlib的一些基本原則和規(guī)則。第五章介紹了svlib的特性,這些特性補充了SystemVerilog語言中所沒有的字符串處理與操作。第六章介紹了正則匹配與替換的特性。第七章給出了Pathname類的詳細信息,借助這個類,可以更加簡單的進行常見的文件操作,例如確定目錄、根據(jù)目錄生成路徑名、查找文件的擴展名等。這些操作只是專用的字符串函數(shù),并不能對文件系統(tǒng)進行任何讀寫。第八章介紹了用于查詢文件系統(tǒng)的svlib工具。通過這些函數(shù)可以查詢文件的屬性,如“這個文件存在嗎”,“文件最后修改的日期是什么”,“是否擁有寫權(quán)限”,“它是一個目錄”和許多其他屬性。第九章介紹了操作系統(tǒng)查詢函數(shù)。通過這些函數(shù)可以輕松地獲取當前時間和日期,以各種人類可讀的格式呈現(xiàn)日期,獲取操作系統(tǒng)的環(huán)境變量,以字符串隊列的形式獲取目錄內(nèi)容,并讀取計時器。第十章討論如何在svlib中處理錯誤。默認情況下,錯誤會報告在模擬器的控制臺,但通過svlib可以以各種方式自定義錯誤處理,甚至可以通過自己的SystemVerilog代碼處理錯誤。第十二章詳細介紹了支持以.ini或YAML格式讀寫配置文件的類和函數(shù),并說明了如何在自定義配置類和svlib的內(nèi)部文檔對象模型(DOM)表示之間傳輸配置數(shù)據(jù)。第十三章介紹了一個通過運行仿真來查詢仿真環(huán)境的功能。第十四章介紹了一些實用的函數(shù),這些函數(shù)優(yōu)化了SystemVerilog枚舉類型的使用體驗。第十五章介紹了以SystemVerilog宏的形式提供的一些實用特性。最后,第十六章提供了一些示例,展示了svlib工具的實際應用。
第三章 編譯并運行svlib
svlib代碼分為三個不同的部分,都可以src/目錄中找到:
- 宏定義,如果想使用宏相關(guān)的功能,請在代碼中添加``include "svlib_macros.svh"`systemverilog代碼,已經(jīng)打包成一個
svlib_pkg
,使用前需要用編譯器編譯svlib_pkg.sv
文件C代碼,通過systemverilog DPI調(diào)用,包含了多個庫,目前打包成了一個文件dpi/svlib_dpi.c
要使用svlib,必須編譯svlib_pkg.sv
和dpi/svlib_dpi.c
。已經(jīng)在使用DPI的用戶可以直接拓展已經(jīng)有的DPI,或者也可以鏈接到動態(tài)鏈接庫文件。對于新用戶或者只是想試試的用戶,建議按照仿真器的編譯、鏈接以及運行的流程使用svlib。為了簡化流程,請參考文件src
目錄下的svlib.f
。
占位符
下面以三種主流仿真器為例,說明使用方法
3.1 Mentor Graphics QuestaSim
qverilog
的一步流程
qverilog +incdir+/src –f /src/svlib.f
3.2 Cadence Incisive
irun
的一步流程
irun +incdir+/src –f /src/svlib.f
3.3 Synopsys VCS
vcs
的一步流程。請注意附加的-LDFLAGS選項,它是鏈接VCS默認沒有鏈接的C庫時所必需的選項。-R選項不是強制性的,它只是使simv
可執(zhí)行文件在編譯和鏈接完成后自動開始運行。
vcs –sverilog –R +incdir+/src –f /src/svlib.f
–LDFLAGS –lrt
如果要簡化這個命令,我們準備了了一個vcs.f
文件,它包含所需的-LDFLAGS和-sverilog選項以及svlib的其他內(nèi)容,然后就可以使用下面的命令運行:
vcs–R +incdir+/src –f /src/vcs.f
第四章 一些使用規(guī)則與約定
svlib被設(shè)計成在任何SystemVerilog環(huán)境都盡可能不影響原環(huán)境并且都能正常運行。為了實現(xiàn)這些目標,有必要引入一些對整個庫都通用的底層行為。對于用戶來說,了解這些行為,避免意外,是很重要的。
4.1 庫的結(jié)構(gòu)概述
4.1.1 package
svlib
已經(jīng)封裝成了一個叫svlib_pkg的SystemVerilog包。仿真器編譯之后,用戶應該把這個包導入到自己的代碼中,這樣svlib
的工具就可以隨時使用。pkg的import語句應該在任何需要它的模塊或包的域中,就在module或package的開頭。不要把import語句放在任何module或package的外側(cè),會使svlib
導入到$unit
空間,存在潛在風險。
4.1.2 marco
除了包之外,svlib還有一些在使用包特性時有用或必要的宏。為了使這些宏定義社工小,用戶應該在代碼中添加:
`include "svlib_macros.svh"
代碼應該添加在最外層($unit)范圍內(nèi),在任何模塊或包之外。推薦在整個環(huán)境的頂層添加這行代碼,此外,代碼使用了ifdef
語句,避免了二次定義
4.2 類或者包內(nèi)的函數(shù)?
幾乎所有的svlib
功能都是由包中定義的類提供的。用戶可以根據(jù)需要創(chuàng)建這些類的實例(見下文4.3節(jié))。然而,在某些情況下,簡單地調(diào)用一個函數(shù),比創(chuàng)建一個對象、配置數(shù)據(jù),然后調(diào)用它的方法并最終從對象中提取處理過的數(shù)據(jù)更方便。很多特性這兩種形式都有,因此可以選擇更方便的一種。有關(guān)更多細節(jié),請參閱每個特性的文檔。
4.3 構(gòu)造svlib
對象
svlib
的許多部分都使用定義了SystemVerilog類。因此,為了使用svlib特性,用戶的代碼中必須創(chuàng)建這些類型的新對象。然而,為了穩(wěn)定性,提高內(nèi)存管理效率,「用戶代碼不應該直接調(diào)用任何svlib類的new函數(shù)」。所有的對象都應該用內(nèi)建的靜態(tài)函數(shù)create
創(chuàng)建,每個類的create
函數(shù)在后續(xù)章節(jié)都有介紹。
這個問題在參考的會議論文[1]中有更詳細的討論。所有主流的SystemVerilog仿真器現(xiàn)在都提供了對受保護的構(gòu)造函數(shù)的全面支持。因此,所有的svlib類構(gòu)造函數(shù)都聲明為protected
的,因此用戶代碼不可能直接調(diào)用它們。
4.4 錯誤處理
偶爾,svlib
函數(shù)可能會導致內(nèi)部錯誤。尤其是函數(shù)調(diào)用C庫時,在C庫中可能存在內(nèi)存分配、文件權(quán)限甚至文件存在等問題。這樣的錯誤總是被傳回到SystemVerilog中進行處理,但是錯誤處理的具體斜街在某種程度上是由程序員控制的。svlib
的默認行為是拋出斷言的錯誤,但是還有更加細致的控制。詳情見第十章。
4.5 svlib
的內(nèi)部隱藏特性
svlib
的一些特性被設(shè)計為對用戶保持隱藏。這樣做是為了讓包能夠保持DPI的C端和SystemVerilog端數(shù)據(jù)的一致性。但是,SystemVerilog沒有提供任何方法在語言中實現(xiàn)強制隱藏。為了幫助用戶避免意外地破壞這種封裝,svlib
的隱藏部分被放置在一個單獨的包svlib_private_base_pkg
中。用戶代碼不應該直接導入這個包,也不應該嘗試使用其中的任何數(shù)據(jù)、函數(shù)、類或DPI導入。
4.6 命名約定
整個svlib中盡可能使用了一致的命名方案,因此更容易記住或猜測給定特性的名稱。為了方便使用,命名盡可能短,但有時由于與systemverilog關(guān)鍵字或者其他包,例如UVM,沖突,或者為了在包中保持一些獨特的名字,命名會比較長。
4.6.1 類
幾乎所有的svlib
類都是以大寫字母開頭的短名稱,或者都是小寫的。例如,表示正則表達式的類是Regex
,也有一些例外,比如,配置特性有幾個以cfg前綴命名的類,比如cfgNode
。
4.6.2 類的方法
svlib
類的方法的名稱盡可能短,同時盡量好記。如果一個名字是由多個單詞組成的,那么這個名字用駝峰式拼寫(沒有下劃線,除了第一個單詞外都大寫),比如,cfgNode
類的addNode
函數(shù)。
4.6.3 pkg級函數(shù)的前綴
svlib
函數(shù)分組大多數(shù)比較直觀。例如,有幾個與操作系統(tǒng)交互有關(guān)的pkg級函數(shù)。這些函數(shù)的名稱都以前綴sys
開頭,與名稱的主要部分用下劃線分隔,如sys_dayTime
中所示。