|
回復 #7 greatsky 的帖子
你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
( L( c; }7 ^/ V; _3 u! v% J1 P. v1 y1 ?2 u" |3 E" W' l5 y- y4 _& _
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
' T% V2 u9 u0 }+ C2 \: I5 }always @(posedge clk or negedge rst)5 n. W0 r1 }+ R; U; n- w; C
if(!rst)
, h& I3 f9 v1 `7 ] state <= POR;
; T B Q. t/ Z- D) _3 Aelse
$ t* @1 Z1 n$ o: n, |( I if(vbus) ' M$ }& q! [, \" C$ d- j3 g% l0 ~
state <= POR;8 V/ b$ M1 N3 d
else ! l! h' K, s H: j+ I7 H) r) R
state <= next_state;$ s0 ?2 d. `) I: O- C5 J0 b
b; X* p" d$ u
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
1 a+ M4 C) j4 ^, Y) X! f8 }" G# H; w [& {8 N e0 D6 q+ t
always @(posedge clk)
5 `9 u. l& P0 F' S8 m3 `if(!rst)
) I& ~8 y0 @- W2 ^1 ? state <= POR;7 G; F& x: a( J1 i0 Y9 y: |- x
else 3 ]1 L7 _6 W& l. O/ q
if(vbus) " p/ J: w+ h4 h& ?4 m$ G
state <= POR;
3 y/ h/ |7 L5 n% E3 R7 a else 5 v" w1 e/ V! L. P$ w& C
state <= next_state;
) v# x# f' I9 @, J. s
" J j8 }0 X, c4 o這就是一個明顯的同步RESET電路。1 X- b- G7 ~ a {4 z! ~
. A( S; z( A) G t8 |透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。) U, J7 K7 A* y* O6 i, Z, k
" t! d+ q' j4 M/ P
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
7 s5 |9 w, T/ L# }6 R& m# u
5 }' ?, Y0 T) t% i; C) b最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
+ d/ a& n2 E; q- x4 Uhttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf |
評分
-
查看全部評分
|