Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~
' W, b5 c+ l6 v7 x( z& f9 {我是剛從學校進入這領域的新生,說不上是初學者
1 [! F9 G( @7 h( q# k; `, V因為若要設計一些簡單的project,這點我還堪用
% @( @6 G6 H/ m: _5 x) Z- O另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
4 K8 {+ {0 t, M) R' I7 D9 W
3 l* H' D1 j8 a# u& n9 F不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。% d( i- x, [& a7 V( Q8 w1 j
是關於 `ifdef ... `else .. `endif
1 ]4 G- X$ l3 S  g5 R3 }. r
% q' r# N' W; W下面舉某段code  請哪位有經驗的大大能幫我解釋一下
. L, D- F: D- H; J
9 A$ g) R% u1 C, H/ {`ifdef ASYNC_RESET! A5 q$ J3 U' K
        always @(posedge clk or negedge rst)+ G( c8 [2 Z( F# J3 f, C
`else4 S! o* n- y" z/ \- Y4 A; ?1 X
        always @(posedge clk)3 L; {4 ~7 B9 H3 S
`endif
0 c1 j6 _. ^1 ~- O2 }4 a        if(!rst)        state <= POR;
& Z8 H1 [8 X$ S2 a6 N" X        else
! o2 w8 j+ z/ Q. {  f4 p                    if(vbus)   state <= POR;
# f  w0 `  s$ ?        else          state <= next_state;* t% t8 t6 B  {' e( T

, C0 u/ u& B: U+ i. L# [: N: I請各為大大賜教了!
- M. q2 H- v: y7 O: ]; L' ~& s/ b6 t# V
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else
, s1 [4 a9 \' ?/ O6 D$ f  v6 ^不過這條件判斷是以ASYNC_RESET為依據嗎?
2 \1 O* Q7 h5 p1 x但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
4 z9 v9 u& G+ K1 }; L" B
8 N0 G7 U& i" x. Z相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
2 C2 Q( |- G  e# h$ B& i
  ?/ h& x9 i4 p! d+ C2 F8 ^ASYNC_RESET
! ?- r3 Z% M5 w* T' I0 d. A可以用grep 來搜尋整個目錄- M9 {0 j' w- V0 D" a2 t
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
7 Y' c4 D; |+ C& a+ m2 _小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例
! B6 q8 K, A/ f; X6 \# r- H5 V8 H3 m* W# C5 t+ |% M" y
ncverilog -f list_file +define+ASYNC_RESET
1 m8 Z7 N3 d) ?$ }* k1 ?) U7 `' A, Q5 Z9 P) 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。! ?/ M3 _3 R) @) F7 I
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
9 f) [8 |6 h1 R  q* y: S! y. z
! Z  @& o5 t: [6 D0 Q% n[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆* M3 v( q: W9 O. y0 f4 l& ?7 s
我在看過回文後有找到定義檔  difines.v的檔案
  `/ b4 w8 R8 h; Q* r$ z找的結果是 被mask掉的一行定義??
. m# w* s) i6 U! b! g7 o4 ^3 Y
0 x- o0 {. _& u這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義, n5 B8 I' n# B1 v
但是這個`ifdef `else `end卻又一直的出現" g$ {9 k; }0 o, C6 ]
以下是我在define找到的描述及定義程式片斷  u0 U& Y" h( H% p; H# G4 g! Y# L
`ifdef TEST_IMPL) {( T+ V& _9 R
        // Do not modify this section% \- N5 D  n' Y; g/ ?  |& Y9 P
        // this is to run the test bench3 w3 Y3 H% r0 k. c
        `define UFC_HADR        17
3 ~7 r) M- x* q1 k. l) g% l3 n4 o        `define RF_SEL        (!wb_addr_i[17])" y" D# `- q" A! j5 _
        `define MEM_SEL (wb_addr_i[17])
. f$ u+ N, @5 y9 i4 d& t1 r        `define SSRAM_HADR 146 U9 q3 Z6 j$ y: F$ s/ k
        //`define ASYNC_RESET
1 {6 y% d" }2 K! j' X`else
+ n4 z: r7 x/ m% o  t        // Modify this section to suit your implementation
( C) K7 P' k* P" C- ^! ~+ z        `define UFC_HADR        12
2 o) b/ C  o7 r& N$ K! e( G        // Address Decoding for Register File select
4 |% {2 s) f) ?4 x1 V        `define RF_SEL        (!wb_addr_i[12])
1 J2 Y$ c5 R2 ?- x% A        // Address Decoding for Buffer Memory select5 b- m6 O- ~% K  ]
        `define MEM_SEL        (wb_addr_i[12])$ i6 T; z) H! U. ~4 u9 L
        `define SSRAM_HADR        9
* ]/ x' c; @% E7 Q5 l& L! ]2 k        // The next statement determines if reset is async or sync.& p6 M+ ~. E- o' v
        // If the define is uncommented the reset will be ASYNC.
5 q! _+ S6 G) i6 _8 J/ r$ _9 q* W        //`define ASYNC_RESET' q4 V$ k: C5 t2 z* M
`endif3 V" M$ B- ~( r
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
" ]$ U' c. s6 R( z8 }6 }有相關的定義..看到最後真被搞糊塗了.. ) R: Y( p4 o" z5 [6 Z

( d# B0 R; h% {, ~& o5 D另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到: G! ]4 z) C3 R4 e6 M: D) O% P
照walltsou大所說的
8 V$ b: r, R; n6 D9 q若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)% W5 p4 J; d5 E: |4 G) z, z
若 否 則執行 always@(posedge clk)
. W/ I7 c0 `1 T' c3 W% d( ]% U: ~+ c' k& `
所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
' c/ U6 s3 Q- g9 [: Q* J5 S6 w: ]那這樣我又有個問題(不好意思問題好多 ^^")3 F& U5 d4 b  O% [0 G; o
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣- J$ k* `" t$ B7 Q! S" j
+ z8 r" T$ c" D( k% S& L% m8 d
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
( G+ x6 _% D: ]2 o0 `+ p/ @+ ialways @(posedge clk or negedge rst)# \. H+ [7 c6 e2 ]6 p( d1 O* W
if(!rst)        
  H5 s) L3 Q2 w' f    state <= POR;
1 [3 [) ]! }) u2 h) xelse            
1 K: o, P0 ^0 Q* X* P    if(vbus)   # U4 s9 Q  d5 Z- k  @
        state <= POR;
7 {' I" ~1 _$ Y    else         
# O* @, ]# |9 s' c        state <= next_state;
8 H* B4 C/ ^9 D. a+ L) y$ h0 V6 p- E* ^0 W# [6 Q. O
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
! W+ O) I# F3 C( V
& L2 S; C$ A( Z/ n1 z/ aalways @(posedge clk); K( I% Z+ p2 z: J; C# w3 I
if(!rst)        
& ^0 s: J, k. g/ j1 E- H6 g    state <= POR;
4 k* ]: D1 I; v2 K6 M, Nelse            
, w  d9 T) i5 p    if(vbus)   
. j+ w( \5 X; u) |* w) J, e        state <= POR;. d: v; R1 }2 y1 i# `# r
    else          $ h8 k& M, W( X! x" K9 X# _& q2 |
        state <= next_state;
' ?7 H- O6 H( s3 d( ?( z; Z3 J7 s- J1 u
這就是一個明顯的同步RESET電路。
5 E5 o& g8 j9 X4 P" [  ?- c! n
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。" V6 u0 ~, C0 N) i  L! d9 ~2 ?

: I, f1 _5 K0 U7 M# Q) |, S你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
) d* y$ k. X" K7 ~: S) {7 C% S+ P: u8 j( q) Y' t5 s
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。5 s" H, C- e3 r4 {+ X7 n( D4 e
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....# ^3 n0 s+ M/ W* _6 A
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...4 F% r1 h9 e2 S- d. N
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語法使用上的時機及電路在合成方式; F2 j! g1 F, ~9 L3 z6 m+ a4 ]
我會好好的研究同步與非同步的使用,謝謝$ F  F9 _: n7 `# k3 q

6 ?$ h8 L7 ?9 N! y3 l4 k% ~6 p另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz
, I: Z' z: I: k6 W也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky 6 k8 V; h! k- E  v1 _9 ]) I) D8 D

/ z5 x: \5 Z' \5 q" O; P
" ]& p0 h2 g4 C/ V2 V    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho : F6 n& i9 C- [
5 R+ m) K# C4 l$ w: X+ Z( p
Thanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
$ g6 C* z% d, n/ e" x  XThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-4 04:55 AM , Processed in 0.152519 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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