|
回復 #7 greatsky 的帖子
你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣7 T0 B/ y% V5 q$ i! l
4 H9 N5 M( Y- G' O$ N
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:/ h5 l- A: ^3 W2 d% m
always @(posedge clk or negedge rst)
/ x" |) c- l- y7 ^. xif(!rst)
0 f! c& |( j# V p W( f state <= POR;
h- |4 B8 \8 x9 C+ u; kelse
* K1 u) M0 o$ e' }5 H' y if(vbus)
" u% v# |4 V2 q% r/ X, @0 U state <= POR;. R5 X L% a! k4 X/ m$ s5 p
else
& D& M, \* e+ F% \. @ state <= next_state;; l; o2 A8 n2 P
& F/ e7 ?2 z% c! x6 D6 [9 n* h
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
0 E6 V/ s# X$ E/ k1 y$ w6 A5 P5 @/ f4 t; @
always @(posedge clk)
" |6 |: U8 @7 H( v8 E- y2 Bif(!rst)
; _$ o0 F9 a2 f0 L# B state <= POR;
& Y. Y( o, H- celse
. j9 [# p5 z1 h7 A if(vbus) ) |7 ^0 _' n) i+ B
state <= POR;
~+ ^2 r/ r, _. q k! n& x5 K Q else
& V0 O, n) _, Q' k. Q& i state <= next_state;
7 M# M: z$ b4 r0 r% F) K; r. L
/ R. o' ^: o; C2 e& t$ R這就是一個明顯的同步RESET電路。
" \+ }) E1 x- x1 p7 o [8 ]9 X5 J3 e, ]% v4 w& O! H
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。
( _ @- U- O. e3 F& ?& i/ Y4 F7 ?" B* k
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。: O, ?: {1 q* T" v; m8 C I
. g/ w9 g: }4 X$ L' E
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。) j, l- l- O; C7 q1 l4 j
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf |
評分
-
查看全部評分
|