入門前 剛才開始接觸邏輯設計很多人會覺得很簡單:因為verilog的語法不多,半天就可以把書看完了。但是很快許多人就發現這個想法是錯誤的,他們經常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環寫的一個計數器都不認識! 相信上一段的經歷大部分人都曾有,原因是做邏輯設計的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。 在這個過程中首先要明白的是軟件設計和邏輯設計的不同,并理解什么是硬件意識。 軟件代碼的執行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執行;因此軟件設計中經常會帶有順序處理的思維。而邏輯設計則不同,我們設計的是數字電路,它是由很多很多的與非門及D觸發器構成的,上電之后所有與非門和D觸發器都同時工作,不會因為A觸發器的代碼描述在B觸發器之前A觸發器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯關系描述;因此邏輯設計需要的是一種并發的思維,我們也需要用并發的思維去考慮電路的設計。 當然,我們設計的電路功能一般都有先后順序的關系,如果這種順序不能通過代碼的先后順序來實現,那么要怎么完成這一功能呢?在邏輯設計中,我們所說的先后順序都是基于時間軸來實現:它的承載體就是時序邏輯,也就是那些觸發器。 硬件意識的東西網上談論的已經很多,這里就不再多說了。 其次就是要熟悉基本電路的設計。 基本的電路不是很多,也就是D觸發器、計數器、移位寄存器、狀態機、多路選擇器、譯碼器等幾種,所有復雜的電路都可由這些基本的電路構成。高手水平高的體現并不是他能寫出一些很奇特的電路,相反,水平高是體現在他們總能將復雜的電路用這些很樸素的基本電路去描述。甚至,你會發現他們的代碼基本上是由if...else、case這些語句構成的,樸素的讓你覺得奇怪。 我認為,初學者在入門的時候,對于基本電路的設計應該固定化、標準化,每種電路該用什么樣的代碼描述,應該要固定、統一,盡量少一些花哨的東西。說來這里我舉個例子。 以前有幾個朋友因為仿真有問題請我幫忙找問題。他們的代碼寫的很亂,出現了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標準的電路重新寫下代碼。結果過了半天,他們就和我說問題不見了。 所以,高手們喜歡用簡單的代碼是有道理的,電路的標準化和規范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時候回家多睡回覺,呵呵?傊,簡單的、樸素的就是最好的。 最后是代碼的規范化。 代碼規范主要是代碼書寫、命名等規范。比如不能用TAB鍵空格、低電平有效信號命名時加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網上也很多,這里只是強烈建議大家要嚴格遵守,像華為等公司如果代碼不規范的話肯定是要打回去重寫的。 |