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