Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~
( c; w6 G( {5 `* i% |5 ^0 y/ G我是剛從學校進入這領域的新生,說不上是初學者& M' B- K/ O, f3 y4 e/ a
因為若要設計一些簡單的project,這點我還堪用
0 p8 w7 a1 U4 |) U3 ?8 ~4 i+ w另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等5 W& t7 j: l$ y$ ?9 q& I9 |

: C4 `! M! l( E7 ?; \7 F$ [不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。( y- ]4 }# r* }% m, B& {
是關於 `ifdef ... `else .. `endif# d  f# h2 M8 C" p% s. B

+ _6 J6 k+ Y( Q$ [9 Y下面舉某段code  請哪位有經驗的大大能幫我解釋一下6 u. a* z$ |. k5 I
1 V6 \% e# c# \! T, |
`ifdef ASYNC_RESET
6 O$ b; u) U/ p+ m$ U* A9 ~: E& K! Y+ r* y        always @(posedge clk or negedge rst)
  P) ?$ h" _+ j6 n6 t5 @7 v`else9 Q" a$ l' c! B! y
        always @(posedge clk)
1 a% g/ D* `% x: M& P`endif
5 D( E9 l$ Z+ W: G& ^' g/ |( ]        if(!rst)        state <= POR;' I& N- a5 f' m+ ~4 X
        else# }& I3 l6 U$ s8 b; ~& }6 n! l1 q
                    if(vbus)   state <= POR;
% J! K/ U* z/ J! I& t) l& j- A        else          state <= next_state;
* y/ b4 v1 Z6 d4 t
" {* j6 J, @( q8 Q6 U6 x請各為大大賜教了!/ S+ P5 ^& U) d4 F& ~% `& ?

1 X9 X7 F# {% q1 A: Q' U+ y我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else
4 U& [6 V! Y0 `不過這條件判斷是以ASYNC_RESET為依據嗎?
2 X# {7 _% T- U但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
- v! V" B( e/ \0 E& j( H* W0 H# n1 X, l+ f$ J
相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
' M6 e5 M: Z& ^6 |8 Y% y2 K4 u6 b9 i
ASYNC_RESET4 p* E7 I" ^$ J9 U  m4 S, M
可以用grep 來搜尋整個目錄; u- v, I  o8 J/ s$ u  Y  q
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
+ q  g; o! s' e. z7 h' c8 H% C9 H小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例, S& \* a1 Y2 g( d$ g. I
4 c: T# o8 i' U/ F: s
ncverilog -f list_file +define+ASYNC_RESET* h% Q# y' p3 G1 ]

$ z" z; J% K# z+ {7 o那會定義在跟 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. X) O' t3 n* C9 m
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
' S; g  O  p4 V9 X/ n/ C* e1 F! ?5 w" v. r5 k
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆* n6 t9 u& A5 p0 B; e/ t( x
我在看過回文後有找到定義檔  difines.v的檔案
7 B. C' W$ V, D3 b. u# z0 _找的結果是 被mask掉的一行定義??
$ u% }& K- J3 d5 N" y% B; g; I5 a: {5 F# ~- X
這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義$ N) o# x4 o% x. P; K, `/ {
但是這個`ifdef `else `end卻又一直的出現
% W6 v" w+ v. k% [8 ^  l以下是我在define找到的描述及定義程式片斷
3 X% p7 u+ o0 t: n`ifdef TEST_IMPL
4 L, [/ `$ `0 Y/ y7 h        // Do not modify this section9 p" q& h5 A$ b
        // this is to run the test bench! }6 F% i' U/ [6 p" C3 }' W# ]$ S2 a
        `define UFC_HADR        17
- t' {4 }; O# M2 t! y% J) v" L% {        `define RF_SEL        (!wb_addr_i[17])( ~" b2 |$ ~4 s: |* \
        `define MEM_SEL (wb_addr_i[17])) s, v& E( |% W; ]
        `define SSRAM_HADR 14
3 ~/ f, k7 X: Q# w        //`define ASYNC_RESET/ Z3 q9 B) k2 `4 x
`else
# j* Z; O6 O: e' T" |$ i        // Modify this section to suit your implementation
* `9 O) L8 ?( B3 ]8 |        `define UFC_HADR        127 c$ H# |' T- A, ?
        // Address Decoding for Register File select' `- r' }$ w% I
        `define RF_SEL        (!wb_addr_i[12])
, S, q7 X* Z! r; t! Z9 ]" l        // Address Decoding for Buffer Memory select
6 r+ s# k' m8 F2 V# ^# [" s, B        `define MEM_SEL        (wb_addr_i[12])) X. _5 m* H3 s5 v+ O
        `define SSRAM_HADR        9. f; t9 _$ _4 n5 q, ?3 y6 N! b
        // The next statement determines if reset is async or sync.
& |# a: T9 l7 ]* D& N( E# a        // If the define is uncommented the reset will be ASYNC.
7 \! @: L8 ?# _* ~        //`define ASYNC_RESET. J) n9 @8 r' X# S1 U1 x: b- E
`endif
, X  j' H  q8 E  ~* e- i$ n在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET0 i8 V3 p. s; v: c
有相關的定義..看到最後真被搞糊塗了.. 1 d& u8 R- d* |. l. D

( p- R# q: d$ J9 N0 c# D另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到, q2 N, W6 c/ o* Y7 @
照walltsou大所說的
3 Z! G8 P/ d2 U1 g6 H若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)) a  _) g* s5 A. ~( y1 b- e$ B
若 否 則執行 always@(posedge clk)
1 O  l3 n$ ?( E( M# Y5 y! n8 \  h2 P1 M3 l
所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
' f( c) x. A2 b8 t/ f* U那這樣我又有個問題(不好意思問題好多 ^^")( e+ L- S% l8 c
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
5 N6 a+ C0 e" u: P6 u  W2 b) b- \# m8 }% y: \% p+ a
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:- v: b( f& q. h) }7 l
always @(posedge clk or negedge rst)2 L- T: G& Y& c
if(!rst)        ) H2 Z' i- m) s# s) f
    state <= POR;3 n! V: y& d8 i
else            
, w$ u: z* j# t# I4 g6 ]' E, H    if(vbus)   
+ g7 f8 E; t0 {9 `# @        state <= POR;
7 b% n5 c; h3 \6 n- P+ R5 P    else         
" U8 \; ^" r  V        state <= next_state;
: z. A' D8 s1 R& u! D0 ^5 f
' ], d) l' g0 `( }  J8 t這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:* Z2 I9 i3 p, b# @" x) ^
, F5 S4 o% @* T7 q
always @(posedge clk)
% X9 N8 U* o2 Q7 W2 X+ {( E. N) B( Oif(!rst)        
$ @; |" m, P$ Q5 n: i    state <= POR;8 @; L6 d& p2 u7 A; D. n4 R
else            
3 |9 [. ^! D: t6 E* C    if(vbus)   ; c( b5 z3 l0 ~3 h) t& k
        state <= POR;
1 f5 n, s# c# l4 w# x' `    else          8 v" \% o) }0 t. N" Y* ^* V7 @
        state <= next_state;3 z( L+ C2 N6 s) K" h* Q

$ n3 b- u1 M5 n7 }這就是一個明顯的同步RESET電路。
2 Q8 G8 b5 z# V1 X% u* U9 ?
- S+ P( H. x: |8 x透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。; m  O2 [3 z5 V& u

; s: \$ D, Y  S1 M$ J# F, a你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。4 y7 N8 d8 w1 F1 [. j- G

8 `+ |6 f: V! _( D最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。5 U6 v$ p$ c: G" c9 h& c
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....
; b3 I, ?% _! p. E+ R/ W+ D  E8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...9 {" L* X0 k7 F& }9 f
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語法使用上的時機及電路在合成方式3 P- T8 Z" w8 q, d7 d1 [
我會好好的研究同步與非同步的使用,謝謝
) J( j: Z, n% [# y% J* v# P# u% n, u; l
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz9 e0 J; Z+ Y6 H" Z, X" i1 `6 u
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky 0 i9 z% \9 q: s; m
  l/ j, b4 F7 u+ F% ?

3 y- w9 ?9 K4 s9 b, G    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
" n+ A3 q. h2 e7 {4 n8 |( D# |0 c$ k4 M3 M. z( y6 M8 e. @- F
Thanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~5 H/ n7 j# l8 [5 M$ r
Thanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-17 05:15 PM , Processed in 0.157020 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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