Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~  ?  f# O) V, J
我是剛從學校進入這領域的新生,說不上是初學者
5 h: ^. y& n' f* |因為若要設計一些簡單的project,這點我還堪用
1 l/ D: W) D0 W另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等* A1 i7 ~5 l- r$ `$ Q" ]3 f
  J) y' L" \5 A) h7 y9 Q9 e. P  J
不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。* e* c! h5 F! k- x
是關於 `ifdef ... `else .. `endif
( a7 u9 M5 E4 F: f0 Z5 g. G/ a  e9 x7 t
下面舉某段code  請哪位有經驗的大大能幫我解釋一下
- @( r2 o& H1 q" v  H* k: x! ?2 w1 G
/ d- E# D) P+ {* m* z; q9 K. E) T6 |`ifdef ASYNC_RESET
( O. V0 e5 _. v% S# Q" D        always @(posedge clk or negedge rst)
9 ~' M5 o6 j- J' ?: W5 {`else3 H$ D0 ^: M; b( M, v' v# M
        always @(posedge clk)
* w+ a2 l$ x  n3 o0 v" v`endif
3 J% q$ k! J3 W/ x6 E! q        if(!rst)        state <= POR;* Y( s+ `5 M. r
        else* D$ K, @. M$ z; F1 F. M) ]( L6 S9 T
                    if(vbus)   state <= POR;
- @1 u1 m6 B# Z' C# p% c) z        else          state <= next_state;
- _! b+ H- W9 L1 [; i7 i5 y
2 p; {( N& h, ?4 k2 z2 K# H- t請各為大大賜教了!2 I4 A; z: t, W7 D3 B: F* R
1 h: H* S2 d1 N  q7 I* K9 i* h9 B# U, K
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else" b8 |' h3 ~8 H9 O
不過這條件判斷是以ASYNC_RESET為依據嗎?
$ M1 N8 R# Z- g3 m但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
% E7 N- A& L- j
9 @( g. c9 ]; f, W相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣9 B5 z+ ~8 }  S9 R/ Q( A; h% O
3 p+ j3 ]+ s  l; c. W
ASYNC_RESET
. ?  n, X. |0 Y: V+ x0 L+ q可以用grep 來搜尋整個目錄$ z, ?( J- R/ I: @( r" O
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
- G1 A9 r! A# ~, E/ o6 o/ X小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例
6 s4 b+ Z- a  `& i& l  }, G$ s
! J9 [7 M+ [0 }8 n5 wncverilog -f list_file +define+ASYNC_RESET
7 e; ~" a: W2 ^
* f" Y( y; g# H. @- B那會定義在跟 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。( ?5 P' _5 _0 a5 B2 N% o2 b! p  z2 b
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。* I3 R+ k: T3 A9 A  a
/ e' ^5 T8 f. h4 ]
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆& e, L) x7 `7 @/ k6 ~* g( d+ ?$ @
我在看過回文後有找到定義檔  difines.v的檔案 ) \4 |% p1 r. G- b& l; U8 j) K
找的結果是 被mask掉的一行定義??% I5 L/ {* _. _  L" k3 S' x" \* P* U
, r8 T3 h8 K1 @
這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義% U0 F, Y+ g9 m2 j0 i$ G9 E+ y5 m
但是這個`ifdef `else `end卻又一直的出現
( B) f. {0 U  z- h: r" p3 f: l以下是我在define找到的描述及定義程式片斷; S, H. b4 k* M( Q+ P
`ifdef TEST_IMPL" Y; K/ v2 d5 p  m+ w
        // Do not modify this section
& a/ R3 n3 R6 D. x9 z        // this is to run the test bench, L" O/ i' F: ]& b5 o
        `define UFC_HADR        17# w+ H4 }% z8 ]2 _9 E/ |7 K
        `define RF_SEL        (!wb_addr_i[17])
5 p4 O% q/ m7 i/ q6 O( T- v" F3 I: [        `define MEM_SEL (wb_addr_i[17])) I- C" k) ^" j
        `define SSRAM_HADR 14
8 ]( g: x  B! }, |        //`define ASYNC_RESET
7 o; ~3 Z( z( W# z: V`else- g' |( I; k. I& @; B& l
        // Modify this section to suit your implementation
. q; k0 p  |" g, b        `define UFC_HADR        12
7 l9 K  Z5 f+ U" I5 ~% O' f        // Address Decoding for Register File select, c9 _" r+ x, m8 F( I
        `define RF_SEL        (!wb_addr_i[12])
& L  J4 e9 h! A' w7 F7 j) y        // Address Decoding for Buffer Memory select
# f1 }) ?( ?1 g: L6 P. f        `define MEM_SEL        (wb_addr_i[12]). E& E4 L% H" i& e% f
        `define SSRAM_HADR        9
2 K0 C0 N; U) x  l5 S$ M        // The next statement determines if reset is async or sync.7 A' B2 `8 I+ }# D, `$ a. {
        // If the define is uncommented the reset will be ASYNC.
( }  @6 }7 w1 k! [3 r! p        //`define ASYNC_RESET
4 S4 P9 `1 o+ R1 B! c% S`endif
8 Y1 ?* Q' K  W2 b在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET- Y: Y/ Y2 n+ Z0 Y6 o. G* q# o
有相關的定義..看到最後真被搞糊塗了..
4 j2 ^( L2 Q& y/ g8 ]( E* r3 U: K. a% W! A) {' ^# M9 A
另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到
. }2 I% a; p/ V0 ~* }+ }2 u% W/ Y照walltsou大所說的+ {8 _4 t( O5 E- n% M& v
若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
5 E3 [) H8 R) W/ m" h若 否 則執行 always@(posedge clk)1 M! ^! g$ F6 |0 a8 M

3 u- P' K* j' o所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
/ G0 a9 f  K5 y% Y那這樣我又有個問題(不好意思問題好多 ^^")4 O9 |0 w2 {9 ^2 L+ z* Y
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣/ D2 Y& Z6 R; R% c. h% V

. m2 K' C: A3 \9 P! c若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
7 F; a6 x" k6 d9 N2 }- V9 \- Malways @(posedge clk or negedge rst), x8 g7 F7 t4 [. S( j2 g
if(!rst)        
6 j1 \- G; L" H    state <= POR;) z  ^& F! H( z* V1 V- R$ ]9 L( N  h
else            
5 c/ `2 G+ b' ?) J6 U    if(vbus)   9 u% Q$ k- ~& c
        state <= POR;
+ w2 `0 D  F2 [2 G& F    else          & G9 |  x0 I% W8 B0 h, f
        state <= next_state;) t4 ]+ h+ C% p
7 T0 q' |& w) Y' {. a
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
& z7 j* v. D, f# Q
/ g9 F( I$ H; ?7 E' x5 ?always @(posedge clk)
; T. h: c/ r! p! T+ ^" \if(!rst)        1 u0 E; `! `  i: S
    state <= POR;& b+ Y: o3 l* }6 Q, {6 {2 j1 l& n  r- }
else             . Z# D$ i6 x9 j8 [* e- A+ t/ o
    if(vbus)   
6 |! d; S( a- d, F4 o        state <= POR;3 V! l7 B: i2 D& `% w+ }% y- K
    else         
9 E. J: H+ o6 V/ c! u        state <= next_state;
3 i# e8 d3 o  k4 D* i5 a2 ]# Z& {: V- `$ Y3 N- P+ \
這就是一個明顯的同步RESET電路。' F2 r6 q+ F- `1 t  C

6 x4 ]3 n0 a5 ]; E+ ?* Y# O, ?透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。7 x& w" O8 J8 m% w1 ?& R- ^
! G: L. P* t4 I5 R4 r  E
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
9 S9 L$ D# T' L9 D  r. }8 c- r6 Y7 H4 j: H
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。: w: g( a- R: I4 M+ I
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....
& {" ]4 o; p$ F4 f6 Z8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...: R8 @( r" K9 S! l6 T
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語法使用上的時機及電路在合成方式: K& i* H% o/ C" o
我會好好的研究同步與非同步的使用,謝謝  a; `. M) ^1 {9 Y) O

9 f1 }; Q) s2 O另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz" |7 V" M( ?- G6 Z" C2 i* k8 l
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky
; c* K0 W" }1 e  g) k# N9 c
5 e7 z' \4 A6 N" j9 g' ^
! o9 E& s7 X+ T2 Q: t    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho 6 }. @" ?; D' H; {+ S

( D! i$ ?% R* E$ TThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~3 f, I9 ?$ A' y% m5 Y6 B
Thanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-15 04:48 PM , Processed in 0.120516 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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