verilog的学习
生活随笔
收集整理的這篇文章主要介紹了
verilog的学习
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
學習EDA首先要有項目掛靠,如果你覺得未來一段時間你都不可能有的話,接下來的內容你就沒有必要再看了,花的時間再多也只能學到皮毛--很多細節(jié)的問題光寫代碼是發(fā)現(xiàn)不到的。而且要真正入門,最好要多做幾個項目(這三年大大小小的項目我做有七八個),總線型的和數(shù)字信號處理型的最好都要接觸一些,因為這兩個方向的邏輯設計差異比較大:前者主要是控制型的,會涉及到狀態(tài)機等控制邏輯;后者主要是計算型的,難點主要在對符號、浮點數(shù)轉定點數(shù)、位寬等方面的處理上。
??????? 第二要有好的師傅。這里說的好的師傅并不是指畫原理圖畫了幾十年的老師傅,而是指曾在專業(yè)IC公司做過一段時間的人,好的專業(yè)IC公司可以接觸國內外最新的設計思想,在他們的幫助下,起點就可以比其他人高不少,更重要的是你可以學習邏輯設計思想性的東西!如果你的師傅經(jīng)常跟你說畫原理圖的好處,你還是重新找過師傅算了--用原理圖設計是一種很落后的方式,即使他們可能會說可以系統(tǒng)級設計(專業(yè)的IC設計公司系統(tǒng)級設計絕對是由方案保證的,而不會靠原理圖這鬼東西)更為清淅。
??????? 第三要看一些好的資料。RTL級的書中《Verilog 硬件描述語言》、EDA先鋒寫的那幾本書都還可以。驗證方面入門可以看下《Writting Testbenches》, 提高可以看下snug(Synopsys的用戶論壇,里面的文章基本上反映了業(yè)界的領先水平);系統(tǒng)級的可以看看《片上系統(tǒng)-可重用性設計方法學》。
??????? 第四要自己多總結,多動腦筋。邏輯設計的東西其實本質上的東西并不多:把RTL級的常用的D觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器等基本的電路標準化、固定化;先做方案再寫代碼;設計時序;知道約束原理及怎么加約束;劃分模塊時知道怎么做到時序收斂;做驗證的時候熟悉相應語言的行為級描述(這個肯定比RTL級好學多了)然后就是理解testbench的結構化設計。把這些東西的本質都搞清楚了做個合格的邏輯工程師應該是綽綽有余了,呵呵。
??????? 在接下來的部分我主要就第四點隨便說點自己的EDA學習心得,說的不好還請大家批評指正。
??????? 入門前
?? ? ?? 剛才開始接觸邏輯設計很多人會覺得很簡單:因為verilog的語法不多,半天就可以把書看完了。但是很快許多人就發(fā)現(xiàn)這個想法是錯誤的,他們經(jīng)常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環(huán)寫的一個計數(shù)器都不認識!
??????? 相信上一段的經(jīng)歷大部分人都曾有,原因是做邏輯設計的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。
??????? 在這個過程中首先要明白的是軟件設計和邏輯設計的不同,并理解什么是硬件意識。
??????? 軟件代碼的執(zhí)行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執(zhí)行;因此軟件設計中經(jīng)常會帶有順序處理的思維。而邏輯設計則不同,我們設計的是數(shù)字電路,它是由很多很多的與非門及D觸發(fā)器構成的,上電之后所有與非門和D觸發(fā)器都同時工作,不會因為A觸發(fā)器的代碼描述在B觸發(fā)器之前A觸發(fā)器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網(wǎng)表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯(lián)關系描述;因此邏輯設計需要的是一種并發(fā)的思維,我們也需要用并發(fā)的思維去考慮電路的設計。??
??? ? ? 當然,我們設計的電路功能一般都有先后順序的關系,如果這種順序不能通過代碼的先后順序來實現(xiàn),那么要怎么完成這一功能呢?在邏輯設計中,我們所說的先后順序都是基于時間軸來實現(xiàn):它的承載體就是時序邏輯,也就是那些觸發(fā)器。
??????? 硬件意識的東西網(wǎng)上談論的已經(jīng)很多,這里就不再多說了。
??????? 其次就是要熟悉基本電路的設計。
??????? 基本的電路不是很多,也就是D觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器、譯碼器等幾種,所有復雜的電路都可由這些基本的電路構成。高手水平高的體現(xiàn)并不是他能寫出一些很奇特的電路,相反,水平高是體現(xiàn)在他們總能將復雜的電路用這些很樸素的基本電路去描述。甚至,你會發(fā)現(xiàn)他們的代碼基本上是由if...else、case這些語句構成的,樸素的讓你覺得奇怪。
??????? 我認為,初學者在入門的時候,對于基本電路的設計應該固定化、標準化,每種電路該用什么樣的代碼描述,應該要固定、統(tǒng)一,盡量少一些花哨的東西。說來這里我舉個例子。
??????? 以前有幾個朋友因為仿真有問題請我?guī)兔φ覇栴}。他們的代碼寫的很亂,出現(xiàn)了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標準的電路重新寫下代碼。結果過了半天,他們就和我說問題不見了。
??????? 所以,高手們喜歡用簡單的代碼是有道理的,電路的標準化和規(guī)范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時候回家多睡回覺,呵呵。總之,簡單的、樸素的就是最好的。
??? ? ? 最后是代碼的規(guī)范化。
??????? 代碼規(guī)范主要是代碼書寫、命名等規(guī)范。比如不能用TAB鍵空格、低電平有效信號命名時加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網(wǎng)上也很多,這里只是強烈建議大家要嚴格遵守,像華為等公司如果代碼不規(guī)范的話肯定是要打回去重寫的。
??????? 入門????????????????????????????????
??????? 結合一兩個小項目把上面所說的事情都做好后,差不多就可以進入入門的階段了(要求稍微嚴格了一點點,呵呵)。
??????? 入門階段要學的有:設計時序;理解約束的原理及如何加約束。
??????? 先談談設計時序。
??????? 設計時序是進行邏輯設計的基本要求:時序是設計出來的,不是仿出來的,更不是湊出來的。
??????? 很多人在做邏輯設計時喜歡一上來就狂寫代碼,寫到一半后發(fā)現(xiàn)信號間的時序出問題了,只好推倒重來;好不容易反復了幾次之后,通過仿真軟件看了下,差不多要對了,于是再湊一下時序,竟然對了!但這個做法除了設計周期長外,代碼的質量也難以保證,往往存在很多冗余的邏輯,甚至有一些隱藏著較深的bug。
??????? 為什么會出現(xiàn)上面的問題呢?因為我們設計的是數(shù)字邏輯,而信號之間的邏輯關系往往是比較復雜的,在內部信號很多的情況下,僅憑拍下腦袋就寫代碼肯定是不能理清楚它們之前的復雜的關系,所以出錯在所難免。
??????? 正確的做法是我們要先對整個設計有一些規(guī)劃--時時刻刻都要有設計時序的思想。設計時序最重要的是做好方案,這里說的方案絕不是只是擺幾個框圖在那里。我們在做設計的時候需要做總體設計方案、邏輯詳細設計方案。這兩種方案包括了很多東西,邏輯總體方案主要是一級模塊的劃分及接口時序的定義,而邏輯詳細方案就是代碼的文字及圖形描述!
??????? 對于入門者來說,接觸的比較多的是邏輯詳細設計方案。在這一級別的方案中,我們是要求的是至少要做到模塊內部所有關鍵信號的時序都要先設計好,這里講的設計時序主要就是畫波形圖,在一個操作周期內每個信號在每一個時鐘周期該是什么樣子就畫成什么樣子。 附圖(時序圖)是我曾設計的一個模塊的主要信號時序:aes_cnt信號控制著w_fifo_rden、aes_ready等信號,是該模塊的關鍵信號,通過將它們之間的時序關系通過時序圖反應出來,寫代碼時就可以做到胸有成竹,減少出現(xiàn)邏輯混亂的情況。??
??????? 聽起來似乎很簡單,但是執(zhí)行起來卻不容易,因為畫波形圖是一件很煩鎖的事(有一次一個模塊因為操作比較多我畫了8張時序圖)。但是請相信我,如果不這樣做,因為時序關系沒有處理好引起設計多次迭代所花的時間遠多于畫波形圖的時間。
??????? 時序設計好之后,模塊內部各個信號之間的關系就理得差不多了,之后就是將它翻譯成代碼了,這個過程以體力勞動為主,我就不多說了。
??????? 補充一下,畫波形圖推薦用TimingDesigner這個軟件,如果有更好的,請告訴我,我也不喜歡TimingDesigner。
??????? 另一個就是約束。
??? ? ? 這里的約束是針對綜合軟件和布局布線軟件而言的。
??????? 為什么會有約束這個東西出現(xiàn)呢?主要原因是EDA軟件比較笨,難以明白我們的心思,如果我們不把更詳細的信息告訴它的話它就干不好活,比如需要將輸出寄存器放的與輸出管腳近一點,如果不加約束,EDA軟件可能布通之后就不管了,導致Tco狂大,一點也不善解人意。所以我們需要約束這個東西,告訴EDA軟件要怎么干活,工程驗收的標準又是什么。
??????? 在加約束之前,我們首先要定義一些術語好告訴EDA軟件我們想干什么,這些術語便是Fmax、Tsu、Tco等等這些東西。這些東西的含義這里就不多說了,網(wǎng)上的討論已經(jīng)很多了。
??? ? ? 有了術語,還要有一種通信方式與EDA軟件通信,腳本語言充當了這一角色。不過現(xiàn)在像quartus這類軟件做的比較智能化了,提供了圖形化界面,但是這背后支撐的還是些腳本語言,大家可以用UltraEdit打加*.qsf文件去看看我們加的約束用腳本語言是怎么寫的。????????????????????????????????????????????????????????????????????????????????????????????? ?
??????? 在加了約束之后,EDA工具就可以更好地按照我們的意愿去干活了,比較我們加了Fmax的約束,它就會盡可能地將關鍵路徑放的靠近一些,以提高電路工作頻率。當然,這是有代價的,尋找路徑是需要時間的,要求越苛刻,時間花的越多,因此加約束的原則的適用就行。如果約束加的過高,就相當于讓EDA工具去做一件不可能完成的事,找更短的路徑的時候說不定找著找著就掉下懸崖了,效果反而更差。
??????? 雖然有約束這個好東西,不過提醒一下,在項目之前千萬對它抱有太多的幻想,把希望寄托在別人的身上并不是每一次都很可靠的,出了問題還是要麻煩自己,加約束只能做一些錦上添花的事情。所以,我們在做方案的時候就需要對關鍵路徑進行預估,要通過設計而不是約束解決這些問題。
??????? 第二要有好的師傅。這里說的好的師傅并不是指畫原理圖畫了幾十年的老師傅,而是指曾在專業(yè)IC公司做過一段時間的人,好的專業(yè)IC公司可以接觸國內外最新的設計思想,在他們的幫助下,起點就可以比其他人高不少,更重要的是你可以學習邏輯設計思想性的東西!如果你的師傅經(jīng)常跟你說畫原理圖的好處,你還是重新找過師傅算了--用原理圖設計是一種很落后的方式,即使他們可能會說可以系統(tǒng)級設計(專業(yè)的IC設計公司系統(tǒng)級設計絕對是由方案保證的,而不會靠原理圖這鬼東西)更為清淅。
??????? 第三要看一些好的資料。RTL級的書中《Verilog 硬件描述語言》、EDA先鋒寫的那幾本書都還可以。驗證方面入門可以看下《Writting Testbenches》, 提高可以看下snug(Synopsys的用戶論壇,里面的文章基本上反映了業(yè)界的領先水平);系統(tǒng)級的可以看看《片上系統(tǒng)-可重用性設計方法學》。
??????? 第四要自己多總結,多動腦筋。邏輯設計的東西其實本質上的東西并不多:把RTL級的常用的D觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器等基本的電路標準化、固定化;先做方案再寫代碼;設計時序;知道約束原理及怎么加約束;劃分模塊時知道怎么做到時序收斂;做驗證的時候熟悉相應語言的行為級描述(這個肯定比RTL級好學多了)然后就是理解testbench的結構化設計。把這些東西的本質都搞清楚了做個合格的邏輯工程師應該是綽綽有余了,呵呵。
??????? 在接下來的部分我主要就第四點隨便說點自己的EDA學習心得,說的不好還請大家批評指正。
??????? 入門前
?? ? ?? 剛才開始接觸邏輯設計很多人會覺得很簡單:因為verilog的語法不多,半天就可以把書看完了。但是很快許多人就發(fā)現(xiàn)這個想法是錯誤的,他們經(jīng)常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環(huán)寫的一個計數(shù)器都不認識!
??????? 相信上一段的經(jīng)歷大部分人都曾有,原因是做邏輯設計的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。
??????? 在這個過程中首先要明白的是軟件設計和邏輯設計的不同,并理解什么是硬件意識。
??????? 軟件代碼的執(zhí)行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執(zhí)行;因此軟件設計中經(jīng)常會帶有順序處理的思維。而邏輯設計則不同,我們設計的是數(shù)字電路,它是由很多很多的與非門及D觸發(fā)器構成的,上電之后所有與非門和D觸發(fā)器都同時工作,不會因為A觸發(fā)器的代碼描述在B觸發(fā)器之前A觸發(fā)器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網(wǎng)表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯(lián)關系描述;因此邏輯設計需要的是一種并發(fā)的思維,我們也需要用并發(fā)的思維去考慮電路的設計。??
??? ? ? 當然,我們設計的電路功能一般都有先后順序的關系,如果這種順序不能通過代碼的先后順序來實現(xiàn),那么要怎么完成這一功能呢?在邏輯設計中,我們所說的先后順序都是基于時間軸來實現(xiàn):它的承載體就是時序邏輯,也就是那些觸發(fā)器。
??????? 硬件意識的東西網(wǎng)上談論的已經(jīng)很多,這里就不再多說了。
??????? 其次就是要熟悉基本電路的設計。
??????? 基本的電路不是很多,也就是D觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器、譯碼器等幾種,所有復雜的電路都可由這些基本的電路構成。高手水平高的體現(xiàn)并不是他能寫出一些很奇特的電路,相反,水平高是體現(xiàn)在他們總能將復雜的電路用這些很樸素的基本電路去描述。甚至,你會發(fā)現(xiàn)他們的代碼基本上是由if...else、case這些語句構成的,樸素的讓你覺得奇怪。
??????? 我認為,初學者在入門的時候,對于基本電路的設計應該固定化、標準化,每種電路該用什么樣的代碼描述,應該要固定、統(tǒng)一,盡量少一些花哨的東西。說來這里我舉個例子。
??????? 以前有幾個朋友因為仿真有問題請我?guī)兔φ覇栴}。他們的代碼寫的很亂,出現(xiàn)了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標準的電路重新寫下代碼。結果過了半天,他們就和我說問題不見了。
??????? 所以,高手們喜歡用簡單的代碼是有道理的,電路的標準化和規(guī)范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時候回家多睡回覺,呵呵。總之,簡單的、樸素的就是最好的。
??? ? ? 最后是代碼的規(guī)范化。
??????? 代碼規(guī)范主要是代碼書寫、命名等規(guī)范。比如不能用TAB鍵空格、低電平有效信號命名時加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網(wǎng)上也很多,這里只是強烈建議大家要嚴格遵守,像華為等公司如果代碼不規(guī)范的話肯定是要打回去重寫的。
??????? 入門????????????????????????????????
??????? 結合一兩個小項目把上面所說的事情都做好后,差不多就可以進入入門的階段了(要求稍微嚴格了一點點,呵呵)。
??????? 入門階段要學的有:設計時序;理解約束的原理及如何加約束。
??????? 先談談設計時序。
??????? 設計時序是進行邏輯設計的基本要求:時序是設計出來的,不是仿出來的,更不是湊出來的。
??????? 很多人在做邏輯設計時喜歡一上來就狂寫代碼,寫到一半后發(fā)現(xiàn)信號間的時序出問題了,只好推倒重來;好不容易反復了幾次之后,通過仿真軟件看了下,差不多要對了,于是再湊一下時序,竟然對了!但這個做法除了設計周期長外,代碼的質量也難以保證,往往存在很多冗余的邏輯,甚至有一些隱藏著較深的bug。
??????? 為什么會出現(xiàn)上面的問題呢?因為我們設計的是數(shù)字邏輯,而信號之間的邏輯關系往往是比較復雜的,在內部信號很多的情況下,僅憑拍下腦袋就寫代碼肯定是不能理清楚它們之前的復雜的關系,所以出錯在所難免。
??????? 正確的做法是我們要先對整個設計有一些規(guī)劃--時時刻刻都要有設計時序的思想。設計時序最重要的是做好方案,這里說的方案絕不是只是擺幾個框圖在那里。我們在做設計的時候需要做總體設計方案、邏輯詳細設計方案。這兩種方案包括了很多東西,邏輯總體方案主要是一級模塊的劃分及接口時序的定義,而邏輯詳細方案就是代碼的文字及圖形描述!
??????? 對于入門者來說,接觸的比較多的是邏輯詳細設計方案。在這一級別的方案中,我們是要求的是至少要做到模塊內部所有關鍵信號的時序都要先設計好,這里講的設計時序主要就是畫波形圖,在一個操作周期內每個信號在每一個時鐘周期該是什么樣子就畫成什么樣子。 附圖(時序圖)是我曾設計的一個模塊的主要信號時序:aes_cnt信號控制著w_fifo_rden、aes_ready等信號,是該模塊的關鍵信號,通過將它們之間的時序關系通過時序圖反應出來,寫代碼時就可以做到胸有成竹,減少出現(xiàn)邏輯混亂的情況。??
??????? 聽起來似乎很簡單,但是執(zhí)行起來卻不容易,因為畫波形圖是一件很煩鎖的事(有一次一個模塊因為操作比較多我畫了8張時序圖)。但是請相信我,如果不這樣做,因為時序關系沒有處理好引起設計多次迭代所花的時間遠多于畫波形圖的時間。
??????? 時序設計好之后,模塊內部各個信號之間的關系就理得差不多了,之后就是將它翻譯成代碼了,這個過程以體力勞動為主,我就不多說了。
??????? 補充一下,畫波形圖推薦用TimingDesigner這個軟件,如果有更好的,請告訴我,我也不喜歡TimingDesigner。
??????? 另一個就是約束。
??? ? ? 這里的約束是針對綜合軟件和布局布線軟件而言的。
??????? 為什么會有約束這個東西出現(xiàn)呢?主要原因是EDA軟件比較笨,難以明白我們的心思,如果我們不把更詳細的信息告訴它的話它就干不好活,比如需要將輸出寄存器放的與輸出管腳近一點,如果不加約束,EDA軟件可能布通之后就不管了,導致Tco狂大,一點也不善解人意。所以我們需要約束這個東西,告訴EDA軟件要怎么干活,工程驗收的標準又是什么。
??????? 在加約束之前,我們首先要定義一些術語好告訴EDA軟件我們想干什么,這些術語便是Fmax、Tsu、Tco等等這些東西。這些東西的含義這里就不多說了,網(wǎng)上的討論已經(jīng)很多了。
??? ? ? 有了術語,還要有一種通信方式與EDA軟件通信,腳本語言充當了這一角色。不過現(xiàn)在像quartus這類軟件做的比較智能化了,提供了圖形化界面,但是這背后支撐的還是些腳本語言,大家可以用UltraEdit打加*.qsf文件去看看我們加的約束用腳本語言是怎么寫的。????????????????????????????????????????????????????????????????????????????????????????????? ?
??????? 在加了約束之后,EDA工具就可以更好地按照我們的意愿去干活了,比較我們加了Fmax的約束,它就會盡可能地將關鍵路徑放的靠近一些,以提高電路工作頻率。當然,這是有代價的,尋找路徑是需要時間的,要求越苛刻,時間花的越多,因此加約束的原則的適用就行。如果約束加的過高,就相當于讓EDA工具去做一件不可能完成的事,找更短的路徑的時候說不定找著找著就掉下懸崖了,效果反而更差。
??????? 雖然有約束這個好東西,不過提醒一下,在項目之前千萬對它抱有太多的幻想,把希望寄托在別人的身上并不是每一次都很可靠的,出了問題還是要麻煩自己,加約束只能做一些錦上添花的事情。所以,我們在做方案的時候就需要對關鍵路徑進行預估,要通過設計而不是約束解決這些問題。
總結
以上是生活随笔為你收集整理的verilog的学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10怎么打开自动维护 Win10打
- 下一篇: postgresql中clog(comm