Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~
, r) |6 V7 j$ O, P0 g我是剛從學校進入這領域的新生,說不上是初學者" m  [/ _$ O- i' k2 k4 p
因為若要設計一些簡單的project,這點我還堪用/ m* B( z6 f# |
另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
" Q: B4 y) N- X9 p
4 S- Q1 }8 c7 V# K5 F) d! X  X" n$ D不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。4 P# {7 X5 c8 x+ |. W- j- }" \2 b
是關於 `ifdef ... `else .. `endif
3 E1 w' E/ Y+ P' T. p; S8 X2 ^7 a7 m2 x
下面舉某段code  請哪位有經驗的大大能幫我解釋一下
' Y/ \/ }6 D7 t  y# f/ }) G
7 T& x. j- l) u8 K$ ]& u`ifdef ASYNC_RESET
- t8 E5 w) ]) m6 D3 b        always @(posedge clk or negedge rst)
5 _0 A% x6 V  C5 q0 F# ]; }+ n+ a`else, h8 P) J7 A6 J
        always @(posedge clk)/ _1 I/ Y, y+ }+ h
`endif
9 z1 Q; \: ?& a' J* U# b# G9 q        if(!rst)        state <= POR;
  M$ [4 y# k' U0 l        else1 U- {3 {" x- a8 v! y5 b2 c
                    if(vbus)   state <= POR;( K; I. I- \$ Z# [& w  s
        else          state <= next_state;
! s7 R+ {2 _  L+ h0 d2 i  I. d
! ^' f7 w% h, C$ k7 L請各為大大賜教了!2 I; @" i0 k" k8 }8 ]- Z1 j

. Y2 S- _& r( ]我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else7 Z3 r8 K8 A3 [% n) M% [, ?
不過這條件判斷是以ASYNC_RESET為依據嗎?
% u! S- h+ m& {8 S9 a. |$ J$ K但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
" v% d8 k+ R* F2 w4 f8 _; S" I
+ D6 R7 @- K' i# D: F相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣1 ]/ E$ k; Z2 r0 I( n

; k% c: G) G5 nASYNC_RESET
, H" T/ g& q1 c) a8 \可以用grep 來搜尋整個目錄3 B. K2 I; |# I, T& u, ^2 `. u6 M  _
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*& X, C8 G( k& B
小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例
  f0 Q0 N5 n) D# H9 |& J/ Z. ]3 `  [
2 e$ g$ W" }* H$ n  [6 |& yncverilog -f list_file +define+ASYNC_RESET
3 m4 C( B+ V- v. k7 b5 S9 e! p4 G8 [* t. h  r# Y' c1 }# N* |( t
那會定義在跟 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。
" E/ h0 d; b4 N( n2 |所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
4 a1 p  h8 [. V, e* M, B4 \- z8 `! H- N' z9 p
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆5 [+ e3 M# ~2 k5 y& M  s- M3 R% i$ ~
我在看過回文後有找到定義檔  difines.v的檔案 : ]! v7 V$ L! \% A3 _/ `# p
找的結果是 被mask掉的一行定義??
) e) d; u) F( m3 o" m
/ A. ~* @3 Z' i' A這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
$ }$ Q3 X$ r: z  i- J但是這個`ifdef `else `end卻又一直的出現0 H& |- r. s/ C0 l4 ?
以下是我在define找到的描述及定義程式片斷
  M3 p& Y$ Z& o6 ]`ifdef TEST_IMPL! s/ t+ B, e& E' O6 @/ E  l, h
        // Do not modify this section
) W$ o, {& \2 R* y) b* p' t0 c        // this is to run the test bench
7 V$ A7 N* b& h, \        `define UFC_HADR        17& R0 a/ h: u0 R9 }
        `define RF_SEL        (!wb_addr_i[17])
3 L) m4 Z5 Z! A2 C1 ]4 b# l        `define MEM_SEL (wb_addr_i[17])6 ]7 i/ A- j. f+ H( ]. ~+ k$ N1 d
        `define SSRAM_HADR 14: P- e2 A3 `. x; ]6 R
        //`define ASYNC_RESET. t8 w) r/ P7 a& g5 y9 H& f/ A! P# h
`else
% I8 W7 J: O/ g/ M" ~0 \' G0 |& D        // Modify this section to suit your implementation* w; l$ {0 Y! a5 O: n: v
        `define UFC_HADR        12! _5 x+ B% o. {! B8 ~3 {
        // Address Decoding for Register File select4 j& o- S' i; T1 g( f2 v- H
        `define RF_SEL        (!wb_addr_i[12])" T0 Q) @; @4 k# e; K( {) J9 R
        // Address Decoding for Buffer Memory select! d" _6 p& q* t- @, B  q9 F5 e
        `define MEM_SEL        (wb_addr_i[12])
9 M5 c. N  m1 O  Q' R; x2 |7 `        `define SSRAM_HADR        9( |; @9 T6 ^' {
        // The next statement determines if reset is async or sync.
- y+ e/ f, h+ Y        // If the define is uncommented the reset will be ASYNC.: D2 |% ~3 h, b. E# i0 B: k
        //`define ASYNC_RESET9 z) d% @& Q% j+ s% i
`endif
" A' |7 [: z" N6 O9 x$ f' |在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET" l+ |$ x, I2 i5 B
有相關的定義..看到最後真被搞糊塗了..
. O0 R* P$ d4 `1 ]. D( P
% _- g" z: }1 K4 |# x7 @另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到, d8 ^" j& c) i2 I9 o9 b
照walltsou大所說的
. V% x" h5 x. u4 V8 u# }若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)0 n: x7 U% v! t- O2 {4 ^
若 否 則執行 always@(posedge clk)
* h6 f) v- q. e" V
: c& V0 T0 s$ A* X/ W所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??6 l4 J, N8 D7 Q5 t" P2 {7 s6 W
那這樣我又有個問題(不好意思問題好多 ^^")
8 G" T" V+ X* f: h# j. ^* B, A4 b  S若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣& S) \5 y- g. L: Q
9 K* e7 g+ C6 w
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
/ p- n; p$ E: n7 U6 I' _* j: ~always @(posedge clk or negedge rst)
8 I. k2 _) y; C% Y  J* R7 \2 Mif(!rst)        
: k) k3 _5 D& j% Y1 F    state <= POR;6 a; v( R/ b; J" C
else             ! v/ R9 d3 ]9 }4 g1 n/ g& m
    if(vbus)   7 e" S( l3 a, F' T! n) y4 Y
        state <= POR;
; r) A. b) I9 d- J! d  J    else          1 w. N7 D6 a; A4 ?/ R8 g# I
        state <= next_state;
5 H! ^4 B$ W4 r$ D4 `( A- j  z; W0 K3 o# K' Z$ a2 Z
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
% G! T! L1 B0 Z( ^' B
+ F4 y! E! J3 f& w8 J1 J' o' Salways @(posedge clk)
  {  u2 j' G; V0 O. i& Rif(!rst)          r( m0 b7 l3 g/ o
    state <= POR;
1 }6 M* m3 x2 b+ Z; S8 xelse            
8 h2 @' }4 C0 o* q/ M    if(vbus)   6 P- s9 y- Q2 l
        state <= POR;
. _: K5 u- ]; {) A    else          1 v& [1 A3 U4 K8 P! t5 N8 U
        state <= next_state;) B! T7 i4 j1 r* S

' }7 Y2 U6 |6 @這就是一個明顯的同步RESET電路。
: x1 s6 Z6 |. i8 S$ L# {8 C& u; n4 K- t
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。) X) m1 I2 N/ s, l- X/ p) S
" w/ y& ~* ~) d/ i) c
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。/ t' h2 v; H. c
* w4 m  O+ N+ b: e8 L6 D' g5 K4 T
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
6 {( i: h: n* j. }: D& Hhttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....5 |* e" U" z' ~
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...
/ k* {8 I: q1 c6 q; q- S$ F6 vgreatsky 加油啦! 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語法使用上的時機及電路在合成方式
/ `5 G* E1 g6 P我會好好的研究同步與非同步的使用,謝謝
: w9 Z! a. Q) V4 [" _# u7 N/ q' B- i
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz8 a* t0 t& H+ E% s9 k
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky
, P! }, O  y/ g- d# d9 c$ J# c8 b9 l& u& g! L. M1 F& u
$ D) A( X, z( ~+ ]) `( P
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
5 D. b) d; K0 [2 s# I: |  d4 D4 u
% }1 a. z0 S  R& w; hThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
/ u2 X% ^  M/ ]9 z( s* DThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-9 01:29 PM , Processed in 0.171601 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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