《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > IC設(shè)計(jì)工程師需要這樣牛X的知識(shí)架構(gòu)

IC設(shè)計(jì)工程師需要這樣牛X的知識(shí)架構(gòu)

2017-06-16

剛畢業(yè)的時(shí)候,,我年少輕狂,以為自己已經(jīng)可以獨(dú)當(dāng)一面,廟堂之上所學(xué)已經(jīng)足以應(yīng)付業(yè)界需要,。然而在后來的工作過程中,我認(rèn)識(shí)了很多牛人,,也從他們身上學(xué)到了很多,,從中總結(jié)了一個(gè)IC設(shè)計(jì)工程師需要具備的知識(shí)架構(gòu),想跟大家分享一下,。

  技能清單

  作為一個(gè)真正合格的數(shù)字IC設(shè)計(jì)工程師,,你永遠(yuǎn)都需要去不斷學(xué)習(xí)更加先進(jìn)的知識(shí)和技術(shù)。因此,,這里列出來的技能永遠(yuǎn)都不會(huì)是完整的,。我盡量每年都對(duì)這個(gè)列表進(jìn)行一次更新。如果你覺得這個(gè)清單不全面,,可以在本文下留言,,我會(huì)盡可能把它補(bǔ)充完整。

  語言類:Verilog-2001/ VHDL ,SystemVerilog/ SystemC,,Makefile/ Perl/ Python/ Shell,,Tcl

  工具類:NCVerilog/ VCS/ ModelSim,SimVision/ DVE/ Verdi,,Vim/ Emacs,,SVN/ CVS/ Git,Microsoft Office

  平臺(tái)類:Windows,,Linux,,OS X

  其他加分項(xiàng)目:MATLAB,ISE/ Synplify/ Vivado/ Quartus,,LEC/Formality,,VMM/ UVM,ESL,,ZeBu Server,,JIRA/ Confluence,C/ Assembly Language,,Computer Architecture/ ARM Architecture/ MIPS Architecture

  為什么 & 怎么辦

  A) Verilog-2001/ VHDL

  這里之所以強(qiáng)調(diào)Verilog-2001而不是Verilog-1995,,是因?yàn)樵赩erilog-2001中規(guī)定了很多新特性,因此可以產(chǎn)生更好的代碼風(fēng)格,。

  我曾經(jīng)在什么是良好的Verilog代碼風(fēng)格一文中對(duì)新版的接口語法進(jìn)行過詳細(xì)的舉例說明,。這種新的接口方式修改起來更加簡(jiǎn)單,例化模塊的時(shí)候使用也更加方便,,不像舊版的接口語法由于一個(gè)接口需要分3次描述,,無端端增加了代碼行數(shù)而且閱讀和改動(dòng)都很困難,尤其是當(dāng)一個(gè)模塊的接口數(shù)目超過一個(gè)屏幕的顯示范圍時(shí)Verilog-2001的這種優(yōu)勢(shì)更加突出,。

  學(xué)習(xí)Verilog最大的問題就是:很多國(guó)內(nèi)的書寫得都很不好,,書中的很多例子都是為了說明語法特征而存在的,沒有任何實(shí)用價(jià)值,,甚至很多代碼都是錯(cuò)誤的(這里錯(cuò)誤的意思并不是說他語法錯(cuò)誤,,而是說他是不可綜合的,無法用數(shù)字電路來對(duì)等實(shí)現(xiàn)的),。

  所以,,對(duì)于學(xué)習(xí)Verilog,我的建議是,,隨便找一本類似語法手冊(cè)的書籍,,匆匆把基本語法看過一遍,搞清楚模塊定義,,接口定義,,模塊例化,,寄存器定義,,線定義,,always塊怎么寫這些基本內(nèi)容后,就開始到OpenCores網(wǎng)站上去下載已經(jīng)經(jīng)過FPGA驗(yàn)證的完整開源項(xiàng)目代碼進(jìn)行學(xué)習(xí),。先做到看懂別人寫的代碼,,然后再嘗試自己去模仿,有不懂的問題再有針對(duì)性地去網(wǎng)上搜索答案,。

  Verilog語言與軟件語言最大的區(qū)別就是,,因?yàn)樗怯糜诿枋鲭娐返模虼怂膶懛ㄊ欠浅9潭ǖ?,因?yàn)殡娐返淖兓欠浅S邢薜?。學(xué)習(xí)Verilog的時(shí)候,很多時(shí)候我們并不是在學(xué)習(xí)這門語言本身,,而是學(xué)習(xí)其對(duì)應(yīng)的電路特征,,以及如何對(duì)這個(gè)電路進(jìn)行描述。

  如果心中沒有電路,,那么你是不可能寫好Verilog的,。從基礎(chǔ)開始,一點(diǎn)點(diǎn)積累類似計(jì)時(shí)器,,譯碼器這樣的小型電路描述方法是非常重要的,。Verilog鼓勵(lì)在電路中進(jìn)行創(chuàng)新,而不是在描述方法上進(jìn)行創(chuàng)新,。因此,,即使是世界上最牛的Verilog高手,他寫出來的Verilog代碼語法也都是很普通的,,而他的創(chuàng)意則在于如何去組合這些基本的小型電路,。

61431496624132.jpg

  VHDL雖然我并不是太了解,但是目前在歐洲很多國(guó)家,,VHDL還是主流的RTL設(shè)計(jì)語言,。VHDL語言的嚴(yán)謹(jǐn)性比Verilog要好,不像Verilog中一樣存在大量符合語法卻永遠(yuǎn)無法綜合的語句,,容易對(duì)新人造成誤導(dǎo)(仿真通過的代碼卻在FPGA綜合時(shí)報(bào)錯(cuò),,或者FPGA實(shí)現(xiàn)結(jié)果與仿真不一致)。而VHDL和Verilog雖然可以相互轉(zhuǎn)化,,但是轉(zhuǎn)化過程中仍然存在很多問題,,無法做到完全的自動(dòng)化。關(guān)于這一點(diǎn)我之前寫過一篇專題進(jìn)行探討:如何將VHDL轉(zhuǎn)化為Verilog,。有興趣的同學(xué)可以去看看,。

  B) SystemVerilog/ SystemC

  這兩種語言都是為了驗(yàn)證而存在的,。作為IC設(shè)計(jì)工程師,驗(yàn)證知識(shí)不是必須的,,但是掌握基本的驗(yàn)證方法學(xué)有助于提高自己的debug效率和結(jié)果,。我曾經(jīng)在如何快速搭建模塊驗(yàn)證平臺(tái)一文中詳細(xì)介紹過一種我自己總結(jié)的驗(yàn)證方法,這種方法就是基于SystemVerilog語法實(shí)現(xiàn)的,。由于SystemVerilog對(duì)Verilog完全兼容,,就像C++對(duì)C語言的兼容一樣,所以SystemVerilog(或SV)學(xué)起來其實(shí)并不算難,。

  SystemVerilog是一種面向?qū)ο蟮恼Z言,,其設(shè)計(jì)的本意是用于搭建驗(yàn)證平臺(tái),主流的VMM/UVM方法也都是基于SystemVerilog實(shí)現(xiàn)的,,所以立志成為IC驗(yàn)證工程師的同學(xué),,SystemVerilog的深入學(xué)習(xí)和流行方法論的學(xué)習(xí)都是必不可少的。

  而對(duì)于那些只想做IC設(shè)計(jì)的同學(xué)而言,,SystemVerilog同樣也是值得學(xué)習(xí)的,。且不說本文前面提到的用于提高驗(yàn)證效率的debug方法,即使只是為了做好設(shè)計(jì),,SystemVerilog也是大有用武之地,。在歐美很多發(fā)達(dá)國(guó)家,很多世界頂級(jí)的IC設(shè)計(jì)公司內(nèi)部都已經(jīng)開始使用SystemVerilog進(jìn)行RTL設(shè)計(jì)了,。由于在SystemVerilog中加入了很多類似always_ff,、always_comb等用于顯式表明綜合電路意圖的新語法,代碼的可讀性更高,,綜合過程中也減少了歧義,,盡可能地保證了綜合結(jié)果與設(shè)計(jì)意圖的一致性。從另一個(gè)角度來說,,asserTIon的加入也極大地提高了代碼的debug效率,,非常有助于在大規(guī)模的數(shù)據(jù)交互過程中定位到出錯(cuò)的初始點(diǎn),沒有掌握的同學(xué)可以多花一些時(shí)間研究一下,。

  C) Makefile/ Perl/ Python/ Shell

  以上四種都是IC設(shè)計(jì)工程師們常用的腳本語言,,看起來似乎它們都跟IC設(shè)計(jì)的專業(yè)能力沒有絲毫關(guān)系,但是由于本行業(yè)的專業(yè)工具價(jià)格非常昂貴,,項(xiàng)目需求差異極大,,因此掌握一門得心應(yīng)手的腳本語言將對(duì)你工作效率的提升幫助極大。如果你還沒有嘗試過編寫自己的腳本語言,,那么問問你自己,,有沒有曾經(jīng)為了完成一批仿真用例熬到深夜?有沒有曾經(jīng)因?yàn)橐葘?duì)幾萬個(gè)數(shù)據(jù)搞到眼瞎?有沒有曾經(jīng)因?yàn)橐薷囊粋€(gè)全局信號(hào)的比特位寬而無比抓狂?要把一個(gè)hex類型數(shù)據(jù)文件轉(zhuǎn)換為memory模型需要的特殊格式怎么辦?沒錯(cuò),如果你掌握了腳本語言,,以上這些奇奇怪怪的需求都不是事兒,,重復(fù)而細(xì)致的體力勞動(dòng)就交給計(jì)算機(jī)來完成吧,。我一向信奉的口號(hào)就是:但凡做過一次的事情,就沒有必要重復(fù)第二次,。

  如果你已經(jīng)在工作中使用過其它工程師開發(fā)的平臺(tái)或者腳本,,那么它很可能是用這4種語言寫成的。如果執(zhí)行腳本的方式是make run,,那么很可能你用到的是一個(gè)Makefile腳本;如果執(zhí)行方式是source run,,那么這應(yīng)該是一個(gè)Shell語言寫成的腳本;如果是其它情況,,那么就得看具體這個(gè)腳本首行是怎么寫的了,。Makefile和Shell語言比Perl/Python要更容易上手,寫起來也更加簡(jiǎn)單,,比較適合滿足一些非常簡(jiǎn)單的批量任務(wù)需求,。Perl的強(qiáng)項(xiàng)則在于它強(qiáng)大的文本處理能力和無所不能的CPAN庫,隨時(shí)可以滿足你的各種任性需求,。Python的優(yōu)點(diǎn)則是較好的可維護(hù)性,。

  關(guān)于腳本語言的重要性,大家可以到這里看看相關(guān)討論:Perl等腳本語言在IC設(shè)計(jì)中有哪些用處?,。

  D) Tcl

  嚴(yán)格來說,,Tcl是一門非常單純而簡(jiǎn)單的語言,而它的學(xué)習(xí)難點(diǎn)在于,,只是掌握它的語法是遠(yuǎn)遠(yuǎn)不夠的,。這種情況有點(diǎn)類似javascript,如果你用js來開發(fā)網(wǎng)頁,,那么你必須深入了解DOM和HTML;如果你用js來開發(fā)游戲,,那么你必須深入了解Unity3D引擎的各種知識(shí);如果你用js來開發(fā)Web App,那么你必須會(huì)用node.js的各種庫和常見的服務(wù)端框架,。

  語言永遠(yuǎn)只是工具,,這句話放在Tcl上再合適不過了。在IC設(shè)計(jì)這個(gè)領(lǐng)域中,,Tcl是一門非常常見的語言,。他可以用于描述時(shí)序和管腳約束文件,UPF信息,,也可以用來搭建簡(jiǎn)單的工作平臺(tái),。它既是很多IC領(lǐng)域EDA工具默認(rèn)支持的腳本語言,也是這些工具配置和輸出的文件格式,。因此,,能夠讀懂Tcl,掌握Tcl語言的基本語法,,就可以幫助你更好的使用EDA工具,,真可謂是Tcl在手,,天下我有!

  但是,成也蕭何敗蕭何,,正如前文一開始提到的,,僅僅掌握了Tcl的語法還遠(yuǎn)遠(yuǎn)不是全部。不同的EDA工具對(duì)Tcl腳本提供的命令和參數(shù)支持都是不一樣的,,每當(dāng)你需要為一種新工具編寫Tcl腳本時(shí),,都必須要熟讀官方給出的用戶手冊(cè),了解這種工具支持的Tcl命令結(jié)構(gòu),,才能確保寫出的腳本是可以被正確執(zhí)行的,。

  E) NCVerilog/ VCS/ ModelSim/ iVerilog

  以上三種都是比較業(yè)界比較主流的仿真工具,其中NCVerilog和VCS都只支持Linux平臺(tái),,而ModelSim貌似是同時(shí)支持Linux平臺(tái)和Windows平臺(tái)的,。但是不管哪一種,我都希望大家能意識(shí)到兩件事:

  第一,,仿真器和波形查看器是兩回事,,本條目介紹的只是仿真器,仿真器的工作原理跟波形查看器是有天差地別的,,同時(shí)由于IEEE對(duì)標(biāo)準(zhǔn)波形文件*.vcd格式的規(guī)范,,任意仿真器都是可以和任意波形查看器組合使用的。

  第二,,仿真器通常是沒有圖形界面的,,為了更好地使用仿真器,你要熟讀自己常用仿真器的用戶手冊(cè),,了解一些常見需求的命令行參數(shù),,至少要做到了解如下內(nèi)容:如何指定編譯的文件類型,如何指定編譯文件清單,,如何指定索引目錄,,如何指定仿真精度,如何指定臨時(shí)的宏變量,,如何指定語法檢查的嚴(yán)苛等級(jí),,如何混合編譯由多種語言寫成的工程,如何調(diào)用不同波形生成工具的pli接口,,如何配合SDF反標(biāo)進(jìn)行后仿等等,。

  不同仿真器的功能其實(shí)都大同小異,但是是不是只掌握一種仿真器就可以打遍天下無敵手了呢?當(dāng)然不是,。在實(shí)際的工程中,,我們經(jīng)常用到第三方IP核,有時(shí)候出于保密的需要,,第三方IP核會(huì)以加密二進(jìn)制文件的方式提供,,加密二進(jìn)制文件長(zhǎng)啥樣呢?

  它們一般以“*.vp”格式命名,,文件的開頭部分就是標(biāo)準(zhǔn)的Verilog語法,但是在一行注釋之后就全部變成了亂碼,。通常亂碼之前的那行注釋會(huì)指定該加密二進(jìn)制文件支持的仿真器類型,。所以你看,如果你是一個(gè)重度VCS使用者,,而有一天項(xiàng)目經(jīng)理突然塞給你一個(gè)只支持NCVerilog的加密文件,,你內(nèi)心一定會(huì)有千萬只草泥馬呼嘯而過。

  F) SimVision/ DVE/ Verdi/ ModelSim/ gtkWave

  與上面的仿真器相對(duì)應(yīng),,以上三種也是業(yè)界比較主流的波形查看工具,。所有的波形查看器都必須支持標(biāo)準(zhǔn)波形文件*.vcd格式,但是由于*.vcd格式的存儲(chǔ)性能并不好,,冗余信息過多,,所以各家波形查看工具都紛紛推出了自己獨(dú)家支持的波形文件格式,,如DVE的*.vpd,,Verdi的*.fsdb,ModelSim的*.wlf,, SimVision的*.shm等,。通常波形查看工具獨(dú)家支持的文件格式都具有較高的壓縮率。

  舉例來說的話,,通常1G左右的*.vcd格式波形轉(zhuǎn)換為*.vpd格式后只有40MB左右,,而轉(zhuǎn)換為*.fsdb后通常會(huì)更小,因此將標(biāo)準(zhǔn)波形文件*.vcd轉(zhuǎn)換為其他壓縮格式更加有利于數(shù)據(jù)備份,。

  如果希望在仿真過程中不生產(chǎn)*.vcd,,而是直接生成壓縮率更高的其他波形查看器專用格式,則需要調(diào)用對(duì)應(yīng)工具提供的pli接口,,同時(shí)配合測(cè)試平臺(tái)代碼中的系統(tǒng)函數(shù)調(diào)用(如$fsdbDumpOn等)來完成,。

  G) Vim/ Emacs

  經(jīng)常看到一些Verilog新人提出這樣一個(gè)讓人啼笑皆非的問題:“請(qǐng)問一般Verilog編程用什么樣的軟件?

  首先,,Verilog是一種電路描述語言,,它本質(zhì)上可能跟電路圖的血緣還更近一些,至少不應(yīng)該把這個(gè)描述過程說成是“編程”,。

  其次,,寫Verilog其實(shí)并沒有什么專門的軟件,大部分業(yè)界的工程師都是用Vim或Emacs這樣原始粗獷的文本編輯器來寫Verilog代碼的,,如果你愿意的話用Notepad或Texteditor來寫也未嘗不可,,只是如果你有深入了解過Vim或Emacs的話,自然就會(huì)明白這么多人選擇它們的原因所在——提高效率,。

  1,、你是否曾經(jīng)在代碼寫完之后被老大臭罵一頓原因是你沒有把所有的reg和wire定義都放到文件的統(tǒng)一位置(如第38行)?如果使用Vim編輯器的話,,只需要使用:g%^\s*reg\s*%m 38加上:g%^\s*wire\s*%m 38就可以了。

  2,、你是否曾經(jīng)被要求刪除某個(gè)文件中所有的注釋?只需要:%s%//.*$%%g就可以了,。

  3、你是否曾經(jīng)需要把一個(gè)模塊例化256次,,然后因?yàn)槊看卫囊稽c(diǎn)微小不同導(dǎo)致你不能直接使用for循環(huán)?沒關(guān)系,,用qq錄像功能,你只需要操作一次,,然后使用256@q就可以把你的動(dòng)作自動(dòng)重復(fù)256次啦,。

  4、你是否曾經(jīng)遇到鍵盤壞掉了,,“a”鍵經(jīng)常失靈甚至沒有反應(yīng)?沒關(guān)系,,用:inoremap ‘ a把‘鍵重新映射為a鍵吧。

  類似的例子簡(jiǎn)直數(shù)都數(shù)不完,,更多內(nèi)容參見與Verilog有關(guān)的Vim實(shí)用技巧,。

  所以說,使用Vim或Emacs最大的好處就是,,你會(huì)感覺到你的大腦比手更忙,,因?yàn)閺哪阆肭宄酱a寫好只需要花費(fèi)極短的時(shí)間。你可以把全部精力投入到代碼的內(nèi)容上,,而不是代碼輸入這個(gè)機(jī)械的過程中,,就好像用打字機(jī)代替毛筆的感覺一樣。只要是你能用編程描述清楚的事情,,Vim就可以代替你快速完成,,而前提就是你要先學(xué)會(huì)大量的Vim命令和正則表達(dá)式,以保證你的表述能被編輯器正確理解,。

  G) SVN/ CVS/ Git

  以上三種都是目前比較主流的“版本管理”工具,。什么是版本管理?

  簡(jiǎn)而言之,就是一種用于記錄和查詢文件版本改動(dòng)的工具,,通常都會(huì)被部署在公共服務(wù)器上,,以保證數(shù)據(jù)的安全和可恢復(fù)。在項(xiàng)目的開始階段,,首先需要?jiǎng)?chuàng)建好版本管理的根目錄,,然后由不同的工程師逐一把自己的設(shè)計(jì)文件首次加入到版本管理的各級(jí)子目錄下。

  在項(xiàng)目執(zhí)行的過程中,,每當(dāng)有人修改一個(gè)文件,,都需要通過版本管理工具上傳代碼并注釋改動(dòng)內(nèi)容,版本管理工具會(huì)自動(dòng)檢查改動(dòng)內(nèi)容與服務(wù)器上的最新版本是否沖突(沖突的意思即是說,在該工程師改動(dòng)這個(gè)文件的過程中,,有其它人也對(duì)該文件的同一行代碼進(jìn)行了改動(dòng)并上傳了新版本),,如果沒有沖突,則會(huì)自動(dòng)將新上傳的改動(dòng)合并到當(dāng)前最新版本,,反之,,則將沖突部分進(jìn)行對(duì)比顯示,讓工程師手工判斷應(yīng)當(dāng)如何合并沖突行的內(nèi)容,,解決沖突后可以再次重新上傳,。

  H) ISE/ Synplify/ Vivado/ Quartus

  ISE和Vivado都是Xilinx旗下的FPGA工具,其中ISE比較老,,官方已經(jīng)停止更新了,,目前最新的版本是14.7,而Vivado作為新一代的FPGA工具一直在繼續(xù)更新,。Quartus則是Altera旗下的FPGA工具,,功能和ISE/ Vivado大同小異。筆者平日里對(duì)FPGA工具的接觸并不多,,但從有限的接觸體會(huì)而言,,Quartus比ISE/ Vivado更適合用于學(xué)習(xí),入門的門檻更低一些,,操作界面也更加簡(jiǎn)單易學(xué)(但千萬不要使用6.2版本以下Quartus中自帶的波形仿真工具,,那是垃圾)。

  I) Windows/ Linux/ OS X

  相信大多數(shù)人的個(gè)人計(jì)算機(jī)使用的都是以上系統(tǒng)或類似以上系統(tǒng)的其他系統(tǒng)吧,。以上3個(gè)系統(tǒng),對(duì)于專業(yè)的數(shù)字IC前端設(shè)計(jì)人員而言,,工作的方便程度(注意,,是專業(yè)人員的方便程度,而非學(xué)習(xí)曲線的陡峭程度,,這里是指均已達(dá)到熟練掌握的前提下對(duì)于工作效率的幫助)由方便到困難分別是:Linux 》 Windows 》 OS X,。

  在Windows下,你可能需要的工具有Cygwin(模擬Linux shell,,帶有大部分GNU工具),,Modelsim,Debussy(更名Verdi后的版本沒有對(duì)應(yīng)的Windows版本),, Quartus,, ISE等。在Linux下,,你可能需要的工具包括Bash/Csh/Tcsh,,Modelsim,Quartus,ISE,,VCS,,Simvision,DVE,,NCVerilog,,F(xiàn)ormality,LEC,,Synplify等,。而在OS X下(筆者不幸就位于該平臺(tái)下),你可以使用的工具就只剩下Bash/Csh/Zsh,,iVerilog,,gtkWave這些選擇了。

  從以上內(nèi)容不難看出,,在工具的多樣性角度而言,,Linux完爆其它平臺(tái),這也是為什么絕大多數(shù)IC開發(fā)公司的服務(wù)器都選擇部署在Linux下的主要原因之一,。對(duì)于個(gè)人電腦而言,,大部分同學(xué)會(huì)選擇使用虛擬機(jī)來兼顧不同平臺(tái)的工具選擇,個(gè)人建議大家最好在熟練掌握Linux平臺(tái)及其工具的前提下,,同時(shí)也了解一下其它平臺(tái)的解決方案,。

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容,、版權(quán)和其它問題,,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。