Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~+ q' [/ Z6 o& g, {" i8 m* q% l
我是剛從學校進入這領域的新生,說不上是初學者7 W$ k* A4 C. r7 p$ Q' |
因為若要設計一些簡單的project,這點我還堪用* ^% [) ~4 U: ]/ V2 ]
另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等& u5 L9 K: a7 C7 p

/ h7 z9 \+ c3 p! X7 _不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。
; [/ w4 A5 @/ F2 |! p* g: k是關於 `ifdef ... `else .. `endif
& a- L1 w" @/ i- P
, D% `9 w3 W9 N# F  }% Q+ ]6 C' O# S下面舉某段code  請哪位有經驗的大大能幫我解釋一下' g2 n8 K5 o$ [9 m% {. U

# c% g5 A; o4 `7 M- s`ifdef ASYNC_RESET
  u8 C2 K# ?. I* i  ~        always @(posedge clk or negedge rst)& M' U% I& \/ k+ G0 s$ Y
`else
( ]) y# x/ L. `% K        always @(posedge clk): K% b* q' A+ X' e
`endif& L8 D. f! c4 r: \
        if(!rst)        state <= POR;8 P5 A5 p1 S0 d6 N
        else) q: s2 c2 W0 K! Z- e# a
                    if(vbus)   state <= POR;) R. J# x& A; D9 l/ e
        else          state <= next_state;
( H3 p5 U# G5 ^( H9 x; L* x+ ~+ z) C# ]! N2 J" |5 F9 e
請各為大大賜教了!
: |0 J$ e& e8 }8 i  j. x& [' |! l2 l; ?" U* g) d& T* U: N
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else
7 V8 z7 m# U, ?" V) U8 K& l不過這條件判斷是以ASYNC_RESET為依據嗎?7 {/ F2 Z" t, o4 q
但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
, [( t7 D4 F2 c/ Y
5 E5 ?: D; u- z3 R( v7 `- ~相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣, Q( C8 q' Z0 f" o

4 B& `9 q& C) N* N0 pASYNC_RESET
6 p9 g' [6 I  p% |- |可以用grep 來搜尋整個目錄1 z  t, h1 z0 {  X! {0 s* q6 L
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*, ^% s. e/ V1 S
小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例
" ~( B$ `; F% W
1 S, J+ Q' X2 }2 \% [/ T0 q* y7 j9 Uncverilog -f list_file +define+ASYNC_RESET
, t7 @/ {4 T2 `0 m7 |6 Y) _  `) B' h# H4 e# l1 k8 A5 i  P" k
那會定義在跟 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。
* h8 P6 T% Y% c( `' T所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
3 l7 M; C* d/ }$ R& A% ~1 f" A( X9 w" h  k" }
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆  W( E0 ^9 }$ ?+ b9 F" M6 `* v
我在看過回文後有找到定義檔  difines.v的檔案
  {+ b4 N5 l! x+ n! f/ _  H! k' U找的結果是 被mask掉的一行定義??
8 P) L3 z% H, U( l9 E$ j
2 o+ V: I1 ^6 V這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
+ p8 H- O' X( @0 L但是這個`ifdef `else `end卻又一直的出現
$ c, d* G# p* d3 b( ~$ s" A6 f以下是我在define找到的描述及定義程式片斷
6 ~3 A& D5 h& s`ifdef TEST_IMPL
! j5 T( `$ G. s2 c9 G5 N        // Do not modify this section) k" }: }9 [* n, K/ A
        // this is to run the test bench! W# R- i& W1 f# i
        `define UFC_HADR        179 }/ ~: F: v2 f6 x# J% @. J5 a4 A
        `define RF_SEL        (!wb_addr_i[17])8 u, B" L' O2 [, Q0 ~$ Y
        `define MEM_SEL (wb_addr_i[17])( Z: n8 C- ]  E" Z) ]1 s, }4 ?$ U
        `define SSRAM_HADR 14* c, u) d5 F  w% H6 M' E6 F
        //`define ASYNC_RESET
) u4 n* P0 u0 A6 B9 ]`else
% ~# p% r! ^, y9 n4 m  a8 E" P! G8 ?! `        // Modify this section to suit your implementation
0 Q. T8 m( d, X3 g0 L        `define UFC_HADR        12
4 g! ~; t. ~' g  \        // Address Decoding for Register File select0 a9 ?: ]0 @3 Y
        `define RF_SEL        (!wb_addr_i[12])
# v: a% K& O- u! d; c        // Address Decoding for Buffer Memory select# g% Q* {( i$ @0 j/ _9 f7 i0 t3 j
        `define MEM_SEL        (wb_addr_i[12])
' e) \/ |$ P, n+ g8 [  Q2 X        `define SSRAM_HADR        9
$ ^( e6 y! T* Z# W0 W3 o# B) X, `        // The next statement determines if reset is async or sync.- L0 X) P# e. f4 p
        // If the define is uncommented the reset will be ASYNC.
0 s* A( t- Q, ^" }        //`define ASYNC_RESET9 J. g: l( G+ P
`endif% E; i! I5 `! |& b8 s# _0 e
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
& k/ O5 \$ R9 X有相關的定義..看到最後真被搞糊塗了.. * l+ Y: h! W) Z

. B! o: D% u1 o# k另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到4 G* f$ Y9 y0 b1 \
照walltsou大所說的
* c  v4 D9 q+ a% M, D- Q5 W( V若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
% Q6 Y6 `6 x# t若 否 則執行 always@(posedge clk)+ y) W7 t3 @( X% k9 k  u# d
$ p4 f% U: H1 W% y8 c  ]: A
所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
0 z2 {% E' W) S+ B那這樣我又有個問題(不好意思問題好多 ^^")1 P4 C9 b- w- C' U' o
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
9 S) n$ W$ {* ?2 @$ v' e, }% h" B# A. j9 u0 Z% _
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:: p* T& \1 R! M
always @(posedge clk or negedge rst)' q* g; r6 y( v% G. c% I
if(!rst)        
% r, {+ C4 m, x" q    state <= POR;  Y9 x0 W9 `2 n' j
else             9 ~4 _' n. d% j: X
    if(vbus)   , s9 K' ?: T1 ~' g8 d
        state <= POR;
; n2 K3 ~2 x; {+ G5 ?    else          3 E% A3 `0 _$ u% z* [* h* p1 Q! b
        state <= next_state;8 r; s4 p. e* f. G0 X2 f4 \

% M( E: l8 y7 |( S% d+ R這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
) M! o9 Y5 V7 A6 @6 b% b  G, D
# s) B$ r! t' \7 oalways @(posedge clk)
$ d6 R* B- f! g) n. `* ~  Lif(!rst)        
' L' Z" ^8 F$ F    state <= POR;
  @5 ~* e" [/ I4 [" O7 c2 u" r3 Felse             # O: e# P5 G1 p  Z
    if(vbus)   
" ]# o2 `! B: A1 B  O! D& H        state <= POR;4 B4 L/ E3 W( x- x0 a" s5 @% F+ k
    else          * b6 M7 g+ H9 r" t5 M/ _4 l: S
        state <= next_state;$ D& d3 v! i. h% K0 m+ \! g
$ v  Y+ @& b/ x+ _; y! A
這就是一個明顯的同步RESET電路。
+ U  o$ c5 J2 t0 X8 k& t# p) w' D4 t9 S/ b+ U5 ~# I1 G
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。: @% U& R! {- ~. z/ P0 W% p- H
* b% F0 b9 W* n9 T$ X
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
% [% x: r6 ~" n2 F' t
7 `" J* X7 t' s/ S最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。: M% D3 @$ x6 R4 Q& b. n0 G. V
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....$ L2 o, t( V5 I' |, J
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...
0 G& t$ F1 L  ogreatsky 加油啦! 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語法使用上的時機及電路在合成方式
. E2 ^$ m% k6 J- |' g/ o4 V我會好好的研究同步與非同步的使用,謝謝
; {2 H5 m/ R& X9 z+ g# x8 Z% d$ _# l' S2 Q$ D% J% e; X
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz) I, `: F7 _, U2 H8 o' q
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky   H# t/ i4 Y; w: Y; r4 @- b* o
: l2 H* B. b3 P" x
5 z% E% H& B: i9 }1 i+ o* `
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
" F& q, F- h5 [$ E% Q+ [+ N5 Q3 O! a) i- Z1 J" U6 }
Thanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
9 J4 b/ n4 U$ w: F  _' K, Y5 TThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-13 02:42 PM , Processed in 0.139518 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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