|
回復 #7 greatsky 的帖子
你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣- J$ k* `" t$ B7 Q! S" j
+ z8 r" T$ c" D( k% S& L% m8 d
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
( G+ x6 _% D: ]2 o0 `+ p/ @+ ialways @(posedge clk or negedge rst)# \. H+ [7 c6 e2 ]6 p( d1 O* W
if(!rst)
H5 s) L3 Q2 w' f state <= POR;
1 [3 [) ]! }) u2 h) xelse
1 K: o, P0 ^0 Q* X* P if(vbus) # U4 s9 Q d5 Z- k @
state <= POR;
7 {' I" ~1 _$ Y else
# O* @, ]# |9 s' c state <= next_state;
8 H* B4 C/ ^9 D. a+ L) y$ h0 V6 p- E* ^0 W# [6 Q. O
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
! W+ O) I# F3 C( V
& L2 S; C$ A( Z/ n1 z/ aalways @(posedge clk); K( I% Z+ p2 z: J; C# w3 I
if(!rst)
& ^0 s: J, k. g/ j1 E- H6 g state <= POR;
4 k* ]: D1 I; v2 K6 M, Nelse
, w d9 T) i5 p if(vbus)
. j+ w( \5 X; u) |* w) J, e state <= POR;. d: v; R1 }2 y1 i# `# r
else $ h8 k& M, W( X! x" K9 X# _& q2 |
state <= next_state;
' ?7 H- O6 H( s3 d( ?( z; Z3 J7 s- J1 u
這就是一個明顯的同步RESET電路。
5 E5 o& g8 j9 X4 P" [ ?- c! n
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。" V6 u0 ~, C0 N) i L! d9 ~2 ?
: I, f1 _5 K0 U7 M# Q) |, S你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
) d* y$ k. X" K7 ~: S) {7 C% S+ P: u8 j( q) Y' t5 s
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。5 s" H, C- e3 r4 {+ X7 n( D4 e
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf |
評分
-
查看全部評分
|