寫verilog代碼要有硬件的概念
因?yàn)閂erilog是一種硬件描述語(yǔ)言,所以在寫Verilog語(yǔ)言時(shí),首先要有所要寫的module在硬件上如何實(shí)現(xiàn)的概念,而不是去想編譯器如何去解釋這個(gè)module. 比如在決定是否使用reg定義時(shí),要問問自己物理上是不是真正存在這個(gè)register, 如果是,它的clock是什么? D端是什么?Q端是什么?有沒有清零和置位?同步還是異步?再比如上面討論的三態(tài)輸出問題,首先想到的應(yīng)該是在register的輸出后面加一個(gè)三態(tài)門,而不是如何才能讓編譯器知道要“賦值”給一個(gè)信號(hào)為三態(tài)。同樣,Verilog中沒有“編譯”的概念,而只有綜合的概念。
本文引用地址:http://butianyuan.cn/article/201710/365621.htm寫硬件描述語(yǔ)言的目的是為了綜合,所以說(shuō)要想寫的好就要對(duì)綜合器有很深的了解,這樣寫出來(lái)的代碼才有效率。
有些東西完全是沒有意義的,像有些書上的很多程序,完全是不可綜合的比如產(chǎn)生一個(gè)10ms方波什么的程序,用什么#10 ~clk,這樣的語(yǔ)句硬件不可能做的那里面很多程序是用來(lái)verificaTIon的,不是綜合的。張老師那本書用來(lái)當(dāng)初級(jí)教材還是不錯(cuò)的,但是想通過(guò)它來(lái)掌握verilog是不夠的。曾經(jīng)接觸過(guò)motorola蘇州設(shè)計(jì)中心的一位資深工程師,他忠告了一句:就是用verilog描述電路的時(shí)候,一定要清楚它實(shí)現(xiàn)的電路,很多人只顧學(xué)習(xí)verilog語(yǔ)言,而不熟悉它實(shí)現(xiàn)的電路,這是設(shè)計(jì)不出好的電路來(lái)的
一般寫verilog code時(shí),對(duì)整個(gè)硬件的結(jié)構(gòu)應(yīng)該是很清楚了,最好有詳細(xì)的電路圖畫出,時(shí)序問題等都應(yīng)該考慮清楚了??梢钥粗鴪D直接寫code。
要知道,最初Verilog是為了實(shí)現(xiàn)仿真而發(fā)明的.不可綜合的Verilog語(yǔ)句也是很重要的.因?yàn)樵趯?shí)際設(shè)計(jì)電路時(shí),除了要實(shí)現(xiàn)一個(gè)可綜合的module外,你還要知道它的外圍電路是怎樣的,以及我的這個(gè)電路與這些外圍電路能否協(xié)調(diào)工作.這些外圍電路就可以用不可綜合的語(yǔ)句來(lái)實(shí)現(xiàn)而不必管它是如何實(shí)現(xiàn)的.因?yàn)樗鼈兛赡芤呀?jīng)實(shí)際存在了,我僅是用它來(lái)模擬的.所以,在寫verilog的時(shí)候應(yīng)該要先明確我是用它來(lái)仿真的還是綜合的.要是用來(lái)綜合的話,就必須要嚴(yán)格地使用可綜合的語(yǔ)句,而且不同的寫法可能產(chǎn)生的電路會(huì)有很大差別,這時(shí)就要懂一些verilog綜合方法的知識(shí).就像前面說(shuō)的,腦子里要有一個(gè)硬件的概念.特別是當(dāng)綜合報(bào)錯(cuò)時(shí),就要想一想我這種寫法能不能用硬件來(lái)實(shí)現(xiàn),verilog畢竟還不是C,很多寫法是不可實(shí)現(xiàn)的.要是這個(gè)module僅是用來(lái)仿真的,就要靈活得多了,這時(shí)你大可不必太在意硬件實(shí)現(xiàn).只要滿足它的語(yǔ)法,實(shí)現(xiàn)你要的功能就行了.
有網(wǎng)友說(shuō)關(guān)于#10 clk=~clk的問題,雖然這種語(yǔ)句是不可綜合的,但是在做simulaTIon和verificaTIon是常常用它在estbench中來(lái)產(chǎn)生一個(gè)clock信號(hào)。再比如常常用到的大容量memory, 一般是不會(huì)在片上實(shí)現(xiàn)的,這個(gè)時(shí)候也需要一個(gè)unsynthesizable module. mengxy所言切中肯罄。
我們?cè)O(shè)計(jì)的module的目的是為了可以綜合出功能正確,符合標(biāo)準(zhǔn)的電路來(lái)。我想這是個(gè)反復(fù)的過(guò)程,就像我們?cè)趯慸esign flow中總要注明前仿真,綜合后的仿真,以及后仿真等。仿真是用來(lái)驗(yàn)證我們的設(shè)計(jì)的非常重要的手段。而verilog里那些看是無(wú)聊的語(yǔ)句這個(gè)時(shí)候就會(huì)發(fā)揮很大的作用。我想,用過(guò)verilog_xl的兄弟應(yīng)該深有體會(huì)。verilog_xl里的操作,可以用verilog里的系統(tǒng)命令來(lái)完成。通過(guò)最近的應(yīng)聘我也深有體會(huì),很多公司看中你在寫code時(shí),是否考慮到TIming,architecture,DFT等,這也說(shuō)明verilog中的任何語(yǔ)句都是非常重要的。
要寫代碼前必須對(duì)具體的硬件有一個(gè)比較清晰的概念但是想一次完成可綜合代碼就太夸張了,verilog的自頂向下設(shè)計(jì)方法就是從行為建模開始的,功能驗(yàn)證了以后再轉(zhuǎn)向可綜合模型.太在意與可綜合令初期設(shè)計(jì)變得太累
很同意這種看法,在做邏輯結(jié)構(gòu)設(shè)計(jì)時(shí),綜合的因素是要考慮的,但是有很多東西不能考慮的過(guò)于細(xì)致,就是在設(shè)計(jì)的時(shí)候不能過(guò)于緊卡時(shí)延,面積等因素,因?yàn)檫@樣以來(lái)綜合后優(yōu)化的余量就會(huì)很小,反而不利與設(shè)計(jì)的優(yōu)化,如果在時(shí)延和面積要求不是很緊張的情況下,其實(shí)代碼寫的行為級(jí),利用綜合工具進(jìn)行優(yōu)化也是一種方法。偶就聽說(shuō)有一家很有名的公司,非常相信綜合工具的優(yōu)化能力,從來(lái)不作綜合后仿真的,hehe.當(dāng)然,如果面積和時(shí)延的要求很高,最好還是把代碼寫的底層一點(diǎn),調(diào)用庫(kù)單元時(shí),也要充分考慮其面積和時(shí)延的因素。
評(píng)論