Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~- }& D* ]9 L4 @4 U# Y1 ]: D$ C
我是剛從學校進入這領域的新生,說不上是初學者
% W1 ^6 d0 ?2 `0 J% G! {- N" z因為若要設計一些簡單的project,這點我還堪用
' d  D* j& y0 _/ s另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
' K, r% ~- q* Q) |* a
/ b' d  n' {8 I. _2 a1 I+ N, T8 Q不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。; [% [, f  H9 u* Q% p
是關於 `ifdef ... `else .. `endif
; ]/ F1 J7 ]+ ?6 d- R; M
8 z2 }& y' t$ _下面舉某段code  請哪位有經驗的大大能幫我解釋一下8 Y- R. R8 R, l! D4 V/ f: I

- }6 x" B$ I! _. s/ L. o- s`ifdef ASYNC_RESET: u$ W# D( O* i8 Y7 i
        always @(posedge clk or negedge rst)
: Y4 c5 C9 q  T: m`else% R  a, P1 @" z" C) t8 V
        always @(posedge clk)
8 H0 s" y, [% N+ }6 ~* p* V`endif
4 ]9 w. D4 C4 D4 H4 o# g; P        if(!rst)        state <= POR;: P1 G6 l0 F8 m6 ^. l' r
        else
" l: r* }+ {4 h( y& D) z                    if(vbus)   state <= POR;% B1 S2 [' \, ]/ {
        else          state <= next_state;
/ I' K3 _% m! y7 _& F3 q5 o2 ]6 ~
- \7 k! j% @8 M8 H請各為大大賜教了!
# x3 D; P* K4 U) Q
- Z5 f0 [) n2 n3 h我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else! z0 \/ B0 z$ I+ Z  u
不過這條件判斷是以ASYNC_RESET為依據嗎?! o% T# b, B8 A! ~2 E  @  I7 Q/ g
但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
: q, N$ A) L/ f+ K; G
7 ?+ L& z6 a' t0 J相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
) Q( V& F) }5 X) A9 j$ ]6 R" u- {6 q' L
ASYNC_RESET' V8 C. r/ Q  ~$ h8 G
可以用grep 來搜尋整個目錄
" H1 L2 c7 ]9 x6 R0 e$ H( c1 \Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
, O, Q) b& p/ P6 R% |/ I* u小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例% X+ p3 l" _  n! }! `+ v0 h8 K% J$ v
2 f2 m/ r3 q8 K* |1 d5 N! t4 a
ncverilog -f list_file +define+ASYNC_RESET
: r9 a' k: {6 ^- U- i
: H$ s+ b  V: O) Q) T+ O+ ]+ p那會定義在跟 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。
0 o+ e0 q1 k) A' I' a; D所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。$ B, v  q. \# M
( ?! U* W* Z; M
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆: D, m7 {$ {4 \9 W5 a
我在看過回文後有找到定義檔  difines.v的檔案 9 i4 F% X, ^4 [; w! u$ w0 E7 b
找的結果是 被mask掉的一行定義??: [% y0 l, u! s) @! m- q% T
& w1 A( b: H' F# j4 ?- ^) ]
這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
2 b! {3 A5 w  B+ A但是這個`ifdef `else `end卻又一直的出現
! t2 Z- X9 y$ [& H- \以下是我在define找到的描述及定義程式片斷
  G0 e5 ]7 W1 f( |. {`ifdef TEST_IMPL/ o3 l. ^, {3 G$ N, A( b3 [
        // Do not modify this section
, W1 E+ X2 y9 v5 B, J        // this is to run the test bench
) M0 T3 X, i( _& u# G        `define UFC_HADR        17- p& e2 T. s7 q' j3 C: ~
        `define RF_SEL        (!wb_addr_i[17])
9 m& i$ A7 l; Z  M        `define MEM_SEL (wb_addr_i[17]). q) J% F, v- e5 d+ X) x+ J! {7 C
        `define SSRAM_HADR 14
2 W! m" O0 h  `+ P9 L        //`define ASYNC_RESET. f8 |& V7 d; l+ f+ e( x5 i3 i. c; \$ X
`else
* T3 j+ ]! _; h+ j- q3 T9 _        // Modify this section to suit your implementation3 P# r$ Y" Q- ^0 U/ S; o& E
        `define UFC_HADR        12
) `/ r3 a7 d6 f9 P4 y" W        // Address Decoding for Register File select
) T/ ?2 |* W: d$ {1 O# @* Y        `define RF_SEL        (!wb_addr_i[12])3 f0 o* q6 h% \3 d
        // Address Decoding for Buffer Memory select
- {) l# ^8 C, m9 o        `define MEM_SEL        (wb_addr_i[12])
# L! Y* W. Q7 |& J4 G, ?9 E" m( J        `define SSRAM_HADR        9) I5 ^4 T- Z3 x9 a4 H8 ]1 a
        // The next statement determines if reset is async or sync.# ~* [& y# n6 x2 d3 n3 \( I
        // If the define is uncommented the reset will be ASYNC.
0 V0 k3 U1 W2 ~! L! R2 u        //`define ASYNC_RESET
# `  C" y, J% |6 r% I`endif
7 F" M% ^5 P1 n. e在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET# W" z  X( k' w& a. ?1 n6 q
有相關的定義..看到最後真被搞糊塗了..
  r, H1 G" {; t6 w& m2 D3 O9 y. X
' H6 y2 l0 J* f- E+ z另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到( d2 m# P" u4 a  v; J2 M
照walltsou大所說的* q- ]7 W3 v4 Q) k4 R+ [, G
若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)1 R  W8 F/ S# L$ T+ s
若 否 則執行 always@(posedge clk)
" I4 h) b- Q: t6 g( b
( O* m6 G% ^: o5 ]1 C所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
/ i$ Z6 j" `# E5 @1 @( D那這樣我又有個問題(不好意思問題好多 ^^"): s. a9 v; R# x4 t
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
  p# `5 @& F. f9 G
0 E$ H1 L4 e2 c若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
9 m$ ]7 M: f3 K& r4 {always @(posedge clk or negedge rst)- @+ g1 b7 f  `. X& N+ _
if(!rst)        * A) p$ S- @% x  X& `# Q7 l
    state <= POR;
- a2 L$ @2 N1 w, aelse             % d/ u6 @8 r( ]# _1 W4 p) }
    if(vbus)   % m( q6 h% J. Q9 x; ^( @
        state <= POR;
& [( T# A7 Q2 u+ h& T    else         
8 P( H  G% j! R# }/ F        state <= next_state;
8 C$ @4 |% j) R7 O
1 z$ Z% A" Y1 d1 {) s+ ?這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
' |7 E& g& @* `% F  d( N% D% ?; M1 G/ P2 x$ I& s9 J+ \
always @(posedge clk)
% I1 ^+ x/ _  \, Q* C7 Lif(!rst)        
0 i4 z/ a; e2 s2 z. \( g    state <= POR;
7 v* a' N3 ?' @$ [. z& q: h* F$ ~/ aelse             5 Z1 I; Q7 `( x
    if(vbus)   3 _$ [( j, g# K
        state <= POR;. F8 a$ o0 c! u; S
    else         
9 W# N% F4 P- o3 z& [4 G2 ]        state <= next_state;
9 M5 b) F9 p% h' T: m$ E; i2 S, u. X$ J# L
這就是一個明顯的同步RESET電路。  Y# [* W! }1 I6 ~7 [

, ^- @0 A3 v( V& M5 D; j2 D透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。
8 f- y( o) g9 `" w- {. N8 S
0 C! Z# m$ b2 [你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。$ U% d9 Z/ V7 L5 _' H+ d5 U

: m7 c% H0 ^  N/ M0 X' K$ h! r% ^最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。$ q; o. K0 G; e- f( b
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....2 A8 q& O+ E& Z" o9 ]
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...! @" y# r" e6 k! r
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語法使用上的時機及電路在合成方式
4 q( X/ o3 l- q( H* y) s3 ?我會好好的研究同步與非同步的使用,謝謝
: s6 B0 |6 G$ Q1 \" [2 K5 z& _" X/ S
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz
3 R3 q( N7 V9 @. a% E8 B, s也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky 1 G3 j9 \$ t- @

4 L) U$ y. k2 H3 T& \) {) O: C: M2 S4 t8 u& t, `8 F0 A& F3 x
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
% j! e% N7 ]4 s2 o+ j: S! N
, @: \: I! d3 h  T4 G& U# U' [2 [' eThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
9 |7 c' l# W, LThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-4 08:02 PM , Processed in 0.142518 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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