Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 34504|回復: 14
打印 上一主題 下一主題

[問題求助] 關於Verilog語法一問?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~% f3 z, d  N: G/ V
我是剛從學校進入這領域的新生,說不上是初學者
. i1 _  c! W8 L& d3 {: c, P2 F! N因為若要設計一些簡單的project,這點我還堪用' o$ P! w' j' q. e- c9 p
另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
  i9 J" v- X6 [  G! }, G5 T( ~7 O2 c6 L+ g
不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。
) x6 X; \& t& E( Z# D是關於 `ifdef ... `else .. `endif
: _6 K+ s- ^( h+ u& C  k7 y, B$ v$ Q( a) z+ L& s
下面舉某段code  請哪位有經驗的大大能幫我解釋一下
$ i9 ^. F8 q+ Z, _( |( \  U  G1 n5 i+ U% n9 D5 w5 P5 Q$ _7 S- Z
`ifdef ASYNC_RESET
* u, @  K( o2 c( r        always @(posedge clk or negedge rst)
! e! k& c& _) S8 [`else* D1 X4 C6 H  {2 ~: H
        always @(posedge clk)2 @) X& X, O. S, J! Q
`endif
  j- _' a* c8 }' ~2 @, {8 e        if(!rst)        state <= POR;  A# t1 z) b4 {. C/ y: [0 P# }
        else
- {' m% l, ^% D! s! f                    if(vbus)   state <= POR;
. G6 l1 L1 C! a; ]        else          state <= next_state;7 f9 x- Q* r- _8 G+ h* m; }
6 b! s; ~+ h. j( G1 E' o
請各為大大賜教了!2 z# d9 ^2 d" C- C! a$ U- @7 [- E

0 A7 J+ k1 j4 z3 }我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else
) e1 g  @/ ~$ b. ^不過這條件判斷是以ASYNC_RESET為依據嗎?2 ]. C- F; }  [/ }0 y. I) {, |( ^
但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法+ j6 m* a( a0 ]2 @/ \+ ]- Z& F
, R: {! \: ]5 Z$ Z& i
相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

參與人數 1 +3 收起 理由
greatsky + 3 感謝啦!

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣8 {6 c5 t" X- a( N: ]8 i$ L/ ^

9 b) H2 a8 U' ?, W8 C# sASYNC_RESET
0 l' z, z! s' L2 Y- U; G可以用grep 來搜尋整個目錄- {" m8 r& a; }. S* R+ {
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
) r/ H) y, t, ]: _小弟都是這樣做的啦

評分

參與人數 1 +3 收起 理由
greatsky + 3 感謝啦!

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例; }# L3 H) y- o

% `7 h# h5 @' V& H9 r4 G, {7 Bncverilog -f list_file +define+ASYNC_RESET' r- l8 |# L; J1 ~8 a
/ X% F/ P8 u0 R
那會定義在跟 Test Bench 相關的檔案裡, 可以如同 sakho 所述般去做 search ...

評分

參與人數 1 +1 收起 理由
greatsky + 1 感謝啦!只剩這一點了感謝你的回覆

查看全部評分

5#
發表於 2007-1-19 09:23:52 | 只看該作者
我是從軟體轉來的。所以對`ifdef  `else  `endif的解釋稍有不同。它們比較像C語言的#define,也就是巨集。當程式在轉成RTL時,會經過前處理去掉不必要的註解,在此階段會先作文章處理。而`ifdef  `else  `endif則在此階段作用做文章取代的動作。以此例來說若之前的文章有定義ASYNC_RESET則轉譯時只會出現always @(posedge clk or negedge rst),另一行則被放棄。經過文章處理後的程式碼再進入RTL轉譯。若是沒有定義則以另一行取代,再進行轉譯,此時不使用negedge rst信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。
& v$ E, }' ~/ V) K+ P- V4 B所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。2 @6 x% V7 h: f4 Z1 U% E- Y" b

% M- u8 ]; @/ m- R[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

參與人數 1 +3 收起 理由
greatsky + 3 感謝啦!

查看全部評分

6#
 樓主| 發表於 2007-1-22 15:30:27 | 只看該作者

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆4 |+ C2 V/ z; O' t
我在看過回文後有找到定義檔  difines.v的檔案 1 K2 P# O6 X; V6 }$ }& ?1 p# [& l
找的結果是 被mask掉的一行定義??% F6 @$ v& v3 U1 s
, m: _6 N3 [- \% W; _5 j
這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義5 q# T7 `1 l0 l; D0 Y3 S, y; ?5 E& H
但是這個`ifdef `else `end卻又一直的出現0 c  R. G( j8 g& J8 x( Z
以下是我在define找到的描述及定義程式片斷
2 W; ]7 c  E$ o8 |8 h, i`ifdef TEST_IMPL
' ]( T9 F' a0 o7 q: p        // Do not modify this section, }" ?6 k7 U7 y! s/ E# J& i" X
        // this is to run the test bench2 D. U/ Q3 F0 j- s. ^
        `define UFC_HADR        174 W' s' {1 W; p5 P2 F5 `
        `define RF_SEL        (!wb_addr_i[17])! V; y# w9 m! Q$ y0 F8 C) M; ]
        `define MEM_SEL (wb_addr_i[17])
% H  y5 U! m5 H& ^6 K1 h        `define SSRAM_HADR 14, ]& L$ B; _; l
        //`define ASYNC_RESET
$ @1 {% g5 d) Y+ W8 r' R. r`else
! j4 F7 D8 G8 H6 F5 q" ]        // Modify this section to suit your implementation
3 \) }3 \$ V4 ?5 Z  n        `define UFC_HADR        12
) C0 Z/ ^6 M" i  e+ v        // Address Decoding for Register File select
! w5 v, q$ l6 l( I        `define RF_SEL        (!wb_addr_i[12])0 e; j: B4 W, D( L) D/ I+ ?+ X
        // Address Decoding for Buffer Memory select( }1 |/ ^$ {" ~  T$ e
        `define MEM_SEL        (wb_addr_i[12])
+ I$ I9 I4 o' h( Y' q* X        `define SSRAM_HADR        9
+ ~# @1 y) t# m  J        // The next statement determines if reset is async or sync.% h% ~2 R* s- X) C  D0 P
        // If the define is uncommented the reset will be ASYNC.: {/ y0 X$ d6 g6 O4 a: @- J
        //`define ASYNC_RESET" n9 `: [' G! z% n
`endif
. m3 t- ^% H( e+ E* A. a在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
$ B0 D% b3 K, I# \3 L: k有相關的定義..看到最後真被搞糊塗了.. + a: B8 ?$ V% U7 H% ^' B2 J5 u
0 L5 S, t& ~4 ~+ \  k
另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到2 c' ]# V. G' w8 d
照walltsou大所說的& f7 w. J2 w1 e4 F, @. r
若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)$ j# j- B) k3 H3 c) W
若 否 則執行 always@(posedge clk), \% D6 n5 C1 x5 [' T. w

" B$ R3 @. Z" h$ Q所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
) p6 T6 u4 ]# |+ e3 }$ D- O那這樣我又有個問題(不好意思問題好多 ^^")
( N7 i( P- C1 m9 b8 {若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣7 I& A0 g6 r, R2 b

2 M8 T' |  L4 u. l若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
6 ?/ h- X1 q3 `# \always @(posedge clk or negedge rst)7 }7 p" c+ a7 l
if(!rst)        
0 q, X, B5 i- X: q3 B& q% x  [$ w: ?* Z    state <= POR;
0 W) E4 ?  O7 Y* l) melse            
5 ^7 v- J! Y0 ]4 U; V0 A    if(vbus)   
- e+ c" g5 L. `: h  B        state <= POR;
) g2 C/ `: u. O2 J/ S" r& Z# K    else         
/ a: e8 c7 ~8 p0 V6 [% M        state <= next_state;
! t* h" S& h1 d0 ]3 n9 N# n& n
6 T7 y* h3 P* d3 ?/ }9 @0 w這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:  B$ `( [  x7 d) y; Y
9 H" z: J4 Y! h$ D  G
always @(posedge clk)7 m* o3 K. Q' q/ }2 ^- w) z
if(!rst)        7 W' X( n+ K% u  p& g# t
    state <= POR;/ G# f+ b/ E& Y4 ^6 e, C: @
else             $ r- u0 O8 }4 ?1 W
    if(vbus)   0 S* m) P, q$ b3 a) c. F/ x; F$ o: M
        state <= POR;
' d% B) [* f$ N, l    else          - W5 K& i6 F; n" {/ A# b
        state <= next_state;; U. W# F& m2 A

) l7 U3 g% H2 I- a; v  P# F  I這就是一個明顯的同步RESET電路。) V0 x/ R1 j; i& K2 o
7 G. B# ]( n( ^/ m# L; u$ C* W% Z
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。7 Z1 M- Z) J3 i
# _# @5 C! \; b1 B6 D* b
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。3 D& }2 T  ~4 d# E
5 \7 n% d" I% g. v: _% {( j3 l) C
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
+ b; K( |3 j) @9 K1 B* l& @) x9 Bhttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

參與人數 1 +5 收起 理由
greatsky + 5 很受用!感謝你的指點

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....
$ A! O# |$ U8 }' B& c8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...  U* z8 G- [) r# e4 k, R% `
greatsky 加油啦! code多寫, simulation多run,就會愈來愈清楚了...

評分

參與人數 1 +5 收起 理由
greatsky + 5 很受用!感謝你的指點

查看全部評分

10#
發表於 2007-1-22 21:33:55 | 只看該作者
對了...大家都知道modelsim很好用, 再提供你另一個你也許已經知道的東東, 那就是現在的fpga都內建LA了, altera的LA跟Xilinx的chipscope都好用, 你把compile完的結果download 下去FPGA可以用JTAG直接看結果哦, 用過的人都會不想再用真正的LA了...
11#
 樓主| 發表於 2007-1-22 23:41:25 | 只看該作者
感謝 garywlee大  詳盡的解說,看過解說後我能夠有所瞭解`ifdef `else `end語法使用上的時機及電路在合成方式
9 c* _. y+ E$ Y3 K' H6 L( z" \我會好好的研究同步與非同步的使用,謝謝+ `3 a9 a" u- e( O/ W

" F4 `, C! }8 j+ G  h0 w5 E' }8 Q$ {另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz
% d% z& k. M# s3 R也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky
* O" U: y+ J! ^) s: O8 c3 b/ x7 u1 F- C/ C
3 F3 h9 U) ?+ _) E: \1 {
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
8 B6 \! \! B7 E# w! n) F3 L, g
2 K% }. h( h+ _1 M1 L& EThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
- `9 j0 C3 Y- \6 F# kThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-9-27 01:38 AM , Processed in 0.197011 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表