2014年7月21日 星期一

Verilog-VHDL Coding Style for synthesis

之前讀過一篇關於這方面的文章,後來整個忘了
但是大部分的規則都還記得,關於latch或是conbinational loop
今天剛好又看到這篇,趕快來複習一下兼做筆記
Reference : RTL Coding Styles That Yield Simulation and Synthesis Mismatches.

如果違反下列的design rule會造成pre-post synthesis mismatch

Sensitivity List
其不包括關鍵字rising_edge,falling_edge,如果在sensitivity list中有多餘的無關係訊號,只會使pre-synthesis跑得更久
  1. 不完全的sensitivity list
  2. 完全的sensitivity list但是錯誤的順序,因為在pre-synthesis是順序式的執行,assign的直要先放入sensitivity list

Function
function總是被當成conbinational logic來和成,有些工程師喜歡把combinational logic寫成function,但是如果在function裡面有個latch,合成的工具沒有辦法檢查到這個錯誤,pre-synthesis會去檢查functionality,post-synthesis會檢查combinational logic,這樣就會造成pre-post synthesis mismatch

Case Statement
Full Case – 只有Verilog,VHDL不需要,因為VHDLcase others,不會有不完全的case
如果我們使用 // synopsys full_case 這個指令, 這用來指示所有的Case狀態已經被指定,如果沒有被指定的Case則自動設為dont cares,如果在case中有寫default,系統就會自動忽略這個指令,很多程式設計師喜歡用這個指令因為它可以讓設計更小而且速度更快且可以修掉latch,但是事實上不一定,它可能會對設計完全不產生影響且會使設計變大或是變慢,或是造成pre-post synthesis mismatch,下面的例子有加了指令但是還是造成的Latch



但是如果在case前先把輸出值初始化就可以避免latch的產生



Parallel Case - 只有Verilog,因為VHDL不允許overlapp 或是不完全的case
如果case中會有重複的情況,表示這個設計不是parallel,如下例3'b011,3'b101,3'b110,3'b111都有兩個以上的case符合情況,它就會依照編碼的優先順序來輸出,稱為priority encoder,irq[2]>irq[1]>irq[0],synthesis的結果parallel會是no



在下例中,不會有case重複的情形,synthesis的結果parallel會是auto



如果使用者使用 parallel_case這個指令,synthesis的結果parallel會是user
如果在overlapp的電路上使用parallel_case,會造成pre-post synthesis mismatch
如果在已經平行的電路上使用parallel_case,系統會自動忽略,不會有差別





Casex- 只有Verilog,“?,z,x“皆為dont care,VHDL不允許

case中不要使用casex,它是用來表達其它不指定的狀態,但是容易使訊號進入未知的狀態,最好用casez


Casez- 只有Verilog,“?,z“皆為dont care,VHDL不允許
雖然casezcasex功能相似,但是如果設計有問題在驗證時容易被發現,casez常用在modeling address decoders and priority encoders.但是需要小心使用,它可能也會造成三態或是浮動的訊號


------------------------------------------------- 補充----------------------------------------------------------

---------------------------------------------------------------------------------------------------------------

初始化值不要設為X
Verilog,所有被設為x的值都會被合成優化為dont care,下面的例子如果為2'b11則會造成pre-post synthesis mismatch



模型初始化使用translate_off,translate_on
不應該在初始化的時候對synthesis隱藏初始值. 這可能會造成ASIC之後初始化出現問題



translate_off,translate_on的普遍使用方法
這個指令最好是用在display information,如果用來控制functionality則非常危險,唯一例外只有在使用非同步的D flip-flopresetset,我們會需要使用這個指令來測試不同狀況的組合輸出,(This exception requires the use of non-synthesizable constructs to provide the correct presynthesis model that accurately models and matches the post-synthesis model. This exception
condition is created as follows: assert reset, assert set, remove reset, leaving set still asserted. In
this case, the D flip-flop model needs a little assistance to correctly model the set condition
during pre-synthesis simulation.)因此在設計上最好避免使用reset/setD flip-flop,在下面的例子a在模擬的時候99%正確,但是會有個缺陷,c則是100%正確




xilinxconstraint中可以用三種關鍵字來表示
Translate Off and Translate On can be used with the following words:
• synthesis
• synopsys
• pragma


Translate Off and Translate On VHDL Syntax Example
In VHDL, write Translate Off and Translate On as follows:
-- synthesis translate_off
...code not synthesized...
-- synthesis translate_on



總結
但是如果使用者需要設計priority encoder,最好使用if-else-if
在設計中不要使用full_caseparallel_case,當它們有效的時候才是最危險的! 只有在onehot FSM中可以拿優化設計
如果要設計一個dont carecase,最好使用casez,而且最好使用? 不要使用z
檢查所有的case synthesis report




Timing Delays
如果在assign的左邊放入timing delay的值,因為輸出不會因為輸入變動及時改變,造成設計不精準,其會造成pre-post synthesis mismatch


延伸閱讀補充
http://www.nspark.org.tw/webfiles/verilog_coding_style-final.pdf
verilog,組合邏輯用blocking assignment(=),循序邏輯用nonblocking assignment(<=), 如果在循序邏輯中改用blocking assignment,和成後的結果相同,但是如果程式的順序不同,則造成在程式中指定的順序會影響和成出來的結果,不要在同一個always裡面同時使用blocking assignmentnonblocking assignment


ISE的設定中可以幫Case手動設定full or parallel
 

1 則留言:

  1. HI
    我想請問你一些關於VHDL的問題
    就是現在很掙扎要不要換語言
    因為現在用VHDL的人越來越少
    IP商只提供VHDL語言的IP就很容被打槍

    我在網路上有找到一些說明是說
    Systemverilog可以支援VHDL
    所以不用擔心語言的問題
    請問你使用Systemverilog也是因為學了VHDL才用
    還是工作上就必須強迫換語言?

    回覆刪除