中文版本由空白的貝塔君整理發布

鏈接為https://github.com/recogni/svlib

 

第一章 關于本文檔

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 版權信息

本文版權所有©Verilab Inc. 2014-2015。本文作為svlib使用庫的附加信息。本文件允許無限復制,但必須包括第一章的全部內容,不得修改。

 

1.3.1 責任限制

Verilab公司對該軟件包的運行不承擔任何責任。如果你想使用它,你將自行承擔全部責任。

 

1.3.2 作者

這份文件是由Jonathan Bromley、Paul Marriott和André Winkelmann在Verilab, Inc (www.verilab.com)準備的。

 

1.3.3 開源許可

svlib是一個開放源代碼包,所以您可以自由地使用源代碼并以任何您想要的方式修改它。為了方便使用,本文檔以PDF格式提供,因此并不是嚴格的開源。原始的可編輯文檔可根據要求從作者處獲得。

 

1.4 作者聯系方式

可以通過電子郵件地址svlib@verilab.com聯系此軟件包和文檔的作者。作者很高興收到意見與建議,并盡可能迅速回復。

 

第二章 簡介與概述

本文檔介紹了systemverilog的實用程序庫svlib。svlib為我們的日常驗證工作提供了SystemVerilog所缺乏的功能:字符串處理、操作系統接口和許多其他有用的函數。

 

  • 第三章介紹了如何在仿真器和你的驗證環境中使用svlib第四章介紹了了svlib的一些基本原則和規則。第五章介紹了svlib的特性,這些特性補充了SystemVerilog語言中所沒有的字符串處理與操作。第六章介紹了正則匹配與替換的特性。第七章給出了Pathname類的詳細信息,借助這個類,可以更加簡單的進行常見的文件操作,例如確定目錄、根據目錄生成路徑名、查找文件的擴展名等。這些操作只是專用的字符串函數,并不能對文件系統進行任何讀寫。第八章介紹了用于查詢文件系統的svlib工具。通過這些函數可以查詢文件的屬性,如“這個文件存在嗎”,“文件Z后修改的日期是什么”,“是否擁有寫權限”,“它是一個目錄”和許多其他屬性。第九章介紹了操作系統查詢函數。通過這些函數可以輕松地獲取當前時間和日期,以各種人類可讀的格式呈現日期,獲取操作系統的環境變量,以字符串隊列的形式獲取目錄內容,并讀取計時器。第十章討論如何在svlib中處理錯誤。默認情況下,錯誤會報告在模擬器的控制臺,但通過svlib可以以各種方式自定義錯誤處理,甚至可以通過自己的SystemVerilog代碼處理錯誤。第十二章詳細介紹了支持以.ini或YAML格式讀寫配置文件的類和函數,并說明了如何在自定義配置類和svlib的內部文檔對象模型(DOM)表示之間傳輸配置數據。第十三章介紹了一個通過運行仿真來查詢仿真環境的功能。第十四章介紹了一些實用的函數,這些函數優化了SystemVerilog枚舉類型的使用體驗。第十五章介紹了以SystemVerilog宏的形式提供的一些實用特性。Z后,第十六章提供了一些示例,展示了svlib工具的實際應用。

 

第三章 編譯并運行svlib

svlib代碼分為三個不同的部分,都可以src/目錄中找到:

 

  • 宏定義,如果想使用宏相關的功能,請在代碼中添加``include "svlib_macros.svh"`systemverilog代碼,已經打包成一個svlib_pkg,使用前需要用編譯器編譯svlib_pkg.sv文件C代碼,通過systemverilog DPI調用,包含了多個庫,目前打包成了一個文件dpi/svlib_dpi.c

 

要使用svlib,必須編譯svlib_pkg.svdpi/svlib_dpi.c。已經在使用DPI的用戶可以直接拓展已經有的DPI,或者也可以鏈接到動態鏈接庫文件。對于新用戶或者只是想試試的用戶,建議按照仿真器的編譯、鏈接以及運行的流程使用svlib。為了簡化流程,請參考文件src目錄下的svlib.f。

 

占位符代表svlib的目錄。

 

下面以三種主流仿真器為例,說明使用方法

 

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可執行文件在編譯和鏈接完成后自動開始運行。

 

  vcs –sverilog –R +incdir+/src –f /src/svlib.f \                     –LDFLAGS –lrt \                         

 

如果要簡化這個命令,我們準備了了一個vcs.f文件,它包含所需的-LDFLAGS和-sverilog選項以及svlib的其他內容,然后就可以使用下面的命令運行:

 

  vcs–R +incdir+/src –f /src/vcs.f     

 

第四章 一些使用規則與約定

svlib被設計成在任何SystemVerilog環境都盡可能不影響原環境并且都能正常運行。為了實現這些目標,有必要引入一些對整個庫都通用的底層行為。對于用戶來說,了解這些行為,避免意外,是很重要的。

 

4.1 庫的結構概述

4.1.1 package

svlib已經封裝成了一個叫svlib_pkg的SystemVerilog包。仿真器編譯之后,用戶應該把這個包導入到自己的代碼中,這樣svlib的工具就可以隨時使用。pkg的import語句應該在任何需要它的模塊或包的域中,就在module或package的開頭。不要把import語句放在任何module或package的外側,會使svlib導入到$unit空間,存在潛在風險。

 

4.1.2 marco

除了包之外,svlib還有一些在使用包特性時有用或必要的宏。為了使這些宏定義社工小,用戶應該在代碼中添加:

 

  `include "svlib_macros.svh"  

 

代碼應該添加在Z外層($unit)范圍內,在任何模塊或包之外。推薦在整個環境的頂層添加這行代碼,此外,代碼使用了ifdef語句,避免了二次定義

 

4.2 類或者包內的函數?

幾乎所有的svlib功能都是由包中定義的類提供的。用戶可以根據需要創建這些類的實例(見下文4.3節)。然而,在某些情況下,簡單地調用一個函數,比創建一個對象、配置數據,然后調用它的方法并Z終從對象中提取處理過的數據更方便。很多特性這兩種形式都有,因此可以選擇更方便的一種。有關更多細節,請參閱每個特性的文檔。

 

4.3 構造svlib對象

svlib的許多部分都使用定義了SystemVerilog類。因此,為了使用svlib特性,用戶的代碼中必須創建這些類型的新對象。然而,為了穩定性,提高內存管理效率,「用戶代碼不應該直接調用任何svlib類的new函數」。所有的對象都應該用內建的靜態函數create創建,每個類的create函數在后續章節都有介紹。

 

這個問題在參考的會議論文[1]中有更詳細的討論。所有主流的SystemVerilog仿真器現在都提供了對受保護的構造函數的全面支持。因此,所有的svlib類構造函數都聲明為protected的,因此用戶代碼不可能直接調用它們。

 

4.4 錯誤處理

偶爾,svlib函數可能會導致內部錯誤。尤其是函數調用C庫時,在C庫中可能存在內存分配、文件權限甚至文件存在等問題。這樣的錯誤總是被傳回到SystemVerilog中進行處理,但是錯誤處理的具體斜街在某種程度上是由程序員控制的。svlib的默認行為是拋出斷言的錯誤,但是還有更加細致的控制。詳情見第十章。

 

4.5 svlib的內部隱藏特性

svlib的一些特性被設計為對用戶保持隱藏。這樣做是為了讓包能夠保持DPI的C端和SystemVerilog端數據的一致性。但是,SystemVerilog沒有提供任何方法在語言中實現強制隱藏。為了幫助用戶避免意外地破壞這種封裝,svlib的隱藏部分被放置在一個單獨的包svlib_private_base_pkg中。用戶代碼不應該直接導入這個包,也不應該嘗試使用其中的任何數據、函數、類或DPI導入。

 

4.6 命名約定

整個svlib中盡可能使用了一致的命名方案,因此更容易記住或猜測給定特性的名稱。為了方便使用,命名盡可能短,但有時由于與systemverilog關鍵字或者其他包,例如UVM,沖突,或者為了在包中保持一些獨特的名字,命名會比較長。

 

4.6.1 類

幾乎所有的svlib類都是以大寫字母開頭的短名稱,或者都是小寫的。例如,表示正則表達式的類是Regex,也有一些例外,比如,配置特性有幾個以cfg前綴命名的類,比如cfgNode。

 

4.6.2 類的方法

svlib類的方法的名稱盡可能短,同時盡量好記。如果一個名字是由多個單詞組成的,那么這個名字用駝峰式拼寫(沒有下劃線,除了第一個單詞外都大寫),比如,cfgNode類的addNode函數。

 

4.6.3 pkg級函數的前綴

svlib函數分組大多數比較直觀。例如,有幾個與操作系統交互有關的pkg級函數。這些函數的名稱都以前綴sys開頭,與名稱的主要部分用下劃線分隔,如sys_dayTime中所示。