0 緒論
經(jīng)過了上篇文章的文檔設(shè)計(jì),我們這一章開始寫代碼。碼代碼這個(gè)問題確實(shí)是一個(gè)必備技能,任何設(shè)計(jì)不會碼代碼其實(shí)無法實(shí)現(xiàn)的。
這塊兒流程上包括了兩個(gè)東西。第一個(gè)碼代碼,第二個(gè)是一些必要的代碼檢查,保證代碼不會出現(xiàn)什么歧義導(dǎo)致實(shí)現(xiàn)結(jié)果和設(shè)計(jì)意圖不一致。具體語法我們就不在這一章講了,寫出來也是千篇一律,此處就簡單講講HDL的簡介,同時(shí)講一下如何提高編碼質(zhì)量,供大家參考。然后簡單講一個(gè)代碼寫完必要的檢查工序spyglass檢查,這個(gè)工具可以避免大部分低級BUG。
1 碼代碼
1.1 HDL簡介
此處的代碼主要指的是HDL, hardware design language, 最主流的只有一種:Verilog,以及它的衍生品system verilog。其實(shí)還有兩種語言,VHDL,屬于它的時(shí)代已經(jīng)過去了, 還有一種Chisel為代表的高級語言,屬于它的時(shí)代似乎還沒到來。所以我們這個(gè)地方重點(diǎn)講講verilog。
verilog 1983年被gateway設(shè)計(jì),1990年gateway被candance收購。然后90年代出了第一個(gè)標(biāo)準(zhǔn)Verilog-95,定義了最原始的語法。直到現(xiàn)在,部分公司還是只允許使用95中的特性。2001年公布新一代標(biāo)準(zhǔn),verilog-2001, 這一代標(biāo)準(zhǔn)中加入了generate, 多維數(shù)組等等實(shí)用的語法,現(xiàn)在是verilog使用最主流的標(biāo)準(zhǔn),基本上所有的軟件工具鏈都支持該標(biāo)準(zhǔn),后續(xù)verilog更新了一代標(biāo)準(zhǔn)verilog2005, 不過這一代標(biāo)準(zhǔn)開始向著一個(gè)獨(dú)立的方向演變,最后被合并到了systemverilog 2009。system verilog中提供了interface等等一系列面向?qū)ο蟮姆椒?,已?jīng)廣泛被驗(yàn)證支持了,但是在設(shè)計(jì)實(shí)現(xiàn)中只被支持了少部分特性。具體什么特性允許使用其實(shí)各個(gè)公司都有自己的看法與標(biāo)準(zhǔn),你需要注意一下公司的編碼標(biāo)準(zhǔn)。從我個(gè)人的觀點(diǎn)來看,如果確認(rèn)新特性沒問題最好用新特性,減少工作量的同時(shí)還能避免代碼出低級錯(cuò)誤。
verilog代碼長這樣。下面實(shí)現(xiàn)了一個(gè)十進(jìn)制的計(jì)數(shù)器。
1.2 編碼質(zhì)量
Verilog其實(shí)不是一個(gè)很難的語言,但是由于比較落后,編碼質(zhì)量很多需要人為來注意。編碼質(zhì)量主要就是兩個(gè)方面考慮。容易出錯(cuò)的點(diǎn)以及提高后續(xù)步驟效率的點(diǎn)。常見容易出錯(cuò)的點(diǎn)大家應(yīng)該都懂,此處簡單總結(jié)了一下我覺得需要了解又容易被忽略的點(diǎn),歡迎大家補(bǔ)充。
1.2.1 容易出錯(cuò)的點(diǎn)
·命名有意義,代碼有注釋。這個(gè)任何編程語言都需要注意,我把它列在第一點(diǎn),這是一個(gè)碼農(nóng)最起碼的素質(zhì)。即可以避免自己出錯(cuò),又可以避免接手代碼的人一頭霧水。我也看過不少代碼沒注釋,命名還全是tmp1 tmp2 tmp3, 最后結(jié)局只能是自己重寫。
·信號不要以Reg以及數(shù)字結(jié)尾。這個(gè)點(diǎn)很容易被忽略,綜合時(shí)會自動給信號加上reg, 到時(shí)候就沒辦法區(qū)分是你寫的,還是自動生成的,非要標(biāo)識這是個(gè)寄存器可以用ff結(jié)尾。同時(shí),如果多組信號不要命名為xx1,xx2, 這么做非常容易和xx[1]混淆,建議改成xxa, xxb。
·敏感列表用*,不要用具體的信號。always實(shí)現(xiàn)組合邏輯的時(shí)候一個(gè)敏感列表always @(列表),這個(gè)列表直接用*,讓綜合去自動填敏感列表,把信號寫進(jìn)去非常容易出錯(cuò)。
·少用magic numer。設(shè)計(jì)的時(shí)候好多時(shí)候需要用到參數(shù),比如fifo的深度,這種東西盡量用參數(shù)表示出來,不同地方引用一個(gè)參數(shù),否則非常容易出現(xiàn)不一致的情況。
·不要生產(chǎn)latch。latch指的是沒有鎖存的寄存,生成latch會產(chǎn)生毛刺,所以非必要不允許使用latch。之所以產(chǎn)生latch其原理是你實(shí)現(xiàn)了組合邏輯,但是某個(gè)周期某個(gè)變量值沒有發(fā)生變化。所以牢記規(guī)律,時(shí)序邏輯值可以不變,但組合邏輯必須每個(gè)周期都賦值。具體點(diǎn)講,實(shí)現(xiàn)組合邏的時(shí)候,case必須有default, if必須有else。
·不要生產(chǎn)組合邏輯環(huán)。組合邏輯環(huán)指的是同周期A變化的條件是B,而B變化依賴于A。相當(dāng)于軟件中的死循環(huán)。功能上就不可能正確,所以設(shè)計(jì)的時(shí)候要記得避免組合邏輯環(huán)。
·異步信號不要直接打拍。異步信號需要特別注意。在詳設(shè)的時(shí)候應(yīng)該就要考慮清楚怎么處理。是用多級打拍,DMUX,異步FIFO等等辦法,總之,不能當(dāng)做同步信號給直接處理了,否則必出錯(cuò)。
1.2.2 提高后續(xù)效率需要注意的點(diǎn)
·盡量一個(gè)模塊用一個(gè)時(shí)鐘域。主要是為了后端設(shè)計(jì)起來比較方便,CTS步驟(見后續(xù)文章)較容易。
·大的模塊最好reg in和reg out??梢宰畲蟪潭壬媳苊夂蠖藭r(shí)序上出問題。因?yàn)楹蠖四K與模塊之間不一定是按著放的,寄存器輸出寄存器輸入留出足夠的時(shí)間余量。
·不可綜合的與可綜合的代碼分模塊。設(shè)計(jì)代碼的時(shí)候有時(shí)候可能會用到SRAM cell, 或者其他硬核IP,再或者designware IP。這些東西最好單獨(dú)封裝模塊調(diào)用。主要是為了后續(xù)代碼可能會用FPGA或者emulation驗(yàn)證,不可綜合的部件直接替換成邏輯版本。
碼代碼部分內(nèi)容大致就是這些。其實(shí)也不必壓力太大,因?yàn)榇a寫出來是要經(jīng)過多輪工具檢查的。尤其經(jīng)過下面講的spyglass檢查后,想出錯(cuò)也沒有那么容易(當(dāng)然,一旦出錯(cuò)就是非常隱蔽的錯(cuò)誤,可能流片后都沒發(fā)現(xiàn)Orz)
2 Spyglass檢查
碼完代碼,其實(shí)我們有一個(gè)非常強(qiáng)力的工具可以避免大部分低級錯(cuò)誤。這個(gè)工具應(yīng)該是synopsys公司出的。這個(gè)工具的GUI長這樣。
最主要檢查的東西應(yīng)該有兩個(gè),lint檢查一些常用的語法錯(cuò)誤,CDC (Clock Domain Crossing )檢查異步的處理是不是有問題。
lint會檢查出所有等號左右位寬不匹配、組合邏輯環(huán)、生成了latch, 端口連接不對等等問題?;旧铣R姷腻e(cuò)誤都會報(bào)出來,一般它會采用寧可錯(cuò)殺不會放過的策略。所以此處會爆出一大堆的錯(cuò)誤,需要逐個(gè)check一下有沒有問題。當(dāng)然,好多問題也是可以waive掉的,但必須每個(gè)waive都要十分確定能不能waive掉。比如計(jì)數(shù)器,一般計(jì)數(shù)器到溢出就自動回環(huán)了,這種時(shí)候lint就會爆出錯(cuò),你就要檢查一下是不是真的要讓計(jì)數(shù)器回環(huán)。一般spygalss給你報(bào)的錯(cuò)分為四類,fatel, error, warning, info。其中fatel和error是一定不能有的, 有了必然不讓你拿去流片,warning可以適當(dāng)waive,info大多不用管。
CDC會檢查異步問題。主要檢查是不是所有跨時(shí)鐘域的信號經(jīng)過了同步,如果spyglass沒檢查到跨時(shí)鐘域的信號沒有經(jīng)過多級打拍或者dmux同步會報(bào)錯(cuò)。再比如A時(shí)鐘域的兩個(gè)信號同步到了B時(shí)鐘域,然后合并了,這個(gè)時(shí)候也會報(bào)錯(cuò),因?yàn)檫@兩個(gè)信號同步過去以后時(shí)序可能會發(fā)生變化,要仔細(xì)檢查。再比如要同步的信號不是寄存器輸出的,這種情況由于存在毛刺風(fēng)險(xiǎn),會增大亞穩(wěn)態(tài)的概率,所以也會報(bào)出來。總之, 你能想到的錯(cuò)誤基本上都會檢查出來。
本部分主要簡單介紹了編碼完后要用到的最重要的工具之一spyglass。實(shí)際使用的時(shí)候確實(shí)也要有一定的經(jīng)驗(yàn)積累,什么問題可以waive掉,什么問題必須改。沒必要所有問題都改掉,耗費(fèi)的精力實(shí)在是太大,但真的存在風(fēng)險(xiǎn)的問題必須改掉,否則就可能搞出大事兒。。。
3 總結(jié)
本節(jié)我們講了芯片實(shí)現(xiàn)碼代碼的部分。主要就是verilog以及后續(xù)的檢查。芯片流片是一錘子買賣,所以一定要保證寫的代碼不出錯(cuò),一方面,在本節(jié)講的編碼階段要盡量少寫bug, 另一方面,要經(jīng)過縝密的驗(yàn)證,最大程度上攔截BUG。
審核編輯 :李倩
-
芯片
+關(guān)注
關(guān)注
455文章
50816瀏覽量
423613 -
vhdl
+關(guān)注
關(guān)注
30文章
817瀏覽量
128137 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68612
原文標(biāo)題:一顆芯片的前世今生:設(shè)計(jì)(前端之編碼)
文章出處:【微信號:IP與SoC設(shè)計(jì),微信公眾號:IP與SoC設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論