之前讀過一篇關於這方面的文章,後來整個忘了
但是大部分的規則都還記得,關於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跑得更久
- 不完全的sensitivity list
- 完全的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不需要,因為VHDL有case
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不允許
雖然casez與casex功能相似,但是如果設計有問題在驗證時容易被發現,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-flop的reset與set,我們會需要使用這個指令來測試不同狀況的組合輸出,(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/set的D
flip-flop,在下面的例子a在模擬的時候99%正確,但是會有個缺陷,c則是100%正確
在xilinx的constraint中可以用三種關鍵字來表示
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_case與parallel_case,當它們有效的時候才是最危險的!
只有在onehot
FSM中可以拿優化設計
如果要設計一個dont
care的case,最好使用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
assignment與nonblocking
assignment
在ISE的設定中可以幫Case手動設定full
or parallel
HI
回覆刪除我想請問你一些關於VHDL的問題
就是現在很掙扎要不要換語言
因為現在用VHDL的人越來越少
IP商只提供VHDL語言的IP就很容被打槍
我在網路上有找到一些說明是說
Systemverilog可以支援VHDL
所以不用擔心語言的問題
請問你使用Systemverilog也是因為學了VHDL才用
還是工作上就必須強迫換語言?