加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

溫故而知新:從電路里來,到Verilog里去!

2016/06/28
47
  • 4評(píng)論
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

?

自打說了《玩轉(zhuǎn) IP Core》和寫了《IP 核芯志》之后,老衲就沉淪了,沉迷于“秋風(fēng)功”修煉。俗話說:“坐吃山空”,見到荷包漸漸干癟,和尚我不得不再次出山了。施主們多多捧場為好。本想說說理論的事情,奈何在下道行還淺,就只得簡單的講講 Verilog 語言這個(gè)事情了,大伙兒見諒。


這個(gè)語言本不難,道和歪嘴念經(jīng)的太多,念著念著就成了 C 語言的附屬了,這個(gè)著實(shí)的大謬也??纯凑讜念}目便知:從電路里來,到 Verilog 里去!


老僧一貫不喜歡說古,對(duì)于 Verilog 語言的歷史,施主只需要知道幾個(gè)事實(shí):


1)1983 年誕生,此時(shí) EDA 設(shè)計(jì)尚處于幼年,難免有很多誤區(qū)。所以,Verilog 語言里面也存在許多“擰巴”的地方。
2)1995 年,首次被 IEEE 標(biāo)準(zhǔn)化,這就是所謂的 Verilog 95 版本。
3)2001 年,IEEE 對(duì)于 Verilog 重大更新,Verilog? 2001 面世。
4)2005 年,IEEE 又進(jìn)行了細(xì)微更正,出品了 Verilog 2005。
本書里面介紹了 2001 版本,也就是應(yīng)用最廣、軟件兼容性最強(qiáng)的版本。


1. 模塊為本,鏈接系統(tǒng)
在概念設(shè)計(jì)過程中,設(shè)計(jì)人員總是將復(fù)雜的功能劃分為簡單的功能,模塊是提供每個(gè)簡單功能的基本結(jié)構(gòu)。設(shè)計(jì)人員可以采取“自頂向下”的思路,將復(fù)雜的功能模塊劃分為低層次的模塊。這一步通常是由系統(tǒng)級(jí)的總設(shè)計(jì)師完成,而低層次的模塊則由下一級(jí)的設(shè)計(jì)人員完成。自頂向下的設(shè)計(jì)方式有利于系統(tǒng)級(jí)別層次劃分和管理,并提高了效率、降低了成本。在實(shí)際代碼編寫過程中,會(huì)采用“自下向上”的工作流程。也就是先從前面劃分好的最下層的模塊開始寫作代碼以及完成相應(yīng)的單元測試,逐次聯(lián)線打包和測試,直至完成最高層模塊及其測試。這個(gè)“自頂向下”再“自下向上”的過程,是項(xiàng)目管理研究的范疇,這里稍帶提一下。


Verilog 語言被設(shè)計(jì)用來描述復(fù)雜的硬件電路。由于上述項(xiàng)目管理模式的普遍采用,使用 Verilog 描述硬件的基本設(shè)計(jì)單元是模塊(module)。構(gòu)建簡單的子電路,然后通過子電路的連接形成較為復(fù)雜的上層電路,最終達(dá)到系統(tǒng)的設(shè)計(jì)需求。實(shí)際的自電路元件,Verilog 語言能夠提供輸入、輸出端口,可以實(shí)例調(diào)用其他模塊,也可以被其他模塊實(shí)例調(diào)用。模塊中可以包括組合邏輯部分、過程時(shí)序部分。


一個(gè)模塊如圖 1 所示,模塊一般用方框表示,但是也有例外。圖中,方框內(nèi)的名字為模塊名,指向模塊的帶肩頭線表示輸入信號(hào),由模塊向外的箭頭線表示模塊的輸出信號(hào)。輸入信號(hào)和輸出信號(hào)上面一般標(biāo)記信號(hào)名稱。例如,圖 1.3 中就是一個(gè)具有三個(gè)輸入信號(hào)(“輸入 11”,“輸入 12”和“輸入 13”)和兩個(gè)輸出信號(hào)(“輸出 11”和“輸出 12”)的模塊,模塊被命名為“模塊 1”。


圖 1 模塊的圖例


模塊之間的連接如圖 2 所示,如果模塊的輸出為另一個(gè)模塊的輸入,在圖中會(huì)合并兩個(gè)聯(lián)線(也就是說,用一個(gè)從第一個(gè)模塊指向第二個(gè)模塊的帶箭頭線來表示)。例如,圖 2 中“模塊 1”的兩個(gè)輸出連接到了“模塊 2”的兩個(gè)輸入。沒有在模塊之間連接的信號(hào),則表示該信號(hào)是外部信號(hào),例如“模塊 2”的輸入 3 信號(hào)。


圖 2 模塊之間的連接


多個(gè)模塊可以打包為一個(gè)上層的模塊,如圖 3 所示。圖中,把圖 3 里面的兩個(gè)模塊打包成為了一個(gè)上層模塊:“模塊 3”。生成的上層模塊的輸入和輸出一定包含低層模塊之間未連接的信號(hào),但是也可以包括低層模塊之間的連接信號(hào)。


圖 3 模塊打包為上層模塊


具體這些模塊設(shè)計(jì)、模塊連接以及模塊打包如何完成,后文書自有交待。

?


2. 電路設(shè)計(jì),二虎擋道
在任何一本《數(shù)字電子技術(shù)》教材的某個(gè)犄角旮旯,總有類似下面的論述。


組合邏輯電路中,同一信號(hào)經(jīng)不同的路徑傳輸后,到達(dá)電路中某一會(huì)合點(diǎn)的時(shí)間有先有后,這種現(xiàn)象稱為邏輯競爭,而因此產(chǎn)生輸出干擾脈沖的現(xiàn)象稱為冒險(xiǎn)。


競爭(Competition)定義為:在組合邏輯電路中,某個(gè)輸入變量通過兩條或兩條以上的途徑傳到輸出端,由于每條途徑延遲時(shí)間不同,到達(dá)輸出門的時(shí)間就有先有后,這種現(xiàn)象稱為競爭。把不會(huì)產(chǎn)生錯(cuò)誤輸出的競爭的現(xiàn)象稱為非臨界競爭。把產(chǎn)生暫時(shí)性的或永久性錯(cuò)誤輸出的競爭現(xiàn)象稱為臨界競爭。


冒險(xiǎn)(Risk)定義為:信號(hào)在器件內(nèi)部通過連線和邏輯單元時(shí),都有一定的延時(shí)。延時(shí)的大小與連線的長短和邏輯單元的數(shù)目有關(guān),同時(shí)還受器件的制造工藝、工作電壓、溫度等條件的影響。信號(hào)的高低電平轉(zhuǎn)換也需要一定的過渡時(shí)間。由于存在這兩方面因素,多路信號(hào)的電平值發(fā)生變化時(shí),在信號(hào)變化的瞬間,組合邏輯的輸出有先后順序,并不是同時(shí)變化,往往會(huì)出現(xiàn)一些不正確的尖峰信號(hào),這些尖峰信號(hào)稱為‘毛刺’。如果一個(gè)組合邏輯電路中有‘毛刺’出現(xiàn),就說明該電路存在冒險(xiǎn)。


競爭冒險(xiǎn)都是由于延遲時(shí)間的存在,當(dāng)一個(gè)輸入信號(hào)經(jīng)過多條路徑傳送后又重新會(huì)合到某個(gè)門上,由于不同路徑上門的級(jí)數(shù)不同,或者門電路延遲時(shí)間的差異,導(dǎo)致到達(dá)會(huì)合點(diǎn)的時(shí)間有先有后,從而產(chǎn)生瞬間的錯(cuò)誤輸出。”


為什么每次讀教科書,都覺得是大筒木輝夜的驚天陰謀呢?有一種不讓讀者進(jìn)入無限月讀,誓不罷休的霸氣外露(典故見《火影忍者疾風(fēng)傳》)。當(dāng)然這是題外話,大家一樂一樂(非拉面廣告?。?。列位稍安勿躁,待貧道說人話解釋一番。


競爭就是三字經(jīng)“人之初,性本善。性相近,習(xí)相遠(yuǎn)”的道理。同一個(gè)服務(wù)器的數(shù)據(jù)包,有的是電驢 P2P(點(diǎn)對(duì)點(diǎn),point? to point)幾乎及時(shí)到達(dá),有的卻莫名其妙被發(fā)配去糧食基地米國周游了一圈五分鐘才到您老的計(jì)算機(jī)網(wǎng)口。如果這個(gè)是上網(wǎng)瀏覽一點(diǎn)網(wǎng)頁,還倒罷了,這就是非臨界的。假使這個(gè)是看視頻,這個(gè)就卡那里了,用戶會(huì)很不爽,這就算臨界競爭了。


冒險(xiǎn)的情況,壞就壞在“分進(jìn)合擊”上面。一組本來好好的輸入,非要經(jīng)過不同道路到達(dá)器件,結(jié)果可好有了時(shí)間差了,再被已處理后果不堪設(shè)想。


3. 時(shí)序器件,建立保持
問題從最簡單的開始解決,這是一個(gè)原則。先來瞧瞧一個(gè) D 觸發(fā)器對(duì)于輸入信號(hào)的要求,就是耳朵都聽出繭子的建立時(shí)間和保持時(shí)間問題。建立時(shí)間(英文 Set up time,簡寫 Tsu),是指觸發(fā)時(shí)鐘沿(一般為時(shí)鐘信號(hào)的上升沿,本書中也沿用這個(gè)約定)到達(dá) D 觸發(fā)器之前,要求輸入信號(hào)必須已經(jīng)達(dá)到穩(wěn)定的時(shí)間。對(duì)應(yīng)的,保持時(shí)間(英文 Hold time,簡寫 Th),是指觸發(fā)時(shí)鐘沿到達(dá) D 觸發(fā)器之后,要求輸入信號(hào)還需要保持必須穩(wěn)定的時(shí)間。建立時(shí)間、保持時(shí)間相對(duì)于觸發(fā)時(shí)鐘沿的關(guān)系,如圖 4 所示。


圖 4 建立時(shí)間、保持時(shí)間相對(duì)于觸發(fā)時(shí)鐘沿的關(guān)系


“我們都是木頭人,不許說話不準(zhǔn)動(dòng)”,建立時(shí)間和保持時(shí)間就是輸入信號(hào)的“木頭人時(shí)間”。做游戲的時(shí)候,“木頭人時(shí)間”內(nèi)有了晃動(dòng)或者出聲,那游戲就輸了。電路里面,如果輸入信號(hào)在建立時(shí)間或者保持時(shí)間里面發(fā)生了變化,那就是仿真(尤其是時(shí)序仿真)里面所謂“全國山河一片紅”了,那個(gè)絕對(duì)是災(zāi)難(聲明:貧道與中國臺(tái)灣沒有關(guān)系)。
不推導(dǎo)“復(fù)雜”公式,直接給結(jié)論:要滿足建立與保持時(shí)間,時(shí)序系統(tǒng)才能穩(wěn)定工作。


對(duì)于 FPGA 設(shè)計(jì),這個(gè)“滿足”是靠寫時(shí)序約束,來教導(dǎo)綜合軟件和布局布線軟件實(shí)現(xiàn)的。


首先,這里解答“什么是布局布線”這個(gè)問題。簡單理解,“布局布線”就是在器件(FPGA/ASIC)里面畫 PCB。布局是把器件放到相應(yīng)的位置上,布線是把有關(guān)聯(lián)的器件連接起來。

?


機(jī)器都是笨的,即使是號(hào)稱“電腦”的計(jì)算機(jī),需要人來操作才能完成需要的任務(wù)。如果僅僅把設(shè)計(jì)給了設(shè)計(jì)環(huán)境,不做任何設(shè)計(jì)上的說明(也即所謂的“時(shí)序約束”),機(jī)器絕對(duì)會(huì)搞出一些工程師不希望的結(jié)果出來。記?。喝魏喂ぞ叨疾粫?huì)注重嘗試尋找到達(dá)最快的布局布線結(jié)果。這個(gè)正如畫 PCB 的工程師絕對(duì)不會(huì)使用軟件提供的所謂“自動(dòng)功能”。


最常用的時(shí)序約束有時(shí)鐘、輸入輸出時(shí)延和“虛假路徑”幾種,下面一一介紹:


時(shí)鐘的頻率和性質(zhì)決定了其他時(shí)延的上限。時(shí)鐘頻率越高、時(shí)鐘抖動(dòng)越大,允許的布局布線時(shí)延以及組合邏輯時(shí)延也就越小。


時(shí)鐘信號(hào)包括三個(gè)性質(zhì):周期與占空比、時(shí)鐘間的偏移和時(shí)鐘的抖動(dòng)。如圖 5 所示,時(shí)鐘的周期定義為理想時(shí)鐘的兩個(gè)觸發(fā)沿之間的時(shí)間間隔;時(shí)鐘的占空比定義為一個(gè)周期內(nèi),理想時(shí)鐘高電平“1”信號(hào)占整個(gè)時(shí)鐘周期的比例;時(shí)鐘之間的偏移定義為兩個(gè)同源時(shí)鐘之間的、固定的出發(fā)沿的時(shí)間差;時(shí)鐘的抖動(dòng)定義為一個(gè)時(shí)鐘信號(hào)相對(duì)于理想時(shí)鐘,上升沿與下降沿可能變換的前后范圍。最后多嘴一句,這些實(shí)際系統(tǒng)中的時(shí)鐘與理想時(shí)鐘的差別是芯片內(nèi)的“時(shí)鐘樹”造成的。


圖 5? 時(shí)鐘的時(shí)序約束參數(shù)


下面兩折比較類似,現(xiàn)在合并演出(臺(tái)下:偷工減料,退票!):輸入 / 輸出路徑時(shí)延表標(biāo)記芯片的前端 / 后端芯片的時(shí)序特性 / 要求。這個(gè)基本上就是,把前端芯片看作 D 觸發(fā)器,告訴工具前端芯片的輸出時(shí)延,這樣可以保證系統(tǒng)對(duì)于輸入可以可靠采樣。同樣的,把后端芯片看作 D 觸發(fā)器,通知工具后端芯片的建立時(shí)間和保持時(shí)間,可以保證可靠的信號(hào)輸出。整個(gè)系統(tǒng)的鏈接情況,如圖 6 所示。


圖 6 輸入 / 輸出路徑時(shí)延


下一出是《珍珠塔》,“皇帝家也有三門草鞋親,謝謝”(這就完了!?臺(tái)下騷動(dòng):“退票!退票!”)。實(shí)際系統(tǒng)中,很少有必須工作時(shí)間都一致的,總會(huì)存在一些“急先鋒”遇到的“慢郎中”的。別抬杠,您老沒遇到,只能說明您還毛嫩。多周期的時(shí)序約束,實(shí)際上是減少布局布線壓力的,這個(gè)和前面 存在差異。對(duì)于這些需要計(jì)算較慢的單元 / 路徑,可以降低要求,把好的資源讓渡給需要快速的部分使用。圖 7 就是一個(gè)例子,上面是需要快速解決的單元們,下面是可以“慢慢來”的部分。多周期約束定義了到底可以多慢做完這個(gè)工作。


圖 7 多路徑約束


最后出場的就是“虛假路徑”這個(gè)草包,主要表現(xiàn)時(shí)鐘域之間路徑和測試邏輯,工具對(duì)這類任務(wù)也采取不聞不問、聽之任之的態(tài)度。

?


4. 定制器件,細(xì)節(jié)入手
FPGA 才是“上得廳堂,下得廚房,安得系統(tǒng),打得流氓”的多面手,其結(jié)構(gòu)如圖 8 所示。


圖 8 某 FPGA 的功能結(jié)構(gòu)圖


其中包括可編程輸入輸出單元(IOB,Input Output Block)、可配置邏輯塊(CLB,Configurable Logic Block)、數(shù)字時(shí)鐘管理模塊(DCM,Digital Clock Management) 和嵌入式塊 RAM(BRAM,Block RAM) 等部分。這個(gè)里面與 Verilog 語言設(shè)計(jì)電路有關(guān)的部分是 CLB,揭開 CLB 的蓋頭來,您老將會(huì)看到如圖 9 所示的一副尊容。以 Xilinx 公司的 FPGA 器件為例,CLB 由多個(gè)(一般為 2 個(gè)或 4 個(gè))相同的 Slice(這個(gè)詞還真不好翻譯,查了半天度娘,看到唯一靠點(diǎn)譜的說法是邏輯片)和附加邏輯構(gòu)成。其中,Slice 是基本的邏輯電路實(shí)現(xiàn)單元,屬于中等后面介紹;外圍電路中,開關(guān)網(wǎng)絡(luò)主要完成一般信號(hào)的可配置連接,快速連接線進(jìn)行時(shí)鐘和復(fù)位等關(guān)鍵信號(hào)的連接。


圖 9 Xilinx 公司 FPGA 中 CLB 的結(jié)構(gòu)圖


Slice 的結(jié)構(gòu)如圖 10 所示,一個(gè) Slice 由兩個(gè) 4/6 輸入的 LUT(查找表,Look Up Table)、進(jìn)位算術(shù)邏輯、D 觸發(fā)器和函數(shù)復(fù)用器組成。算術(shù)邏輯包括一個(gè)異或門和一個(gè)專用與門,一個(gè)異或門可以使一個(gè) Slice 實(shí)現(xiàn) 2bit 全加操作,專用與門用于提高乘法器的效率(這個(gè)后文書有詳細(xì)講解,這里屬于“看熱鬧”的內(nèi)容);進(jìn)位邏輯由專用進(jìn)位信號(hào)和函數(shù)復(fù)用器(MUXC)組成,還包括兩條快速進(jìn)位鏈,用于提高 CLB 模塊的處理速度,用于實(shí)現(xiàn)快速的算術(shù)加減法操作。4 輸入 LUT 用于實(shí)現(xiàn)組合邏輯運(yùn)算。


圖 10 Xilinx 公司某款 FPGA Slice 的結(jié)構(gòu)


同學(xué)們有沒有感到驚訝呢?如果有,說明你的《數(shù)字電子技術(shù)》的學(xué)費(fèi)沒白交。說好的用于組合邏輯的門級(jí)電路呢?還有編碼器、譯碼器等等,等等?這些器件都沒有,怎么設(shè)計(jì)組合邏輯?。俊帮L(fēng)蕭蕭兮易水寒,虞兮虞兮奈若何?”


LUT 本質(zhì)上就是一個(gè) RAM,里面存著真值表。目前 FPGA 中,多數(shù)采用 4 輸入的 LUT,所以每一個(gè) LUT 可以看成一個(gè)有 4 位地址線的 的 RAM。 當(dāng)用戶通過原理圖或 HDL 語言描述了一個(gè)邏輯電路以后,EDA 軟件會(huì)自動(dòng)計(jì)算邏輯電路的所有可能結(jié)果,并把真值表事先寫入 RAM。這樣,每輸入一個(gè)信號(hào)進(jìn)行邏輯運(yùn)算就等于輸入一個(gè)地址進(jìn)行查表,找出地址對(duì)應(yīng)的內(nèi)容,然后輸出即可。對(duì)于輸入高于 4 比特的輸入,EDA 軟件會(huì)自動(dòng)把輸入拆分成若干 LUT,最后聯(lián)合輸出。(真值表是什么,這個(gè)不用講了吧。不懂的人,數(shù)電考試肯定作弊的,回去重修?。┕俜秸f法是:“由于基于 LUT 的 FPGA 具有很高的集成度,其器件密度從數(shù)萬門到數(shù)千萬門不等,可以完成極其復(fù)雜的時(shí)序與邏輯組合邏輯電路功能,所以適用于高速、高密度的高端數(shù)字邏輯電路設(shè)計(jì)領(lǐng)域” 。所以本書介紹的結(jié)構(gòu)竟然是流行趨勢,好極好極!


最后來看一看開發(fā)流程里面的“綜合”這個(gè)過程,那些“優(yōu)化”什么的亮瞎鈦合金狗眼的概念,對(duì)于 FPGA 的組合邏輯方面還存在嗎?我們估計(jì)獨(dú)立思考。貧道聞到了退化的味道。這也不是說 EDA 軟件沒用,LUT 組合方面的算法還是可圈可點(diǎn)的嘛。

?


5. 語言缺陷,電路子集
Verilog 設(shè)計(jì)之初就號(hào)稱可以一次打兩只鳥:設(shè)計(jì)和驗(yàn)證,殊不知這兩個(gè)方向的思路卻相差很大。數(shù)字邏輯的設(shè)計(jì)是基于數(shù)電的,受限制于電路器件的特性;反觀數(shù)字邏輯系統(tǒng)的驗(yàn)證,這是一個(gè)純粹軟件仿真的活計(jì),工程師更加喜歡一般程序設(shè)計(jì)語言的思路。在老衲參與的很多技術(shù)討論里面發(fā)現(xiàn),這“兩鳥”不僅僅沒有打到,這把“米”是一定“蝕”了。大多數(shù)初學(xué)者完全分不清那些可以綜合,那些不可以。


老僧也在總結(jié)這個(gè)現(xiàn)象的原因,吾稱之為:“教不得法,學(xué)不得法”?!敖滩坏梅ā笔侵福芏嚓P(guān)于 Verilog 的書繼承了程序語言教材的結(jié)構(gòu),把語句分為:算術(shù)運(yùn)算、條件判斷和循環(huán)等等部分,完全不區(qū)分可綜合性,這樣有誤導(dǎo)的嫌疑;“學(xué)不得法”是一個(gè)歷史原因,大多數(shù)學(xué)習(xí)者實(shí)際上具有很強(qiáng)的程序語言,例如 C 語言,的基礎(chǔ),這反而是有害的。人的思維是有習(xí)慣性的,Verilog 的形式又與 C 語言很類似,所以多數(shù)人都把 C 語言設(shè)計(jì)里面的習(xí)慣不自覺的帶入了 Verilog 語言的電路實(shí)現(xiàn)。于是乎,綜合軟件上報(bào)的錯(cuò)誤“如滔滔江水,綿綿不絕”,實(shí)現(xiàn)與想象不一致也是“如黃河泛濫,一發(fā)不可收拾”。以上是一家之言啊,切勿對(duì)號(hào)入座,否則必有受傷者,老衲不負(fù)責(zé)醫(yī)藥費(fèi)!


數(shù)字電路和程序語言的區(qū)別,別告訴我您不知道。下面姑且總結(jié)幾條,叫大家以后面試的時(shí)候,可以說得頭頭是道。


1. 對(duì)應(yīng)于仿真:C 語言的代碼是一行一行執(zhí)行的,屬于順序結(jié)構(gòu);而 Verilog 是一種硬件描述語言,語句同時(shí)進(jìn)行,屬于并行結(jié)構(gòu)。
這個(gè)特點(diǎn)說起來有點(diǎn)抽象,我們舉一個(gè)例子吧。就對(duì)于某家上面舉出的代碼,減震器記得時(shí)刻到了。


表 1 兩種語言的仿真方式差別

?

  1. 語言
Verilog

代碼

int a, b, c;

……

c? = a;

a = b;

b = c;

……

reg [0:7] a, b, c;

……

always @ (posedge Clock)

begin

……

c <= a;

a <= b;

b <= c;

……

end

初始值

a = 1; b = 2; c =3

結(jié)果

a = 2; b = 1; c = 1

第一節(jié)拍:a = 2; b = 3; c = 1;

第二節(jié)拍: a = 3; b = 1; c = 2;

第三節(jié)拍:? a = 1; b = 2; c = 3;

第四節(jié)拍:a = 2; b = 3; c = 1;

……


“不看不知道,世界真奇妙”,套用以前《正大綜藝》的臺(tái)詞。見到黃河了?佛主說:回頭是岸,南無阿彌陀佛。


避繁就簡,結(jié)合網(wǎng)上度娘出來的資料,老衲針對(duì) Verilog 可綜合性設(shè)計(jì),分別 FPGA 和 ASIC 的情況,給列位總結(jié)出了表 2(內(nèi)部資料,注意保密)。表里面可能有一些超前的概念,例如 always、循環(huán)和阻塞 / 非阻塞賦值等,這些會(huì)在后文書里面介紹,這里先說聲對(duì)不起。


表 2 Verilog 可綜合性設(shè)計(jì)原則匯總表

原則

FPGA 適用

ASIC 適用

不使用初始化賦值

不適用

適用

不使用時(shí)延

適用

適用

不使用循環(huán)次數(shù)不確定的循環(huán)語句

適用

適用

不使用移位次數(shù)不確定的移位操作

不適用

適用

不使用復(fù)雜運(yùn)算,如乘法、除法,冪等

依賴于綜合軟件

適用

不使用用戶自定義原語

適用

適用

盡量使用同步方式設(shè)計(jì)電路

適用

適用

除非是關(guān)鍵路徑的設(shè)計(jì),一般不采用調(diào)用門級(jí)元件來描述設(shè)計(jì)的方法,建議采用行為語句來完成設(shè)計(jì)

適用

不適用

一些組合邏輯優(yōu)化可使用門電路簡化

用 always 過程塊描述組合邏輯,應(yīng)在敏感信號(hào)列表中列出所有的輸入信號(hào)

僅適用于 Verilog 95

僅適用于 Verilog 95

所有的內(nèi)部寄存器都應(yīng)該能夠被復(fù)位,在使用 FPGA 實(shí)現(xiàn)設(shè)計(jì)時(shí),應(yīng)盡量使用器件的全局復(fù)位端作為系統(tǒng)總的復(fù)位

適用

適用

對(duì)時(shí)序邏輯描述和建模,應(yīng)盡量使用非阻塞賦值方式

適用

適用

對(duì)組合邏輯描述和建模,既可以用阻塞賦值,也可以用非阻塞賦值

適用

適用

同一個(gè)過程塊中,最好不要同時(shí)用阻塞賦值和非阻塞賦值

適用

適用

不能在一個(gè)以上的 always 過程塊中對(duì)同一個(gè)變量賦值

適用

適用

對(duì)同一個(gè)賦值對(duì)象不能既使用阻塞式賦值,又使用非阻塞式賦值

適用

適用

避免混合使用上升沿和下降沿觸發(fā)的觸發(fā)器

適用

適用

同一個(gè)變量的賦值不能受多個(gè)時(shí)鐘控制,也不能受兩種不同的時(shí)鐘條件(或者不同的時(shí)鐘沿)控制

適用

適用

避免在 case 語句的分支項(xiàng)中使用 x 值或 z 值

與綜合軟件有關(guān)

與綜合軟件有關(guān)


話說兩頭,老衲從來不提倡先寫代碼,然后去看能不能綜合的設(shè)計(jì)步驟。老僧把那叫做“C Style”、“邏輯派”或者“語法黨”,某家提倡的是“電路門”。早在《IP 核芯志》里面,吾就說過了:“看圖說話基本法,電路映射程序中?!?,這是不二法門。聽不懂嗎?就是先畫電路 / 時(shí)序 / 狀態(tài)轉(zhuǎn)移圖,再去寫代碼的意思!還不懂?完全無語了,容我冷靜一下。


這正是:

遠(yuǎn)看石塔黑乎乎,上面細(xì)來下面粗。有朝一日翻過來,下面細(xì)來上面粗。
都曉倒著很懸乎,重心不穩(wěn)難以扶。不知語言學(xué)習(xí)路,也要數(shù)電加基礎(chǔ)。


?

與非網(wǎng)原創(chuàng)內(nèi)容,謝絕轉(zhuǎn)載!

如果有任何技術(shù)問題,歡迎留言提問~~

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

本名:吳濤,通信專業(yè)博士,畢業(yè)后十多年從事無線通訊產(chǎn)品的研發(fā)工作。了解W-CDMA、TDS-CDMA和LTE的標(biāo)準(zhǔn)協(xié)議、接收機(jī)算法以及系統(tǒng)架構(gòu)和開發(fā)。從事過關(guān)于W-CDMA的FPGA IP core設(shè)計(jì)工作,也完成過W-CDMA和TDS-CDMA的接收機(jī)理論研究和鏈路仿真工作。綜合上面的工作,最終選擇了無線通訊的系統(tǒng)設(shè)計(jì)和標(biāo)準(zhǔn)設(shè)計(jì)工作。目前擁有100多個(gè)已授權(quán)的發(fā)明專利,是某通訊行業(yè)標(biāo)準(zhǔn)文件的第一作者,亦有專利思想被寫入3GPP協(xié)議。已出版FPGA設(shè)計(jì)專業(yè)著作《IP核芯志-數(shù)字邏輯設(shè)計(jì)思想》和《Verilog傳奇-從電路出發(fā)的HDL代碼設(shè)計(jì)》。