入門(mén) 結合一兩個(gè)小項目把上面所說(shuō)的事情都做好后,差不多就可以進(jìn)入入門(mén)的階段了(要求稍微嚴格了一點(diǎn)點(diǎn),呵呵)。 入門(mén)階段要學(xué)的有:設計時(shí)序;理解約束的原理及如何加約束。 先談?wù)勗O計時(shí)序。 設計時(shí)序是進(jìn)行邏輯設計的基本要求:時(shí)序是設計出來(lái)的,不是仿出來(lái)的,更不是湊出來(lái)的。 很多人在做邏輯設計時(shí)喜歡一上來(lái)就狂寫(xiě)代碼,寫(xiě)到一半后發(fā)現信號間的時(shí)序出問(wèn)題了,只好推倒重來(lái);好不容易反復了幾次之后,通過(guò)仿真軟件看了下,差不多要對了,于是再湊一下時(shí)序,竟然對了!但這個(gè)做法除了設計周期長(cháng)外,代碼的質(zhì)量也難以保證,往往存在很多冗余的邏輯,甚至有一些隱藏著(zhù)較深的bug。 為什么會(huì )出現上面的問(wèn)題呢?因為我們設計的是數字邏輯,而信號之間的邏輯關(guān)系往往是比較復雜的,在內部信號很多的情況下,僅憑拍下腦袋就寫(xiě)代碼肯定是不能理清楚它們之前的復雜的關(guān)系,所以出錯在所難免。 正確的做法是我們要先對整個(gè)設計有一些規劃--時(shí)時(shí)刻刻都要有設計時(shí)序的思想。設計時(shí)序最重要的是做好方案,這里說(shuō)的方案絕不是只是擺幾個(gè)框圖在那里。我們在做設計的時(shí)候需要做總體設計方案、邏輯詳細設計方案。這兩種方案包括了很多東西,邏輯總體方案主要是一級模塊的劃分及接口時(shí)序的定義,而邏輯詳細方案就是代碼的文字及圖形描述! 對于入門(mén)者來(lái)說(shuō),接觸的比較多的是邏輯詳細設計方案。在這一級別的方案中,我們是要求的是至少要做到模塊內部所有關(guān)鍵信號的時(shí)序都要先設計好,這里講的設計時(shí)序主要就是畫(huà)波形圖,在一個(gè)操作周期內每個(gè)信號在每一個(gè)時(shí)鐘周期該是什么樣子就畫(huà)成什么樣子。 附圖(時(shí)序圖)是我曾設計的一個(gè)模塊的主要信號時(shí)序:aes_cnt信號控制著(zhù)w_fifo_rden、aes_ready等信號,是該模塊的關(guān)鍵信號,通過(guò)將它們之間的時(shí)序關(guān)系通過(guò)時(shí)序圖反應出來(lái),寫(xiě)代碼時(shí)就可以做到胸有成竹,減少出現邏輯混亂的情況。 聽(tīng)起來(lái)似乎很簡(jiǎn)單,但是執行起來(lái)卻不容易,因為畫(huà)波形圖是一件很煩鎖的事(有一次一個(gè)模塊因為操作比較多我畫(huà)了8張時(shí)序圖)。但是請相信我,如果不這樣做,因為時(shí)序關(guān)系沒(méi)有處理好引起設計多次迭代所花的時(shí)間遠多于畫(huà)波形圖的時(shí)間。 時(shí)序設計好之后,模塊內部各個(gè)信號之間的關(guān)系就理得差不多了,之后就是將它翻譯成代碼了,這個(gè)過(guò)程以體力勞動(dòng)為主,我就不多說(shuō)了。 補充一下,畫(huà)波形圖推薦用TimingDesigner這個(gè)軟件,如果有更好的,請告訴我,我也不喜歡TimingDesigner。 另一個(gè)就是約束。 這里的約束是針對綜合軟件和布局布線(xiàn)軟件而言的。 為什么會(huì )有約束這個(gè)東西出現呢?主要原因是EDA軟件比較笨,難以明白我們的心思,如果我們不把更詳細的信息告訴它的話(huà)它就干不好活,比如需要將輸出寄存器放的與輸出管腳近一點(diǎn),如果不加約束,EDA軟件可能布通之后就不管了,導致Tco狂大,一點(diǎn)也不善解人意。所以我們需要約束這個(gè)東西,告訴EDA軟件要怎么干活,工程驗收的標準又是什么。 在加約束之前,我們首先要定義一些術(shù)語(yǔ)好告訴EDA軟件我們想干什么,這些術(shù)語(yǔ)便是Fmax、Tsu、Tco等等這些東西。這些東西的含義這里就不多說(shuō)了,網(wǎng)上的討論已經(jīng)很多了。 有了術(shù)語(yǔ),還要有一種通信方式與EDA軟件通信,腳本語(yǔ)言充當了這一角色。不過(guò)現在像quartus這類(lèi)軟件做的比較智能化了,提供了圖形化界面,但是這背后支撐的還是些腳本語(yǔ)言,大家可以用UltraEdit打加*.qsf文件去看看我們加的約束用腳本語(yǔ)言是怎么寫(xiě)的。 在加了約束之后,EDA工具就可以更好地按照我們的意愿去干活了,比較我們加了Fmax的約束,它就會(huì )盡可能地將關(guān)鍵路徑放的靠近一些,以提高電路工作頻率。當然,這是有代價(jià)的,尋找路徑是需要時(shí)間的,要求越苛刻,時(shí)間花的越多,因此加約束的原則的適用就行。如果約束加的過(guò)高,就相當于讓EDA工具去做一件不可能完成的事,找更短的路徑的時(shí)候說(shuō)不定找著(zhù)找著(zhù)就掉下懸崖了,效果反而更差。 雖然有約束這個(gè)好東西,不過(guò)提醒一下,在項目之前千萬(wàn)對它抱有太多的幻想,把希望寄托在別人的身上并不是每一次都很可靠的,出了問(wèn)題還是要麻煩自己,加約束只能做一些錦上添花的事情。所以,我們在做方案的時(shí)候就需要對關(guān)鍵路徑進(jìn)行預估,要通過(guò)設計而不是約束解決這些問(wèn)題。 |