Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~
: d0 h: c9 f! w2 l) w6 [我是剛從學校進入這領域的新生,說不上是初學者
- h- _. ?7 P9 e( `) V7 P因為若要設計一些簡單的project,這點我還堪用
. O* s! a# F4 i7 x; O另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
# E' ]5 [; `, ^+ u" {4 J" E/ y! Q* V* `! o5 j4 n7 F, c% R
不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。7 k* }7 a! j6 j
是關於 `ifdef ... `else .. `endif" p4 o  ^( M2 Y4 C

7 c% C4 a& D7 Y( P9 X' G- C$ ]下面舉某段code  請哪位有經驗的大大能幫我解釋一下: y  s) k' W3 q
4 U9 z, e9 r) P
`ifdef ASYNC_RESET
$ U7 x/ S: L* G$ `; _# r# z* A        always @(posedge clk or negedge rst)
: D, p( D! h$ }  c$ ?`else$ F" Z, F9 H1 v% a  X2 P* ?
        always @(posedge clk)
. M1 `. ]. c4 k' O3 R" E+ w`endif
3 }; M/ Z% i( Q+ o        if(!rst)        state <= POR;
  i- Y' J* U) D* l1 {        else, l, r0 W- U! r* C
                    if(vbus)   state <= POR;. Y4 g, j* {! i$ Y
        else          state <= next_state;
+ b( {. I6 q" @& h2 E* r
: ?# T! s! s9 j* _( S, X5 A請各為大大賜教了!1 t8 I4 `2 Y  n2 j( v

2 Q: O# ~2 r7 M& D- S) H( ^+ P1 B5 h: F我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else. C* Y* A+ {/ D+ |) k* B& M
不過這條件判斷是以ASYNC_RESET為依據嗎?4 P1 L4 k7 i1 M
但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
# R0 m$ Y: \4 d/ H& m; i5 W3 G1 t( a* V3 z0 Y
相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
* j0 w7 m# z& e$ \$ B
5 _; _. w" d) f2 ]ASYNC_RESET2 g) ]. ~9 `5 b% y
可以用grep 來搜尋整個目錄4 }( K, K) ?. A; T
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*/ y) n% f0 S% @
小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例* m+ ?  O. l6 K+ J, y3 Z
1 o; |/ ~2 S  U' h
ncverilog -f list_file +define+ASYNC_RESET) r9 M1 ^) }* F- ^8 d
. i5 O$ U' m) b, d! |. 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。) {; N/ z8 D5 l3 A# s
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。1 Z7 a" p* E0 I+ _
8 c8 ]: n0 \4 i# R$ W+ l$ l
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆  ?9 Y( O- K0 O# A+ N, T5 t
我在看過回文後有找到定義檔  difines.v的檔案 0 F& P' I5 V# e( c: e( @$ R* n
找的結果是 被mask掉的一行定義??6 U# ?1 F. ]+ Z/ a+ ?5 i

, x" b0 N5 O) E這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義. h* N* A( W% ]! L! d6 l; P
但是這個`ifdef `else `end卻又一直的出現* D6 p! l' F2 W
以下是我在define找到的描述及定義程式片斷; O0 x' u5 p- Q. b; a
`ifdef TEST_IMPL" i& [& v" ]% q! ^, _- n
        // Do not modify this section7 Y6 C2 k1 |8 s4 c9 f
        // this is to run the test bench
# Z* R7 c7 `! r* n% c2 f; u8 G        `define UFC_HADR        17
' T: g- a1 }1 A5 k! x        `define RF_SEL        (!wb_addr_i[17])6 {! F8 ]" y8 L8 S, W) k
        `define MEM_SEL (wb_addr_i[17])
* X& q; q: n8 j5 P- E; y9 k- M        `define SSRAM_HADR 14' u- z' b( K! h7 y
        //`define ASYNC_RESET+ i& c- ?5 F# u+ M
`else
) u5 }5 B' D% v' ~        // Modify this section to suit your implementation/ l  y! O( B/ E
        `define UFC_HADR        12
% Q$ {& J' g1 h- z7 I( I4 E        // Address Decoding for Register File select
& A3 B. m# x1 i8 R4 P        `define RF_SEL        (!wb_addr_i[12])
0 i* D7 c/ s( Y7 [) X( o/ F3 N3 l        // Address Decoding for Buffer Memory select
5 O$ h& F( O) |        `define MEM_SEL        (wb_addr_i[12])
! `$ V/ Q  G" G) {' R4 |, v        `define SSRAM_HADR        98 W$ y5 @% ^3 o1 }
        // The next statement determines if reset is async or sync.7 j, ?, g! j# x- B# i
        // If the define is uncommented the reset will be ASYNC.! U5 w7 ]8 J4 K/ k1 _( @4 }
        //`define ASYNC_RESET
2 u7 d" O6 u7 r3 t`endif* c8 X) Q9 {0 U+ m" K, ^& {
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET6 h) B# h7 {) i" M" |) C
有相關的定義..看到最後真被搞糊塗了.. 3 ~% X  |. d, T
. u. `  W) Z7 ~& q8 O
另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到5 `. H8 C5 o! B8 Y' i' V: ?( d
照walltsou大所說的
- h& L$ w  x& R4 m9 u9 H若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
: v5 t- f9 H$ h3 h( \% L若 否 則執行 always@(posedge clk)
) D  N: T* P  R+ o) Q, Q: G
$ l# ]" Y2 k3 L$ y. r1 d所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
. `# h* P  f, H那這樣我又有個問題(不好意思問題好多 ^^")' @& K. ~, Z! E! H7 n
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
8 P3 q# o/ L$ O7 w% l  {
) @) S2 t+ t5 |0 o% x; c6 U若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
3 a' c* O0 D9 l) Z+ z  |always @(posedge clk or negedge rst)% d. i0 d$ Q) q' S" E1 W
if(!rst)        
$ f$ `5 T4 `0 H8 m% o5 {! _1 t    state <= POR;; s" H$ Q9 k  Z- x
else            
7 |" Q$ w2 A; a    if(vbus)   ( m; y6 m6 O1 L, |+ N: L
        state <= POR;/ l: l$ s8 r) t. T4 W+ x
    else          " Z& b% L% N: l0 T7 o! L+ e
        state <= next_state;4 n# h. G8 Y  j0 O
* L% _/ x) w7 W% o% X- ~; O
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
' [9 P3 j  Y2 W: p; c* h# V! Y4 }! e$ M$ I- y
always @(posedge clk)  ^1 `0 r9 L  U0 M  {/ ?
if(!rst)        
+ E' }% j* M8 E3 B7 x! R! c    state <= POR;
$ m$ q( t" U" velse            
" j, g: h# L% O: c    if(vbus)   
/ u1 |$ F: U. L1 J1 o, e; d% R        state <= POR;* A$ O2 S2 d7 [' S& n
    else          0 E3 h: Q& b$ m/ F& B
        state <= next_state;5 _/ ?) o; H5 a. Q
9 s7 t1 o8 c: c
這就是一個明顯的同步RESET電路。7 x; j- k4 \! e% q* W. u* ?% _3 x

( N$ h$ }, P. v6 {! e透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。* B  Z4 O2 C3 o+ D; n- O

* \( `$ n5 Q, S$ Q, s你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。2 v5 R1 Q  K: Q* j5 w) @; V" q
% v% t9 v' b* ], S
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。8 ]* ~8 h$ n* ^+ `0 n, n
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....% k$ b4 R& ~/ _4 c( w
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...0 d9 Q# s/ F3 ~, r/ L
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語法使用上的時機及電路在合成方式* t' b$ `. P9 N; y- I1 X
我會好好的研究同步與非同步的使用,謝謝, d" g9 r5 h& L6 \% P( ^; P8 B& J

+ J) _5 |1 t8 V另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz8 T9 P8 z% K/ z' ?- p% l6 Q
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky
9 d5 m6 K- e) c( {) C
2 P. q  l: f* I3 k1 u' w7 G
# O  q8 f8 u) M7 F" b    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho   o2 R5 i( \0 J9 Z  ~+ w, ~

# H& @; M- {, D( ?( j2 rThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
) U+ W* _& ^& s" @" U) OThanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-27 01:45 AM , Processed in 0.191011 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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