Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~) |" y# ^, _6 h0 |3 z; u
我是剛從學校進入這領域的新生,說不上是初學者. D6 |7 Z* f5 I+ p- l0 q7 X' E
因為若要設計一些簡單的project,這點我還堪用
2 ]6 b7 _. T3 |( s: Y另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
! S; x/ o, I# L3 L% p# S
1 c1 D7 F9 z- Q& V不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。' F( ~/ h( D( }' _3 Z9 Z1 N
是關於 `ifdef ... `else .. `endif
6 T* T4 B3 e* e: m9 r
& ~% c& Y  ^) Y, I; S下面舉某段code  請哪位有經驗的大大能幫我解釋一下
$ @; v1 L" I; j9 q% Y( F! b
) v' E0 r  ]0 p. D( b`ifdef ASYNC_RESET" {: f$ e" x! l+ O; V6 z. B: D
        always @(posedge clk or negedge rst). z3 E9 _) ~. |0 N. C5 L! @- V
`else
- `! C/ i# d* Y* ]; x        always @(posedge clk)
9 I2 F, Q6 m* {( r4 s$ S`endif
/ L9 u9 F. O7 y0 j- r7 h        if(!rst)        state <= POR;
+ k9 X7 S  L2 e% R0 \; S        else4 t) O6 L$ p$ U5 D8 i, A7 L, ~8 V- L9 U
                    if(vbus)   state <= POR;
1 J9 \" C, I$ A. H4 W" G        else          state <= next_state;
# M* ?& F4 }, O& T4 g( n' X- Y! j7 |) D7 |
請各為大大賜教了!
# m2 z. w# H) T1 M- S9 `8 G: `) o6 A! R; c: K2 [
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else; Y/ r; V% \4 _
不過這條件判斷是以ASYNC_RESET為依據嗎?
  _# E+ ]; S' b/ L- z/ U但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法/ I. N- `0 o/ t$ Q

, T: k7 U# V' n$ t4 l/ K相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
7 t; a* {& s' ~4 I5 e, |- L9 s* m9 J8 i2 m7 {: j" \- G
ASYNC_RESET3 }3 c' m' ]5 ]. a' T0 `" J+ [
可以用grep 來搜尋整個目錄
/ m8 d% S- a5 C- P# |9 YEx: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.** v8 E; z9 W9 f  a2 R* @
小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例# @4 W- O; A9 v1 _; `( k2 p3 L; d
3 v1 B/ `, i# E" X
ncverilog -f list_file +define+ASYNC_RESET: \" D4 w5 a2 V- r( M

! g6 T/ d0 ]5 Z: R0 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。7 E8 ]. J+ ^# }/ ?: p# H2 Y
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
! I% J8 u0 |2 x2 E
6 ?+ z, y4 G& m1 D- K. E- O[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆
& _" z$ I/ ^7 r" y  v8 [+ B我在看過回文後有找到定義檔  difines.v的檔案
: y8 `% ]3 F& v/ n找的結果是 被mask掉的一行定義??5 i, o- ^0 H. E

+ ^7 `9 s% f- _! f( ]$ h這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義# \3 @9 v1 X" G8 F: g
但是這個`ifdef `else `end卻又一直的出現* ?4 q* r; B3 }+ `4 O- z
以下是我在define找到的描述及定義程式片斷
5 v5 ^- N8 x7 Z3 ~- E`ifdef TEST_IMPL3 W" O1 Z- J. t: |) J6 r
        // Do not modify this section; F' l' ]3 |, q
        // this is to run the test bench
1 t9 E0 q. ?6 Q+ t/ k4 F6 ~        `define UFC_HADR        17" ]: `9 a% V1 B- O5 u/ E
        `define RF_SEL        (!wb_addr_i[17])1 h1 X3 E: `0 g! N; b
        `define MEM_SEL (wb_addr_i[17])* W: N& t/ P1 D$ Z' j8 K
        `define SSRAM_HADR 144 n( F! s- ?  o( {" K$ e
        //`define ASYNC_RESET* x& A' d% n: V% z# |7 A
`else
+ a7 ~; I" Y- z  T8 F8 H5 h! Q        // Modify this section to suit your implementation2 G- C2 a8 H) Q; T$ q, y8 x' F
        `define UFC_HADR        125 ?9 k- P9 P5 B& ]- z. q1 f- @/ m
        // Address Decoding for Register File select
, }# D$ ^6 H& `% Z. b        `define RF_SEL        (!wb_addr_i[12])' U4 K- t" d& [8 ?( j6 i+ j
        // Address Decoding for Buffer Memory select
- e; R6 Z1 P! ^7 ]1 {, W; w        `define MEM_SEL        (wb_addr_i[12]); ]# ]( \4 c. J3 _7 r4 }( R4 E8 G
        `define SSRAM_HADR        9
3 l4 F- D5 B5 R: M0 a# l7 }        // The next statement determines if reset is async or sync.
5 k' K1 Z2 M& p' [" L        // If the define is uncommented the reset will be ASYNC.
' i, I1 Q/ I/ ?' M* g! b' S2 R        //`define ASYNC_RESET
! U# n) h5 n- H* {6 r; \  n" h6 z`endif3 [1 M2 r: }0 z
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET* R! W0 R" ]7 R  ^! f
有相關的定義..看到最後真被搞糊塗了.. 7 s! p, [1 R/ b, v

8 K" d1 n$ P1 g# m另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到
. u# {# X4 J- k: t& A1 ~% I3 M照walltsou大所說的, n# p& l$ x! k5 S7 c$ f: A
若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
& S' M/ B; D  }2 J+ c8 ]- k9 n5 \若 否 則執行 always@(posedge clk)  F# p  v* y* ]0 A

4 b+ c0 |, v% G8 ~! i, ^% z! O7 i所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??. v% K9 \2 I6 T) J
那這樣我又有個問題(不好意思問題好多 ^^")1 l8 {0 q; L$ H1 M5 z
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
; H) w! x, C9 b8 a% h% a* U/ G1 Z9 q) u8 ~1 s. l, E: W0 T
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:, H  K5 t1 m' l# z' S7 B  E: q
always @(posedge clk or negedge rst), p2 ^. ~& w8 ~  R
if(!rst)        
" T. @  Q" N, p    state <= POR;* W( _, U2 }+ i8 u4 Q& ^- B
else             4 v  o0 V7 \0 T6 s. p
    if(vbus)   
9 g% ?1 `: q! T" t4 I7 r8 p        state <= POR;) P: H6 {9 Q- F  r
    else          5 w( T, O& N# H) Z1 |8 ^; i, W
        state <= next_state;
4 G9 @& v2 ?7 M+ |+ X$ l7 k
2 \' N! C# |, W$ j這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:# f, G4 t3 x) r- y

7 ^. N3 ^5 K1 y- halways @(posedge clk)
2 e- h3 ]0 C  W( Rif(!rst)        
- e' c1 Y# {6 l    state <= POR;1 m6 ^) h" F" _4 v; M: a/ ^8 C0 X  F
else             ( {6 F4 o/ P6 b
    if(vbus)   
. A* q& @5 j7 B+ T& _" m/ O        state <= POR;. o& B# u0 N$ H: D' @5 m  |
    else         
6 Y# ^5 A" ]% e        state <= next_state;
+ f: ?! `; X8 j& H& o- K; F
* v1 b7 c" Y3 M這就是一個明顯的同步RESET電路。
8 K- ?" g0 @* U8 q& D8 p5 C4 g8 d! @! T- h
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。5 P7 R/ n  i0 h# a; T% T' |8 {( g

1 C! ?* ~3 s1 g! b你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。  I( K& g3 V, ~; a( V. w

4 |7 `4 [; M+ @5 R5 c' `# G最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
& }& g5 k/ |6 ?' v) ^) S, rhttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....
# J! q7 k+ U+ j: P% R* R8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...1 K* U+ T! W+ r# U: R4 }, [
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語法使用上的時機及電路在合成方式5 r# X3 ^2 ]3 t" o4 ]
我會好好的研究同步與非同步的使用,謝謝
# Q, U3 c' _9 m$ c" G0 Y8 P$ K' U1 D4 O+ B+ M
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz
  w! F( [/ c2 w! f) \也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky
* _% I4 f' T9 f% c
) Q9 i& b+ ?) U9 @5 F: J; L$ T$ U! p
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho 8 S# r# O- o2 ?. _0 t& j

3 Y& l' X8 g1 Y$ J* FThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~/ i% n8 c! u( G4 }
Thanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-8 05:49 PM , Processed in 0.218528 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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