verilog hdl和vhdl相比有很多優點,有c語言基礎的話很容易上手。蒐集了一些網上大神的經驗總結和書上的例子,所以對於和我一樣的初學者,這篇部落格應該還是很有提高作用的,至於具體語法,任何一本書都講的很詳細。
hdl 是 hardware description language 的縮寫,中文名「硬體描述語言」,並不是「硬體設計語言(hardwaredescription language)」。正是這個單詞,決定了絕大多數部分電路設計必須遵循rtl的模式來編寫**,而不能隨心所欲的寫僅僅符合語法的hdl**。
vhdl 於2023年開始在美國國防部的指導下開發,完成於2023年,並於2023年成為ieee 的標準。verilog hdl也形成於差不多的年代,是由gateway design automation 公司大約在2023年左右開發的。其架構同vhdl 相似,但主要被用來進行硬體**。**hdl語言的歷史,就能明白這兩種最流行的用於電路設計的語言,沒有一種是為了設計硬體而開發的(更何況80年代還沒有現在的那些功能強大的eda軟體呢)。因此,當初制訂 hdl語言標準的時候,並沒有考慮這些**如何用硬體來實現。換句話說,有些**寫起來簡單,實現起來卻可能非常複雜,或者幾乎不可能實現。
[plain]view plain
copy
always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter
有些工具支援,有些工具不支援:ca***,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repreat,task,while
不要用initial(fpga上電時初始狀態不定,一般需要上電復位訊號,在復位訊號有效的時候進行初始化,上電復位訊號可以由外部手動輸入,也可以系統自己產生,轉一篇部落格,p.s.現在的綜合軟體功能已經足夠強大,即使寫了initial語句,在ise13.3中仍然是可綜合的,而且沒有warning和info的提示)
不使用#10(在**中有用,實際在硬體上不會實現)
不使用迴圈次數不定的迴圈語句,如forever、while等
不使用使用者自定義原語(udp原件)
除非是關鍵路徑設計,一般不採用呼叫門級原件描述的設計的方法,建議採用行為語句完成設計
盡量使用同步方式設計電路
用always語句描述組合邏輯時,在敏感訊號列表中要列出所有輸入訊號
所有的內部暫存器都應該可以被復位,在fpga設計時應盡量使用器件的全域性復位端訊號作為系統的總復位
時序邏輯使用非阻塞賦值,組合邏輯使用阻塞賦值,同一過程塊中不要同時使用阻塞和非阻塞兩種方式
不要在不同的always過程塊中對同一變數賦值(否則綜合時會提示有多驅動源錯誤,multiple source),對同一賦值物件,不能既使用阻塞賦值,又使用非阻塞賦值
如果不打算把變數綜合成鎖存器,在if語句或case語句的所有分支中都要對變數明確賦值(不能省去else或default,原理:在省去的情況下,變數的值會保持原來的值不變,所以系統會綜合出乙個鎖存器)
避免混合使用上公升沿和下降沿觸發器
同一變數的賦值不能受多個時鐘控制,也不能受兩種不同時鐘條件(或不同時鐘沿)控制
避免在case語句中使用x或z值
[plain]view plain
copy
time,defparam,$finish,fork,join,initial,delays,udp,wait
initial 只能在testbench中使用,不能綜合
events 在testbench中更有用,不能綜合
real 不支援real型別的綜合
time 不支援time型別的綜合
force 和release
assign 和 deassign 不支援對reg型別的資料進行assign和deassign綜合,支援對wire型別進行assign和deassign的綜合
fork join 不可綜合,可以用非塊語句達到同樣的效果
primitives 支援門級原語綜合,不支援非門級原語綜合
table 不支援table和udp的綜合
敏感符列表中同時有posedge和negedge,如always @ ( posedge clk or negedge clk ) begin ...end
同乙個reg被多個always塊驅動
延時,不可綜合為硬體電路延時,綜合工具會忽略延時,但是不會報錯
與x、z比較,綜合工具會忽略,所以要保證訊號只有兩個狀態,0或1
用一句簡單的話概括:電腦永遠沒有你聰明。具體來說,通常eda軟體對hdl**的綜合能力總是比人差。對於一段**,如果你不能想象出乙個較直觀的硬體實現方法,那 eda軟體肯定也不行。一般來說:在 rtl 級的描述中,所有邏輯運算和加減法運算、以及他們的有限次組合,基本上是可綜合的,否則就有無法綜合的可能性。當然,這樣的標準仍然有缺陷,更況且eda的技術也在不斷發展,過去無法綜合的**或許將來行,某些軟體不支援的**換個軟體或許行。比如固定次數的迴圈,含乙個常數引數的乘法運算等等,有些eda軟體支援對它們的綜合,而有些軟體不行。
所以,正確的判斷仍然要靠實踐來積累經驗。當你可以較準確判斷**的可綜合性的時候,你對hdl的掌握就算完全入門
可綜合不可綜合
學fpga給我最大的體會就是它的程式語言是並行執行的,不像c語言那樣一行一行的執行。verilog裡面有個always語句,所有的always語句塊全部併發執行,而always語句塊內部是逐行執行的 前提是只是用阻塞賦值 verilog中沒有中斷的概念,而逐行執行指令的c語言卻離不開中斷。學習ver...
Verilog可綜合不可綜合語句
1 所有綜合工具都支援的結構 always,assign,begin,end,case,wire,tri,generate,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0...
verilog中的可綜合與不可綜合語句
1 所有綜合工具都支援的結構 always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,n...