海思小兵帶你快速瞭解System Verilog和Java、C++的異同點,以及對IC做了什麼特殊支持


需要什麼相關的內容可以留言或找到隱藏的聯繫方式(微信)去提醒我,我業餘時間可以儘量去補充完善,甚至可以幫你諮詢一下專業人士來答疑解惑。
先拋個問題,懂軟件,就可以對硬件進行“降維打擊”嗎?

0、爲什麼寫這篇文章

0.1、是爲了對自己掌握的東西做一些記錄

因爲工作原因,在該領域工作過一段時間,多做總結可以提升自己,也希望能獲得一些建議反饋。

0.2、是想給一些和我類似的同學:有軟件開發經驗(或者沒有經驗),需要在IC領域做些東西的人,幫助大家快速入門。

可以從目錄就先有個整體印象。
同時也提醒各位,不能簡單的以爲軟件就可以對硬件進行“降維打擊”,每個領域都有它自己很專業的東西
希望大家能有所收穫。

1、什麼是System Verilog?

System Verilog是在C++和Java誕生之後,借鑑了C++和Java的優點,結合IC設計的特點,而誕生的一門編程語言
在IC領域,設計人員(相當於軟件開發)一般使用Verilog或VHDL語言,驗證人員(相當於軟件測試)使用更高級的System Verilog、System C、C語言等等,支持白盒灰盒黑盒(和軟件測試的概念一致)的方式去驗證。還有把芯片放到單板上,集成性地去驗證(這是業界常用的做法)。System Verilog適用於針對性的驗證,會讓芯片設計階段的版本迭代加快。
推薦一本比較全面的書《芯片驗證漫遊指南》,其中有講到很多軟件工程、軟件思維的東西,會比較有親切感。豆瓣鏈接https://book.douban.com/subject/30222541/
在這裏插入圖片描述

2、相同點

2.1面向對象的重要性

對編程語言經驗較少的同學,簡單科普一下,C語言是面向過程的語言,當然它可以面向對象,我用C的時候,記得以前我們SDK架構師還給專門培訓過,但是大部分做底層軟件用C語言的人並不是很熟悉面向對象。
直接點說,面向對象不熟悉的話,你會看不懂別人的代碼邏輯,團隊也不能統一編碼的風格。
使用封裝、繼承、多態,讓代碼更加高內聚低耦合。
這個比較基礎,有很多書籍資料,理解之後需要實踐才能掌握好。這裏不做過多講解。

2.2、自動垃圾回收

在System Verilog基本使用中並不用去太關心,如果是C++就一定要注意垃圾回收(因爲沒有自動回收這樣的機制),Java的某些場景下需要手動回收,雖然各種JVM已經做了很好的GC機制。

2.3、基本語法和數據結構

語法和Java類似,比C++要高級一點。但也有一些補充。
數據結構很常用的是線性表,做芯片的習慣叫FIFO,教程裏有點誤導新人,我可能會另外寫一篇博客去吐槽這個事情,哈哈。FIFO不僅是芯片驗證的UVM的組件連接會用到,在芯片設計裏也有很多而且有很大不同,水線、反壓等等,那System Verilog是沒有天然的相同設計的,當然公司會有自己的通用的庫,避免重複造輪子。

2.4、和C開發類似,常用位運算

到了芯片,那真的是比C還要底層的多,會看到很多0和1。注意計算機運算使用的是補碼,負數運算算錯了就丟人丟大了。
C語言的話,就我個人經驗,在OSI計算機網絡7層模型的二層三層會使用得多。在芯片那就是一層(物理層)和二層了,會有一定的挑戰。
在這裏插入圖片描述

2.5、設計模式

UVM框架比較好用了,雖然部門甚至項目組會自己在UVM之上再加一些東西,不過有點可惜我沒能參與到框架的這種補充工作。
常用的代理模式,用agent proxy去代理driver、monitor等。
工廠模式是UVM核心。
單例模式很常見。
觀察者模式、訪問者模式、策略模式、命令模式等等。
我業餘時間也看了一些大牛對於UVM方法學中的設計模式的整理,在知乎專欄UVM方法學與設計模式看了,對於自己會有一些幫助,但是短期很難看到效果。
在這裏插入圖片描述

2.6、版本計劃、測試策略、測試方法(芯片領域喜歡叫做高大上的驗證方法學)、測試用例、覆蓋率。

總之概念都是一致的,學過軟件測試這門課的,這些都知道。涉及硬件設計的地方,具體方法上有區別,下面第3節會說。
白盒灰盒黑盒這些概念是一致的。
單元測試、模塊測試、子系統測試、系統測試,概念一致。
從開發難度上來說,驗證雖然有一定門檻,但是在業務方面,相當於我們在OJ(Online Judge)做題時候的感覺差不多,而且有架構師訂好了方案,你要做的,是不照抄設計人員的實現方式,用自己的思路去做,當發現結果和設計人員的不一致,那就得去定位是誰的問題了。
定位問題的思路這裏不多擴展了,與業務強相關,簡單說一下,有業務經驗可以很快想到是哪個模塊,沒經驗的話,建議用二分法,總比無腦從頭看到尾的方式會高效很多。

關於相同點暫時想到這麼多,歡迎補充。

3、不同點

3.1、IC領域的特殊之處

3.1.1、開發週期較長

從定位產品到最終流片,得經歷很多階段。
比如是通用型的芯片,比如時鐘芯片,會應用在很多種類的產品上,那麼場景需求就有很多要整理和對齊的。
比如是大型的芯片,像公司主打的超強的AI芯片,或者是麒麟之類的,那複雜度和大量人力投入,能這麼快推出一代又一代。

3.1.2、與硬件設計、硬件工藝有強耦合。

不同規模(門級數)的芯片、不同工藝(5nm/7nm…)的,都有區別。走線、佈局還很可能在開發中間發現問題,進行調整。
不同芯片製造廠商(臺積電以及很多廠商),對電路的實現方式也是不同的,都有很多注意點。這些東西,驗證人員也是得涉及到的。

3.1.3、一定要注意時序!時序!

在普通的軟件編程中,沒有時鐘這樣的概念,在芯片中,有個始終在運行的時鐘,你可以理解爲計時器。在芯片中多個模塊可能有不同的時鐘域,你可以理解爲大小不同的計時器。每個拍,會做一系列的動作,數字驗證可以去高層次的模擬,但是必須得去觀察設計的波形圖,就像下面這樣(真實情況比圖片這個複雜得多,往往爲了一個測試點,會需要同時觀察多個信號,甚至追蹤幾十個信號才能得到需要的信息):
在這裏插入圖片描述
(網圖,不涉及項目,侵刪)
硬件的電路,天然就是多線程的。所以一些信號量什麼的,怎麼觸發的,什麼情況下使用斷言,什麼情況下使用定向測試用例,什麼情況下System Verilog無法模擬等等,不僅得熟悉掌握System Verilog的用法,還要一定弄懂設計的思路,對數字電路要很熟悉。
時序是最容易出問題的,需要很多基礎知識以及經驗。

關於IC領域的特殊之處,經驗有限,也就暫時想到幾個點,歡迎老司機補充。

3.2、和傳統編程語言的不同,System Verilog爲支持IC,做了什麼

推薦綠皮書《 SystemVerilog驗證》作者: 克里斯·斯皮爾 豆瓣鏈接:https://book.douban.com/subject/4014970/,部門裏人手一本。
在這裏插入圖片描述

書上內容很多,但是都得掌握,應該讓你師傅給你標記一下重點,除了也可以參考別人的博客 http://blog.sina.com.cn/s/blog_6314c0900102w0wj.html
有些東西是普通編程語言裏沒有的,或者用起來不一樣的,以下的常見的務必熟悉:
四態變量
port
線程​以及線程間的通信,fork的三種用法的區別。
隨機(用法很多),達到目的即可,也不用花裏胡哨。
覆蓋率收集
過程語句/task/function​​,因爲時序,一個是有時序一個是沒時序的。

3.3、常用框架(VMM、OVM、UVM)

UVM是演進後最新的,也很成熟,現在新人基本也是直接上手UVM。
推薦紫書《UVM實戰》,豆瓣鏈接https://read.douban.com/ebook/15305188/,把UVM的細節和比較原始的用法和高級的用法都講了,部門裏很多新人都會反覆閱讀這本書,人手一本。
在這裏插入圖片描述

3.3.1、UVM其中有些類似於Java的Spring框架的AOP(面向切面編程)機制

UVM裏,在運行的每個phase中,裏面不同的模塊,都可以面向切面編程地去在pre和post加東西,方便調試和使用,不過初學還是要多請教前輩,因爲你理解的什麼階段做什麼操作,可能不太對或者不是符合大家的習慣用法。

4、其它建議學習的

數字芯片的話,數字電路基礎紮實、模擬電路懂得越多越好(模擬芯片我就不瞭解了,向搞模擬的大佬低頭)。
信號處理,有些公式和常見的算法。
自動化控制的PID控制算法也瞭解一下,我是遇到了。
從事網絡相關的產品,那要有計算機網絡的知識基礎,計算機相關專業的倒是都懂這個。
可以看一下ARM相關的,三級五級流水線設計等等。
也可以瞭解一下嵌入式的東西,看看下游怎麼使用它。

友情提醒,軟硬雙修不是那麼好修的。

天吶,沒想到寫着寫着寫了好多,都5000字了…覺得文章有用歡迎點贊❤️收藏⭐️關注✔️轉發🔗,如有疑問請留言,或從博客主頁找到我聯繫方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章