《SystemVerilog入門指南》是一本全面介紹SystemVerilog基礎(chǔ)知識,并使每位讀者都可以毫無誤解地理解SystemVerilog的入門讀物。本書通過大量淺顯易懂的示例,透徹講解了SystemVerilog的基本功能,并對難以理解、容易混淆的功能進行了詳細介紹,為讀者進行SystemVerilog實踐提供全面的知識準(zhǔn)備。
《SystemVerilog入門指南》由24章構(gòu)成,全面、詳細介紹了SystemVerilog語言。在概述SystemVerilog的概況和發(fā)展歷史的基礎(chǔ)上,分別介紹了用于設(shè)計和驗證的構(gòu)建塊,數(shù)據(jù)類型,類,進程,賦值語句,運算符和表達式,執(zhí)行語句,任務(wù)和函數(shù),時鐘塊,進程同步和通信,檢查器,程序,接口,包,模塊,系統(tǒng)任務(wù)和系統(tǒng)函數(shù),基于約束的隨機激勵生成,SystemVerilog的驗證功能,硬件建模和驗證,UVM,編譯器預(yù)處理指令,仿真執(zhí)行模型。
《SystemVerilog入門指南》可作為廣大從事硬件設(shè)計、驗證的技術(shù)人員,特別是正在入門的初學(xué)人員的學(xué)習(xí)教材和技術(shù)參考書,也可作為高校集成電路、電子技術(shù)、計算機等專業(yè)的課程教材。
集成電路是信息時代的工業(yè)糧食,小到手機、家電,大到超級計算機、衛(wèi)星通信,都依賴于芯片。國家卡脖子問題,尤其是高端芯片的自給自足問題,已成為國家發(fā)展戰(zhàn)略的重中之重。SystemVerilog 是 Verilog的擴展,廣泛應(yīng)用于數(shù)字集成電路 (IC)和 系統(tǒng)級芯片 (SoC)的設(shè)計與驗證領(lǐng)域。其核心優(yōu)勢在于融合了硬件描述與驗證功能,支持復(fù)雜系統(tǒng)建模和高效測試。SystemVerilog擁有芯片設(shè)計及驗證工程師所需的全部結(jié)構(gòu),能夠和芯片驗證方法學(xué)結(jié)合在一起,即作為實現(xiàn)方法學(xué)的一種語言工具。使用驗證方法學(xué)可以大大增強模塊復(fù)用性、提高芯片開發(fā)效率,縮短開發(fā)周期。
《SystemVerilog入門指南》特點如下:
1.全書共 24 章,內(nèi)容豐富,全面且詳細地覆蓋了SystemVerilog語言的方方面面。
2.通過大量淺顯易懂的示例透徹講解了SystemVerilog的基本功能,并對難以理解、容易混淆的功能進行了詳細介紹。
3.SystemVerilog是芯片設(shè)計和驗證的關(guān)鍵語言,通過本書可以快速了解SystemVerilog的全貌,為實際應(yīng)用開發(fā)打下堅實基礎(chǔ)。
SystemVerilog的最新技術(shù)規(guī)范已于2018年2月21日發(fā)布于IEEE Std 1800-2017標(biāo)準(zhǔn)中(詳見參考文獻[1]),相應(yīng)的LRM隨后也被公開,事實上標(biāo)志著Verilog HDL(以下簡稱Verilog)時代的終結(jié),SystemVerilog的時代已經(jīng)到來。SystemVerilog不僅消除了Verilog所存在的一些模糊性,還增加了Verilog所沒有的許多新功能,從而能夠提高設(shè)計和驗證領(lǐng)域的生產(chǎn)力和質(zhì)量。特別是SystemVerilog中的類,作為一種特殊的數(shù)據(jù)類型發(fā)揮著重要作用,可提高驗證技術(shù)的可重用性。
SystemVerilog的LRM是一部長達1300頁的巨著,是許多研究人員和技術(shù)人員多年努力的結(jié)晶。由于LRM是SystemVerilog的標(biāo)準(zhǔn)和規(guī)范,所以也是所有從事硬件設(shè)計、驗證的技術(shù)人員必須通讀一遍的語言規(guī)范書。然而,盡管有這個必要性,但LRM絕不能說是可以用很容易理解的英文來撰述的。也許是由于SystemVerilog語言描述嚴(yán)密性的需要,導(dǎo)致LRM的表述也必須具有足夠的嚴(yán)密性,因此其英文表述總的來說還是很難理解的,是一本難以閱讀的語言說明書。一般來說,難懂的描述不僅難以理解,而且還潛藏著讀者的理解差異,結(jié)果會造成很多混亂。另一方面,由于SystemVerilog的功能很復(fù)雜,因此其語言說明書也非常復(fù)雜。由此可以認為,這兩種復(fù)雜性的疊加是妨礙日本國內(nèi)SystemVerilog實踐應(yīng)用開展的主要原因之一。鑒于這種情況,《SystemVerilog入門指南》全面提供了SystemVerilog基礎(chǔ)知識,使每位讀者都可以毫無誤解地理解其LRM的介紹。也就是說,本書重點且透徹地解說了作為SystemVerilog根基的基本功能,以及被認為難以理解的功能,目的是全面確立SystemVerilog用于實踐時所需的知識準(zhǔn)備。
如前所述,SystemVerilog增加了許多新功能,特別是SystemVerilog的豐富數(shù)據(jù)類型要求對驗證工作進行實際改革。例如,SystemVerilog的測試平臺不是以往那種基于模塊的測試,使用SystemVerilog類構(gòu)建驗證環(huán)境有助于提高生產(chǎn)率和可重用性,并允許將驗證技術(shù)作為庫進行存儲。從這個意義上說,SystemVerilog的使用需要有與以往不同的構(gòu)思。
當(dāng)前,從Verilog遷移到SystemVerilog,或者將SystemVerilog作為設(shè)計和驗證領(lǐng)域的主要語言,應(yīng)該被視為時代的主流趨勢。因此,對于硬件設(shè)計驗證技術(shù)人員來說,掌握有關(guān)SystemVerilog的實用知識,現(xiàn)在已成為不可避免的任務(wù)。但是,任何一本好書,并不是對每個人都適合。這是因為每個人在思維方式、經(jīng)驗、知識、需求等方面的差異,表現(xiàn)為理解程度的差異。特別是SystemVerilog是歐美人發(fā)明的語言,其概念在很多方面并不一定與日本人的思維方式一致。例如, LRM對于接口類概念的描述就是如此。在SystemVerilog的LRM中,對于接口類的概念做了很多冗長的解釋,但在日本人的思維中,接口類可以用規(guī)范的標(biāo)準(zhǔn)化一詞進行說明。這樣的解釋對于日本人來說更容易理解。本書正是為了適應(yīng)這種思維方式而進行了功能的解說。
從這個意義上說,《SystemVerilog入門指南》不僅是SystemVerilog的說明書,而且是從基礎(chǔ)上解說語言所具有的意義,重點是提供用于實踐的知識。除驗證功能之外,本書介紹了LRM中描述的所有重要章節(jié),幾乎包含了其全部內(nèi)容(除功能覆蓋和斷言之外),因此也可能不是一本入門書。但是,由于撰述風(fēng)格是針對初學(xué)者的,所以我認為初學(xué)者理解本書的內(nèi)容并不困難。
本書的內(nèi)容安排遵循LRM的結(jié)構(gòu),因此在閱讀本書時參考LRM比較容易。雖然本書簡明扼要地解釋了LRM的本質(zhì),但參考原版LRM可以獲得更詳細的知識和信息。
《SystemVerilog入門指南》由包括概述在內(nèi)的24章構(gòu)成,詳細介紹了SystemVerilog語言。但是,關(guān)于上述的驗證功能,只進行了概括性的介紹。本書以與Verilog的差異、設(shè)計和驗證工作中必要的SystemVerilog的基本功能為中心進行介紹,并解說了隨機靜態(tài)激勵的生成功能。在第21章中,解釋了模塊定義的方法和測試方法,并以代表性的電路為例,介紹了SystemVerilog的建模示例。這些示例包括組合邏輯電路、時序邏輯電路、FSM(有限狀態(tài)機)等,使讀者可以再次確認使用SystemVerilog語言功能進行建模的知識。除此之外,由于本書使用適當(dāng)?shù)腟ystemVerilog功能來驗證其建模,所以這些驗證例子也是說明SystemVerilog功能的最佳素材。總之,在閱讀完本書后,讀者已經(jīng)完全掌握了SystemVerilog的基礎(chǔ)知識。
本書是一本SystemVerilog入門書籍,因此省略了驗證功能的詳細說明以及近期受到關(guān)注的驗證方法UVM的詳細解析。UVM是一個幾乎利用了SystemVerilog所有功能所搭建的強大驗證庫。因此,理解UVM將有助于加深對SystemVerilog的理解。關(guān)于省略的UVM的詳細內(nèi)容,可參見本書參考文獻,其中包含了相關(guān)的詳細解釋。
本書由很多章節(jié)構(gòu)成,但在依次閱讀前5章內(nèi)容后,即可選擇其他章節(jié)進行學(xué)習(xí)?筛鶕(jù)閱讀目的和需求選擇主題,進行有效的學(xué)習(xí)。
最后,本書是一本獨一無二的SystemVerilog入門學(xué)習(xí)用書,詳細介紹了SystemVerilog提供的功能。因此,關(guān)于SystemVerilog語法的解釋、術(shù)語的解說、說明圖、仿真結(jié)果的呈現(xiàn)等,本書的出版單位共立出版社均分別給予了細微的周到安排。特別感謝共立出版社的菅沼正裕先生,在本書出版中給予了大量的協(xié)助和支持。
篠塚一也
篠塚一也,1972年畢業(yè)于日本名古屋大學(xué)理學(xué)研究科,獲數(shù)學(xué)碩士學(xué)位,現(xiàn)任藝術(shù)圖形EDA開發(fā)部架構(gòu)設(shè)計師。主要研究方向為編程語言設(shè)計、編譯器開發(fā)、RTL邏輯綜合、SystemVerilog設(shè)計及驗證開發(fā)。主要著作為《基于SystemVerilog的驗證基礎(chǔ)》(森北出版,2020)。
目 錄
譯者序
原書前言
本書使用的縮略語一覽表
第1章 概述1
1.1 SystemVerilog的歷史1
1.2 SystemVerilog概述2
1.2.1 作為語言的SystemVerilog 2
1.2.2 作為設(shè)計語言的SystemVerilog 3
1.2.3 作為驗證語言的SystemVerilog 3
1.3 本書的語法描述4
1.4 SystemVerilog的語法規(guī)則5
1.5 編譯和細化6
1.6 聲明和定義6
1.7 本書的對象和目的7
1.8 本書的結(jié)構(gòu)8
1.9 關(guān)于示例9
1.10 本書的標(biāo)記法9
第2章 用于設(shè)計和驗證的構(gòu)建塊12
2.1 設(shè)計要素12
2.2 模塊12
2.3 程序14
2.4 接口15
2.5 檢查器16
2.6 包17
2.7 門級和開關(guān)級建模18
2.8 基本元件19
2.9 配置20
2.10 編譯單元20
2.11 `timescale編譯器指令21
2.12 垃圾回收22
2.12.1 automatic變量23
2.12.2 static變量23
第3章 數(shù)據(jù)類型24
3.1 數(shù)據(jù)類型和數(shù)據(jù)對象24
3.2 logic類型25
3.3 線網(wǎng)(net)類型26
3.4 變量28
3.5 線網(wǎng)和變量30
3.6 4-state 類型31
3.7 2-state類型32
3.8 integral類型33
3.9 real、shortreal和realtime類型34
3.10 void 類型34
3.11 chandle 類型35
3.12 string類型35
3.13 event類型37
3.14 typedef語句39
3.15 enum類型40
3.16 常量43
3.17 const常量47
3.18 cast操作符47
3.19 $cast動態(tài)類型轉(zhuǎn)換48
3.20 便利的初始值設(shè)置49
3.20.1 位值擴展49
3.20.2 通過位號的設(shè)定51
3.21 引用指針51
第4章 由多個元素組成的數(shù)據(jù)類型53
4.1 結(jié)構(gòu)體53
4.1.1 緊湊結(jié)構(gòu)體55
4.1.2 結(jié)構(gòu)體的賦值56
4.2 共用體57
4.2.1 緊湊共用體58
4.2.2 標(biāo)記共用體59
4.3 緊湊數(shù)組和非緊湊數(shù)組60
4.3.1 緊湊數(shù)組61
4.3.2 非緊湊數(shù)組61
4.3.3 數(shù)組的引用62
4.3.4 緊湊數(shù)組的引用64
4.4 動態(tài)數(shù)組64
4.4.1 適用于動態(tài)數(shù)組的方法65
4.4.2 數(shù)組的復(fù)制67
4.5 關(guān)聯(lián)數(shù)組69
4.5.1 關(guān)聯(lián)數(shù)組概述69
4.5.2 關(guān)聯(lián)數(shù)組數(shù)據(jù)元素的添加及更新70
4.5.3 適用于關(guān)聯(lián)數(shù)組的方法71
4.5.4 關(guān)聯(lián)數(shù)組實量71
4.6 隊列73
4.6.1 隊列概述73
4.6.2 隊列的操作74
4.6.3 適用于隊列的方法75
4.7 數(shù)組信息獲取函數(shù)76
4.8 數(shù)組操作方法77
4.8.1 數(shù)組搜索方法77
4.8.2 數(shù)組數(shù)據(jù)元素的排序方法79
4.8.3 數(shù)組計算方法81
4.9 數(shù)組掃描方法82
第5章 類84
5.1 類的概述84
5.2 類的語法85
5.3 類對象(類實例)88
5.4 類屬性和方法的訪問88
5.5 構(gòu)造函數(shù)89
5.6 指定類型的構(gòu)造函數(shù)調(diào)用90
5.7 static類屬性90
5.8 static類方法92
5.9 this句柄93
5.10 句柄數(shù)組93
5.11 類的復(fù)制95
5.12 類繼承和子類97
5.13 $cast101
5.14 const類屬性102
5.15 virtual方法103
5.16 抽象類和pure virtual方法105
5.17 類作用域運算符107
5.18 類成員的訪問控制109
5.19 如何在類外編寫方法110
5.20 通過參數(shù)進行的通用類定義111
5.20.1 概述111
5.20.2 通過參數(shù)進行的通用類實現(xiàn)111
5.20.3 使用參數(shù)實現(xiàn)通用類的步驟113
5.21 類的前向聲明115
5.22 將類應(yīng)用于測試平臺115
5.23 接口類117
5.23.1 概述117
5.23.2 功能118
第6章 進程121
6.1 仿真過程121
6.1.1 initial過程122
6.1.2 always過程123
6.1.3 final過程128
6.2 語句塊129
6.2.1 begin-end語句塊129
6.2.2 fork-join語句塊129
6.2.3 語句塊命名134
6.2.4 fork語句塊的有效利用135
6.3 基于定時的執(zhí)行控制136
6.3.1 基于定時的執(zhí)行控制概述136
6.3.2 延時控制137
6.3.3 邊緣敏感事件控制137
6.3.4 賦值定時控制139
6.3.5 事件等待控制141
6.3.6 事件控制和解除141
6.4 進程控制143
6.4.1 wait語句143
6.4.2 wait fork語句143
6.4.3 disable fork語句144
6.4.4 wait_order語句145
6.5 進程和RNG147
6.6 特定的用戶進程控制148
第7章 賦值語句152
7.1 連續(xù)賦值語句153
7.2 行為賦值語句154
7.2.1 阻塞賦值語句155
7.2.2 非阻塞賦值語句156
7.3 模式賦值158
第8章 運算符和表達式160
8.1 運算符160
8.1.1 賦值運算符162
8.1.2 自增和自減運算符162
8.1.3 算術(shù)運算符163
8.1.4 比較運算符164
8.1.5 通配符比較運算符166
8.1.6 邏輯運算符167
8.1.7 位運算符168
8.1.8 單變量邏輯運算符168
8.1.9 移位運算符169
8.1.10 條件運算符170
8.1.11 拼接運算符171
8.1.12 inside運算符172
8.1.13 比特流運算符173
8.2 操作數(shù)177
8.2.1 部分選擇177
8.2.2 非緊湊數(shù)組178
8.3 帶標(biāo)記成員的操作178
第9章 執(zhí)行語句180
9.1 if語句180
9.1.1 所有條件的列舉180
9.1.2 unique-if語句和unique0-if語句181
9.1.3 priority-if語句182
9.2 case語句182
9.2.1 unique-case語句和unique0-case語句184
9.2.2 priority-case語句185
9.2.3 casez和casex185
9.3 inside運算符與if語句及case語句186
9.3.1 if語句和inside運算符186
9.3.2 case語句和inside運算符187
9.4 循環(huán)語句188
9.4.1 for語句189
9.4.2 repeat語句190
9.4.3 foreach語句191
9.4.4 while語句194
9.4.5 do-while語句194
9.4.6 forever語句195
9.5 return語句195
9.6 break語句196
9.7 continue語句197
第10章 任務(wù)和函數(shù)199
10.1 任務(wù)199
10.1.1 端口信號列表199
10.1.2 任務(wù)內(nèi)的描述200
10.2 函數(shù)200
10.2.1 函數(shù)的限制201
10.2.2 端口信號列表201
10.2.3 函數(shù)內(nèi)的描述202
10.3 參數(shù)默認值的設(shè)置方法202
10.4 具有返回值函數(shù)的調(diào)用204
10.5 遞歸調(diào)用204
10.6 類方法和遞歸調(diào)用205
10.7 方法內(nèi)的變量初始化206
10.8 作為參數(shù)的數(shù)組208
10.9 導(dǎo)入和導(dǎo)出209
第11章 時鐘塊212
11.1 最簡單的時鐘塊212
11.2 時鐘塊的偏移213
11.3 時鐘事件和Observed區(qū)域215
11.4 周期延時217
第12章 進程同步和通信220
12.1 旗語220
12.2 信箱223
12.3 參數(shù)化信箱227
12.4 命名事件227
12.4.1 概述227
12.4.2 triggered方法230
12.4.3 作為參數(shù)的事件對象232
12.4.4 事件資源的釋放233
12.4.5 比較事件233
12.4.6 事件的別名233
第13章 檢查器235
13.1 概述235
13.2 檢查器的實例化236
13.3 檢查器中的隨機變量238
13.4 DUT輸出采樣239
第14章 程序242
14.1 語法242
14.2 程序的特點243
14.3 程序控制245
14.4 仿真結(jié)束246
第15章 接口248
15.1 語法248
15.2 接口功能概述249
15.3 基于通用接口的連接251
15.4 modport251
15.5 參數(shù)化接口252
15.6 虛接口253
第16章 包258
16.1 語法258
16.2 包的定義259
16.3 包的使用260
16.4 std包263
第17章 模塊267
17.1 概述267
17.2 模塊的定義268
17.3 端口信號列表271
17.3.1 Verilog風(fēng)格和SystemVerilog風(fēng)格271
17.3.2 關(guān)于端口信號方向的規(guī)則272
17.4 參數(shù)化模塊273
17.5 top模塊275
17.6 模塊實例275
17.7 使用接口的模塊描述275
17.8 未定義模塊的聲明277
17.9 層次結(jié)構(gòu)名稱279
第18章 系統(tǒng)任務(wù)和系統(tǒng)函數(shù)281
18.1 $display和$write任務(wù)281
18.2 $sformat任務(wù)和$sformatf函數(shù)283
18.3 $monitor284
18.4 仿真時間獲取函數(shù)285
18.5 $printtimescale286
18.6 數(shù)值轉(zhuǎn)換287
18.7 信息獲取函數(shù)287
18.8 vector系統(tǒng)函數(shù)290
18.9 用于序列采樣值獲取的系統(tǒng)函數(shù)291
18.10 錯誤處理系統(tǒng)任務(wù)293
18.11 隨機化系統(tǒng)函數(shù)294
18.12 仿真控制295
18.13 其他系統(tǒng)任務(wù)和函數(shù)295
18.14 命令行參數(shù)296
18.15 VCD文件298
18.15.1 VCD文件的指定298
18.15.2 VCD文件的記錄298
18.15.3 VCD文件記錄的暫停和恢復(fù)299
18.15.4 VCD文件創(chuàng)建示例299
第19章 基于約束的隨機激勵生成302
19.1 概述302
19.2 隨機變量304
19.2.1 隨機變量概述304
19.2.2 關(guān)鍵字rand305
19.2.3 關(guān)鍵字randc305
19.2.4 隨機變量定義示例305
19.3 隨機數(shù)生成函數(shù)306
19.4 約束條件308
19.4.1 關(guān)鍵字inside308
19.4.2 關(guān)鍵字dist311
19.4.3 關(guān)鍵字unique313
19.4.4 關(guān)鍵字implication314
19.4.5 運用foreach語句進行的約束315
19.4.6 隨機變量生成順序的約束317
19.5 測試過程中的約束定義318
19.6 隨機變量的啟用和禁用319
19.7 約束的啟用和禁用321
19.8 使用randomize()方法進行的隨機變量控制322
19.9 否定形式的約束條件描述324
19.10 結(jié)構(gòu)體的隨機化325
19.11 隊列的隨機化327
19.12 以約束對數(shù)據(jù)進行的檢查328
19.13 測試用例約束的單獨指定330
19.14 在類外部進行的約束定義332
19.15 std::randomize()函數(shù)333
19.16 系統(tǒng)函數(shù)334
第20章 SystemVerilog的驗證功能336
20.1 功能覆蓋率336
20.1.1 概述336
20.1.2 功能覆蓋率計算337
20.1.3 功能覆蓋率計算示例338
20.2 斷言343
20.2.1 概述343
20.2.2 斷言的類型344
20.2.3 斷言表達式345
20.2.4 斷言描述示例346
第21章 硬件建模和驗證350
21.1 組合邏輯電路351
21.1.1 組合邏輯電路的描述規(guī)則351
21.1.2 驗證組合邏輯電路的時機352
21.1.3 譯碼器353
21.1.4 編碼器355
21.1.5 ALU357
21.1.6 比較器359
21.1.7 將格雷碼轉(zhuǎn)換為二進制碼的電路360
21.1.8 筒式移位器(循環(huán)移位器)362
21.1.9 帶符號整數(shù)的加減運算器364
21.2 時序邏輯電路366
21.2.1 時序邏輯電路描述規(guī)則367
21.2.2 時序邏輯電路的驗證367
21.2.3 二進制計數(shù)器369
21.2.4 JK觸發(fā)器370
21.2.5 Johnson計數(shù)器372
21.2.6 通用移位寄存器374
21.2.7 格雷計數(shù)器377
21.2.8 環(huán)形計數(shù)器379
21.2.9 門控時鐘的描述示例380
21.3 FSM383
21.3.1 概述383
21.3.2 Moore型FSM電路的建模384
21.3.3 Mealy型FSM電路的建模387
21.4 采用FSM電路的比特序列模式識別390
21.4.1 比特序列模式識別問題390
21.4.2 Moore型FSM電路的建模391
21.4.3 Mealy型FSM電路的建模393
第22章 UVM概述395
22.1 什么是UVM395
22.2 驗證技術(shù)的發(fā)展趨勢與UVM395
22.3 UVM的驗證要素397
22.3.1 與事務(wù)和方案描述相關(guān)的UVM類397
22.3.2 方法類397
22.4 TLM398
22.5 UVM仿真399
22.5.1 仿真階段399
22.5.2 run_test()方法400
22.6 UVM驗證組件的開發(fā)400
22.7 top模塊401
第23章 編譯器預(yù)處理指令403
23.1 `include語句403
23.2 `define語句404
23.2.1 常量的定義404
23.2.2 具有前綴和后綴的名稱創(chuàng)建405
23.3 字符串中的參數(shù)展開406
23.4 `endif語句407
23.5 `_ _FILE_ _與`_ _LINE_ _的使用示例407
第24章 仿真執(zhí)行模型409
24.1 調(diào)度區(qū)域409
24.2 #0延時效應(yīng)411
參考文獻413