Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~3 g8 _1 \- @% q3 o) w
我是剛從學校進入這領域的新生,說不上是初學者
; C1 L" n3 V( q* C; i6 P# ^因為若要設計一些簡單的project,這點我還堪用
0 F' c" a( c/ P1 H另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
6 D' \& t2 ~! C; R9 ~- W9 t
& z5 a% v" p" T0 q) I, u不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。
' h- o2 c! ?) F; s# i+ p6 T, o是關於 `ifdef ... `else .. `endif5 W4 t9 [, I& L) q

2 B3 A( c; ^4 s7 ^2 W9 u) I下面舉某段code  請哪位有經驗的大大能幫我解釋一下! U* H: `4 `& ?9 W

" A" o3 }% Y4 n1 w5 u/ v/ X9 Y`ifdef ASYNC_RESET3 ~, z4 \$ {! p
        always @(posedge clk or negedge rst)
3 \/ C4 ~7 @- I5 H, {! K`else. v  m6 z+ h0 e( l0 T4 C
        always @(posedge clk)
1 N$ U$ y  j$ n( ^`endif& w" Q  C3 B& W, V" G# d' d
        if(!rst)        state <= POR;. k( e5 W+ m% r8 s4 |
        else
+ y; x) r; a( N# U$ |                    if(vbus)   state <= POR;3 u* |/ c; k7 M$ H$ b
        else          state <= next_state;
/ J: e2 l# G5 R5 T& a: Z- t
8 p2 \/ [: N5 D2 _1 d/ B請各為大大賜教了!3 K4 ^( y3 m1 n9 P3 C
, f3 c) \- C! V, m1 [/ w6 c, w+ U
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else; _$ [0 ~; U! H* `
不過這條件判斷是以ASYNC_RESET為依據嗎?
* @1 s( ~# }- p9 v2 F, I+ b但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
2 L9 ^* C) }6 }* H. N) Y' ]: |
5 P! G8 x  [( a% F相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
7 O- F* T6 B7 Z+ v* y1 `7 H! T: R, C2 }+ M  B% L
ASYNC_RESET
2 W2 }3 \+ S  R1 ~* F: w0 p5 E4 A可以用grep 來搜尋整個目錄3 Q: {0 a0 T8 W0 o5 H0 u/ i. p! j
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
3 h0 V+ f( R" E小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例1 w/ t; Q9 }+ E' ]- ], }
, m, W" m& }% r9 C  f
ncverilog -f list_file +define+ASYNC_RESET
7 U: F8 @3 J! `4 M9 U5 x
3 }6 v9 z+ i7 j; z/ I* u那會定義在跟 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。1 ]/ ~/ h, ?, X) o: l5 |
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
% o) V8 s' @/ B
4 o1 Y' c9 t2 e2 x. m8 i[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆
7 r9 p0 z& h+ ]* D0 {9 Z我在看過回文後有找到定義檔  difines.v的檔案 ! K% g! L9 E8 R" q
找的結果是 被mask掉的一行定義??
4 ]7 |4 d! }& W: b" m+ I% p+ e4 l- ~
" Q/ A( @5 f/ G' \5 p這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
- F8 R: ?/ m) c7 g$ P" I- L( `但是這個`ifdef `else `end卻又一直的出現
2 e/ ~) p4 J) c5 B以下是我在define找到的描述及定義程式片斷
! }# _4 T+ i( o6 o, l/ s: B`ifdef TEST_IMPL
. P+ ~8 j) q. l. T        // Do not modify this section( D9 h2 S' ^0 k2 A
        // this is to run the test bench
+ H0 j* y; ~4 k2 ^- \        `define UFC_HADR        178 n1 x* `) O5 Q+ X" z3 z
        `define RF_SEL        (!wb_addr_i[17]): _* O$ Z& [2 G. a5 g
        `define MEM_SEL (wb_addr_i[17]), D3 |: x- t6 ~& e! b2 o
        `define SSRAM_HADR 14
: |, b  X$ s& S5 o& I& [        //`define ASYNC_RESET$ Q% J7 o3 i2 p: Y' I: B2 Q) D* C
`else, `/ J. j8 y8 {' ^2 }; j; @
        // Modify this section to suit your implementation
8 \" ]* V3 @  {, f( ]8 p' q3 \        `define UFC_HADR        12& \  {! x( O1 ~0 a  u7 M
        // Address Decoding for Register File select4 U$ e: s# D' U7 U7 T! z
        `define RF_SEL        (!wb_addr_i[12])+ \" |! H0 q, k3 k! R; _3 j
        // Address Decoding for Buffer Memory select& u" }$ K# B# ]. z4 G: W
        `define MEM_SEL        (wb_addr_i[12])! b$ x, Z" M, A! L' _
        `define SSRAM_HADR        9! S3 D2 U4 q5 _9 {6 H0 y
        // The next statement determines if reset is async or sync.% s; y/ q% \5 j6 x" m- ~
        // If the define is uncommented the reset will be ASYNC.
1 _4 a# ^% b) p0 O. |+ g        //`define ASYNC_RESET5 ^: f6 j, a  [" [/ c. G, e# r9 V
`endif3 s* r, Z1 u. l  c
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
! ?; y8 k. z1 P! S) x4 n: m6 E5 [有相關的定義..看到最後真被搞糊塗了.. 5 c. a$ m, \2 `& C1 B# t/ U
: o" ^' C; u( D0 p& q
另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到
8 [" e& T5 U, o, ^! g/ y# B1 O/ W照walltsou大所說的
: j5 X7 j) C, l$ S2 V5 j" k若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
; m% t+ y; B% J( L& `" F2 T若 否 則執行 always@(posedge clk)6 Y7 y- c! C) l; g( ?$ n' g

" n/ ^) L% n: z) n; G, H* b9 n% w% D( q$ b所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
$ C3 Q8 y5 x. A7 ?& q那這樣我又有個問題(不好意思問題好多 ^^")2 s( \. \% b, ]9 @. L# u  {
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣: y6 m% p. J3 C. R' p" M4 t

' }* E. Q6 k6 v& ?7 u' _$ }若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:3 q$ _9 R/ s! a8 A
always @(posedge clk or negedge rst)
0 G; d% r; @0 k# z" cif(!rst)        
# y7 e! A# H4 C. A    state <= POR;! E  x  ]1 s5 N$ w  W2 D( w
else            
: _) n6 {7 H( E+ E- i    if(vbus)     r& D# [* ~- ?: u# Q9 }. r
        state <= POR;
/ V6 W- S3 @# a  |/ o6 \    else         
. w1 Y  \- q: g! _+ H4 S        state <= next_state;
. a6 v# A3 \6 q. k
9 R* m. X* J! y- _3 }8 d這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:& p8 T  D; D7 w4 j
* I7 F; }- V% K- f) g* ]& u: k
always @(posedge clk)
  ?) w9 a/ \3 ^8 J' [6 Fif(!rst)        % `( w) B/ J6 k4 T# y' u0 m* y7 I7 l
    state <= POR;
0 H7 d. L# ~3 y! q/ _9 Melse             " U  D3 _5 i5 V- p: g
    if(vbus)   
" L# M9 c2 T3 w) @9 E4 O        state <= POR;
# R: Y1 i- `! `# r% e$ y1 U    else         
$ N2 m  |6 K) x* m! R, f        state <= next_state;% W* y9 Z( t, R

$ ^5 w" L) p# s/ q/ A這就是一個明顯的同步RESET電路。
0 J% b* {! E$ k/ o
" _& L8 F# D2 S0 q. U0 ~1 p( C6 N透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。
2 O- O: `0 A' Y: ~1 a
2 g1 Z: k  k# U* D2 t- e0 L8 b  _你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
% I+ I3 A; K5 Y/ O0 }
# P6 T3 \) o) G) D2 f# H最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
* n9 P' M* e: ~' b) r  }; Ihttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....
: D. }0 c0 i# t: }& [8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...9 c; }( C% W/ V3 @& _3 |: n+ g' K
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語法使用上的時機及電路在合成方式2 S! @: {7 N3 u/ W! P3 @" c' d
我會好好的研究同步與非同步的使用,謝謝
" ]2 d0 A5 i* \" Q" B1 P' I4 T5 l' L3 E9 {
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz
8 a. ^1 g4 K  b也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky ; C2 f$ m% W" V3 s7 i6 K( g

( n' B- F7 w. |- U" v+ O& Y7 z. P9 O8 C
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
6 C$ x8 |; Q8 K9 ^3 j5 O3 S5 [* F4 Y+ x3 i4 w
Thanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
: L) w1 L8 Y- VThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-4-30 12:04 AM , Processed in 0.139008 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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