Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~
& _# W: T& ~% a& R我是剛從學校進入這領域的新生,說不上是初學者, G1 |) t4 }, r7 T4 t  M
因為若要設計一些簡單的project,這點我還堪用
* U$ S" e7 C' O, Y9 M. X另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等" k+ z( l# N" E
, v: U) r3 ]8 l9 A* z
不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。- ^+ m5 @: q' g5 w2 I/ F
是關於 `ifdef ... `else .. `endif
' o, w1 F0 R. l0 K* {4 u5 C" q( y3 }, E5 V# x; N, `( p
下面舉某段code  請哪位有經驗的大大能幫我解釋一下
& c/ v/ L5 @5 k  U9 {! U5 g. ?& v# C5 u6 p! _
`ifdef ASYNC_RESET% F. @9 W. `$ J! W- r; N
        always @(posedge clk or negedge rst)& ^) \+ a0 J4 O) V
`else
, d$ y" h, Y3 l! s8 a        always @(posedge clk)
: G. @# y) E- M+ c* J  p`endif
& B. B0 X) Y( R0 X- K% @        if(!rst)        state <= POR;' p9 }3 K* Q3 ~3 B8 E5 z
        else
, \1 b8 q2 l3 s( L' A                    if(vbus)   state <= POR;) ^3 |5 l+ @  n' \5 O% k
        else          state <= next_state;
" u3 l# c6 l2 v4 m- |; C" M, t# {& ~% _, x+ T( C, ], D- [
請各為大大賜教了!  l5 P. S6 A# E6 T

+ a' u  ^# I1 t3 p! t2 N我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else: }) h3 Y9 e% r! m8 q1 a
不過這條件判斷是以ASYNC_RESET為依據嗎?3 m* q6 K2 o0 V% P
但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法+ @- S1 m  ?: f2 f& f# F% X/ w8 O/ b7 a8 C
2 S; {  P( E$ U, v( v* W: _. e& ^
相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣, d# w4 y8 x: M  x; E& h* q
+ ?: ^  T0 o; a0 Q. C! q
ASYNC_RESET
+ N7 h9 \) w6 T4 V9 Y+ T6 ^1 ]  q可以用grep 來搜尋整個目錄
7 ~( K( F: D# K) q; a* LEx: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
; p5 [! m+ c# N( ]5 u小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例' _( ?1 @$ M- @: a/ m  H2 \

! U8 b- `# x5 p" f& Rncverilog -f list_file +define+ASYNC_RESET
- z7 {1 M8 E! u$ f0 A, D" C1 S+ B) O& i6 z
& x0 y) }: d" e' h那會定義在跟 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。) ?9 X9 A9 ^% v- W9 N
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
$ r9 D: y% B! D" M* ?+ [3 q/ q7 [. \
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆
% N6 C; M" j/ L5 h7 G我在看過回文後有找到定義檔  difines.v的檔案
* B. b: C8 w+ Q1 h  y找的結果是 被mask掉的一行定義??# r- Y# R6 W9 [. s
7 @) g7 Z) Y' R; o! G+ e% g7 ~
這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
  D6 \8 y) e: c2 [7 O但是這個`ifdef `else `end卻又一直的出現5 j0 ~- d+ F( O' P; s3 p+ s
以下是我在define找到的描述及定義程式片斷- k1 i) A, s9 E3 X
`ifdef TEST_IMPL
+ I9 h; f5 h" D, n$ L        // Do not modify this section7 v+ y' G8 u. g# _5 s
        // this is to run the test bench6 I# A8 D# z* B  n5 u+ B' a" s
        `define UFC_HADR        17
0 x; `! T$ z. @        `define RF_SEL        (!wb_addr_i[17])
, _' N8 f. E* U; t) n+ K5 H, R        `define MEM_SEL (wb_addr_i[17])0 {: E/ l  O" ?6 [+ G
        `define SSRAM_HADR 14
( \$ {) z( c: P. ?. h7 x4 e        //`define ASYNC_RESET
) J1 s$ q1 C. S5 F# V`else$ I0 t+ B4 I- I6 b9 y1 i3 E8 {5 m
        // Modify this section to suit your implementation
* J: f$ K- s8 k' w# V) _2 R- X! k. R        `define UFC_HADR        12
% v/ Z9 s1 b( \( [! H        // Address Decoding for Register File select
0 r( o' L* @) P        `define RF_SEL        (!wb_addr_i[12])
8 ?9 N+ p8 j0 u, G1 t' }        // Address Decoding for Buffer Memory select
7 x; _- g; m2 z2 l6 b( O        `define MEM_SEL        (wb_addr_i[12])
: R  V9 Y2 W" A6 s' j3 b        `define SSRAM_HADR        9! t  ?4 {0 {4 `5 g0 N
        // The next statement determines if reset is async or sync.% G( a7 E1 B- M% K4 w" b, u
        // If the define is uncommented the reset will be ASYNC.) t" ?2 o# [, s3 w6 ^8 N& O% ^
        //`define ASYNC_RESET
6 q+ N3 K. j3 \& G" Z6 m/ ?# s`endif$ H& D% i0 M' ]: I/ Y2 C
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
* ]0 A! M) D9 d) R' [1 g* O0 O有相關的定義..看到最後真被搞糊塗了.. 7 r0 x+ n  `5 z- b  F- d2 O3 l" b

# @$ B1 i% H+ R另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到
, s( a0 t0 |" u" P- S# }照walltsou大所說的
: N5 V: i, c' n1 i+ d6 a若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)1 n& R: `; t8 @6 B
若 否 則執行 always@(posedge clk)
+ k0 f; p9 U9 M1 N4 H* P
6 x; p; y% t$ ]9 g3 k' r所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
! M2 e' F* k  K2 j) e那這樣我又有個問題(不好意思問題好多 ^^"). F! `3 j8 @7 V1 @$ K/ w
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
( W. a6 m6 Y) L. j4 w% c1 i1 J: ~6 c+ f( z
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
2 I: {, F* D9 ?7 ?: J4 Dalways @(posedge clk or negedge rst)" E, Y7 h' w* O% ]: K( Y4 G
if(!rst)        $ ^/ d+ X$ q: E
    state <= POR;
) V2 q- A2 v1 uelse            
9 ]" y2 e3 ^  ^% E/ u0 o    if(vbus)   
9 S% c. _% ^4 W5 S9 v        state <= POR;. t; ?- I2 q3 K0 x1 }! y8 Y$ L
    else         
' q+ ?  f- J' k. k6 X- Y4 a8 B        state <= next_state;) P3 L- b+ D3 K, k# A5 @. C
! n# z* b! g* q& G
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
! R) W9 q& |0 F
$ v! z4 u5 l( k" e( _" u( X! oalways @(posedge clk)
1 ~7 B7 V: c4 A3 }0 C% F8 Dif(!rst)        
+ h1 K- ]5 x( r% Y    state <= POR;
' t1 Q, e/ |* o( Q3 I! G& _* g7 t" zelse             # D- s+ N7 q$ b; D  ]6 d) j  ?
    if(vbus)   
- G' b7 U- T0 H! L        state <= POR;
8 |) t9 y% g' d. I7 n    else          # j3 R$ L$ b& T( e% L  {$ p' Z
        state <= next_state;
( F5 I8 a- w4 }5 X  M$ Y. r. Y' D6 u, e4 B
這就是一個明顯的同步RESET電路。
0 d, s. D3 w. e0 l+ ~
0 ~& H5 A- N) n5 ?透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。, F  B& E/ e+ H8 M- Z3 t# X

7 x( `! M4 l6 _% }8 i# Z- ^9 ^你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。5 X! [- d0 A) f4 ~
; G6 u, X+ m% o( o" N' P/ H3 D
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
( t# T9 f0 U1 v0 p, L- x0 P& q+ W4 thttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....& ]! N# N$ y  x7 j
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...7 Z1 C6 P# b/ M
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語法使用上的時機及電路在合成方式
! b+ b0 F) h9 Z* C我會好好的研究同步與非同步的使用,謝謝
7 d/ u8 |3 r0 N& q6 Z) ^+ N! _; @7 A# U# Q! m5 H5 C
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz" s7 {, C0 h5 \" ]9 ~* i6 Q- P
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky * O: k$ A4 x  |, W5 ~

. O+ \2 D# j. T( I- f0 c  x/ T) `- U& X' d2 S6 Z8 `
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
; f: @: N) |5 ^* L8 k) T* i5 R, K+ p
8 t- D, U% z! @* P1 v5 KThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
. V) {2 v' x( i8 |  oThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-25 02:01 PM , Processed in 0.135518 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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