返回列表 發帖

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

各位先進好~5 ?+ ~+ ~( q8 \' s( w+ b; w
我是剛從學校進入這領域的新生,說不上是初學者, @8 F& I; i( F; s
因為若要設計一些簡單的project,這點我還堪用. K$ l1 y# ^) o: l* N5 g; r5 H/ g
另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
% Z2 i; o; B1 m( F3 W/ Q7 ]5 {0 _: W/ q
不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。
' o. q! [6 {$ \9 @" K/ d1 [! E是關於 `ifdef ... `else .. `endif
) r1 ?9 ~1 H. B! a/ K$ Q- P# Z# V" y
下面舉某段code  請哪位有經驗的大大能幫我解釋一下
8 W( B; _, B2 L5 h8 e8 w/ D( @+ P. b  E+ B* o/ ^
`ifdef ASYNC_RESET
) R. J7 V' w$ \+ \0 t8 W9 ^$ P4 X        always @(posedge clk or negedge rst)
8 s% H4 i5 Y5 g% P- ]0 L1 z% h% U`else2 B" N, p2 P3 E- Z6 T8 a+ j
        always @(posedge clk)
3 q# N. D3 {' y  c/ r# V1 r`endif& w$ Z' B( V9 g# z: N' Z
        if(!rst)        state <= POR;
8 ]+ ~3 [+ [& N: r7 |) U        else
; l  B9 D5 a: c                    if(vbus)   state <= POR;# W# k/ E$ b# w
        else          state <= next_state;
. z/ Z# ]) m( S) {# H( N0 H% x- R! x" m! ]$ T: f) G7 B# K7 }& q
請各為大大賜教了!
, Z8 Z; ?9 i" E* c# D
7 L7 C0 A9 Z8 g! M+ q3 W) B我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else8 p; K1 R1 Y0 A% o1 B2 s
不過這條件判斷是以ASYNC_RESET為依據嗎?
- X* j& }: x  m% d  X5 c: a# e8 l但我在程式中找不到這個ASYNC_RESET的相關程式斷落..

這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法  J/ v( _/ M2 N0 V" g/ L8 p" E! K
9 @! {9 U, g8 w
相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內
1

評分人數

TOP

`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
4 _$ y  z& Z) j6 I' t' H) U' Q- `8 Y4 j/ J1 O1 B
ASYNC_RESET( H3 ^: T$ M: x2 q* h. S. {
可以用grep 來搜尋整個目錄$ i, c, @" T/ V1 t- \$ R
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
) X; |$ N0 X+ f* V' `' z2 u小弟都是這樣做的啦
1

評分人數

TOP

以 ncverilog 為例
/ V% s) y+ g& ~# N* `( U- v2 y  R3 A8 ~9 M! O4 ~1 A) S( f
ncverilog -f list_file +define+ASYNC_RESET3 _- q2 m' b* A8 Y- L

6 C) G! ~; f1 J那會定義在跟 Test Bench 相關的檔案裡, 可以如同 sakho 所述般去做 search ...
1

評分人數

    • greatsky: 感謝啦!只剩這一點了感謝你的回覆 + 1

TOP

我是從軟體轉來的。所以對`ifdef  `else  `endif的解釋稍有不同。它們比較像C語言的#define,也就是巨集。當程式在轉成RTL時,會經過前處理去掉不必要的註解,在此階段會先作文章處理。而`ifdef  `else  `endif則在此階段作用做文章取代的動作。以此例來說若之前的文章有定義ASYNC_RESET則轉譯時只會出現always @(posedge clk or negedge rst),另一行則被放棄。經過文章處理後的程式碼再進入RTL轉譯。若是沒有定義則以另一行取代,再進行轉譯,此時不使用negedge rst信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。0 `9 `' c4 ?  A1 W; G
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。! p0 g* x# n  J* g* U2 x

7 Q, y1 Z* ^! H+ ?+ D[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]
1

評分人數

TOP

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆" n  a  n1 s: l. b8 V8 e
我在看過回文後有找到定義檔  difines.v的檔案 2 Q+ V& B, X  t) l: S
找的結果是 被mask掉的一行定義??
* g3 q* {; x# Z
0 Y* t3 n( F; L$ r這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
& B9 p2 o2 ^8 v! H但是這個`ifdef `else `end卻又一直的出現% d5 C4 ~# H4 X1 h" C
以下是我在define找到的描述及定義程式片斷! \. \2 y+ N4 X3 A3 V
`ifdef TEST_IMPL# _; i, U7 M/ H1 r
        // Do not modify this section& w* V* ~: z# v" F
        // this is to run the test bench  ]5 u# ?' _4 Z3 L& h, c, \& b. q
        `define UFC_HADR        17
" J4 q" Z2 P* G$ j/ w) ~7 V        `define RF_SEL        (!wb_addr_i[17])
& C; Y5 x8 D3 d' j0 m        `define MEM_SEL (wb_addr_i[17])
1 [8 r- g3 i5 r        `define SSRAM_HADR 14' l- x9 l& C: y7 n7 i, s1 v: l2 x
        //`define ASYNC_RESET
- K, p8 q* t. r0 p, E2 M" Q1 v6 W`else' c8 l$ l' S  i* W1 ~4 W1 m
        // Modify this section to suit your implementation
  g- N( s# E0 l! n        `define UFC_HADR        12
: [% {! y% y1 }+ G  }        // Address Decoding for Register File select
& f2 V2 j+ m3 D/ o3 k        `define RF_SEL        (!wb_addr_i[12])* \0 v+ I5 l* Q; b5 H# g) I
        // Address Decoding for Buffer Memory select
9 Y3 E# r* O# C) {  A1 ~4 S        `define MEM_SEL        (wb_addr_i[12])
$ c0 f; a/ j+ h8 P" L( ?        `define SSRAM_HADR        9+ A( ^' ^4 p  q6 k9 K
        // The next statement determines if reset is async or sync.8 P; ^0 T* U& T) ?
        // If the define is uncommented the reset will be ASYNC.  S& {( p0 t0 J. }' M. b
        //`define ASYNC_RESET2 N# K: ?$ Q6 u' m8 {1 L1 u
`endif, [$ t' u8 K; [* [
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
% k. ]9 g! m' W- K. ?4 \4 [有相關的定義..看到最後真被搞糊塗了.. 7 k! |- J. @$ E. j. ^6 A

0 a" {* f* e3 Z" `& v5 P& g另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz

TOP

在回文後再看過walltsou大的回文思考時,突然想到/ ^8 v6 Z3 }+ ?; N* x
照walltsou大所說的
* _8 d4 z7 c( Z% Z+ P若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst); {9 R; ~9 V  e' G5 U& u
若 否 則執行 always@(posedge clk)
* n6 {0 q7 h& O& ]% d# U- p" j/ ?
) W( C0 u/ f' O* e  i+ _& M. ^$ X所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??% K+ h8 j* k5 z1 [
那這樣我又有個問題(不好意思問題好多 ^^")0 A9 N& Z: M$ b
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?

TOP

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
1 P7 |& d6 H& W$ D2 C) D
# W% N& R% w* l# h) A1 R6 U# f4 B若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
2 z" L1 R* _$ |& [$ @' \: }8 Galways @(posedge clk or negedge rst)4 L/ C/ e- t' @3 h2 i/ G/ C
if(!rst)        5 _/ N; k% \8 ~, ]* X
    state <= POR;8 J) `/ l% t$ b5 H% ]* @
else             * T! J9 S0 H3 v$ m
    if(vbus)   
6 ]# I! }5 i4 F; g        state <= POR;
' `5 K  ?) s! c* r    else          " F  C6 p6 T+ X# e& e3 ?- K5 M- c
        state <= next_state;" B3 X) F+ [5 d  _3 Y/ |* F) W

5 N* w* l1 e; n5 T% D這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:+ M; `% b; g4 c6 M
& N4 H# W& c; m* C+ S; P
always @(posedge clk)
5 y  X3 C* o! [if(!rst)        . ]9 z6 G& A) e  w, l
    state <= POR;
  @/ h; O) r- oelse            
5 I" K; {4 {4 r% y: X5 A    if(vbus)   
' b! r: x* u. a, I; k        state <= POR;
% G& |. `* {# }3 [/ h& R% i    else          6 z- F9 h) ]  @& U( @! e6 C
        state <= next_state;
  g- Q6 a* u% D
9 F: y( {& X- R, q; Y( @% c% N4 K( `這就是一個明顯的同步RESET電路。: F" F: [! ^, b: ~0 G
0 G0 o' a3 N0 j. L: Q1 w" n% [; H
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。6 M$ j. m2 ~# {9 T1 r
, J1 A" Q8 \  A6 p. k  ]" b
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
$ o5 x7 J3 f0 d" w; B! m8 R& \5 d4 v
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。$ z: a" ?1 {1 f9 v' [7 p. E
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf
1

評分人數

    • greatsky: 很受用!感謝你的指點 + 5

TOP

給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....9 P# h# s$ i6 ^# b& h
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...
1 u( q" Y0 ~" k) U' e& V( t8 u, Ggreatsky 加油啦! code多寫, simulation多run,就會愈來愈清楚了...
1

評分人數

    • greatsky: 很受用!感謝你的指點 + 5

TOP

對了...大家都知道modelsim很好用, 再提供你另一個你也許已經知道的東東, 那就是現在的fpga都內建LA了, altera的LA跟Xilinx的chipscope都好用, 你把compile完的結果download 下去FPGA可以用JTAG直接看結果哦, 用過的人都會不想再用真正的LA了...

TOP

感謝 garywlee大  詳盡的解說,看過解說後我能夠有所瞭解`ifdef `else `end語法使用上的時機及電路在合成方式/ j/ ]: {% F3 Y$ l1 @0 n  b
我會好好的研究同步與非同步的使用,謝謝
  d! A3 f+ q* @/ a7 i0 ~; g" d, n( N
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz8 N, M: ~- }2 A" m' R
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式

TOP

OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...

TOP

返回列表

站長推薦 關閉


高手如雲?這裡的好人真不少?還是真的不多?

goerry:這裡的好人真不少..說的都蠻真實的...不過我也說說我的看法...過來人的想法..


查看