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