Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位先進好~
  J6 K, D+ I; E& B8 F; h我是剛從學校進入這領域的新生,說不上是初學者; D3 A( V3 i2 @% `
因為若要設計一些簡單的project,這點我還堪用
  \4 X/ E& i% y. N另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等! t* M! R% @1 l8 v/ D( m. h

* T- V: Y( W8 r3 J' ~不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。
/ x0 \2 s6 r7 n8 R, A: T是關於 `ifdef ... `else .. `endif6 a/ w! M1 X% K8 X' x: I3 z, R

7 n& A, F0 {& {/ k+ g1 n7 @% ]下面舉某段code  請哪位有經驗的大大能幫我解釋一下
  H# b2 |+ X- x6 @/ U+ ?; |
5 A+ Z: g  u& ?0 k8 V3 F`ifdef ASYNC_RESET1 S) R- l3 A7 U& c( c( U
        always @(posedge clk or negedge rst)
- x) E& N, |& F' x( S* q`else2 B) K, s5 L/ q$ \
        always @(posedge clk)
' h) Y, S5 b7 S5 ~. y+ A8 p" Z. P`endif
, |$ J( b+ r( @* Q1 H' X        if(!rst)        state <= POR;
; t7 E! M; k5 X" d: C( H        else
# x; h( P: B5 y5 n5 U( d                    if(vbus)   state <= POR;
7 O2 a# S- |' O# E) i$ r        else          state <= next_state;
6 F1 T/ \5 g9 R8 r3 T* ^) K8 Z4 ^- T. E& f" a7 P1 s
請各為大大賜教了!4 [# P: K, \* m. D
  ]* Y1 J* `. ?$ Q4 {
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else
" H5 ~# b: K/ m1 `( p+ Y不過這條件判斷是以ASYNC_RESET為依據嗎?# N, g7 k, w' Q* O1 j0 l- ?% G: b
但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法0 S9 G4 T$ ^2 i- s6 v+ Z+ Q) v5 d

+ {" V/ c1 B5 _: ?) o# ?& I相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
* \( }  C, Z9 _; g' R9 [2 j5 Z9 d! f# |+ J
ASYNC_RESET
5 D8 B! {; a" T5 n0 r+ w0 w8 F可以用grep 來搜尋整個目錄: Z# v& O# R9 ?! V# A. l
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*+ p; a" {; i6 R& `' c
小弟都是這樣做的啦

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例
7 f2 I" p7 Q' J3 e' Q# m
/ l* b. A/ W  M! A4 Jncverilog -f list_file +define+ASYNC_RESET
; T, ?1 h9 [  K8 {6 q. A9 F3 M
( y: f) N4 G) B; l  {那會定義在跟 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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。  {9 a9 D6 J# I" T% ^6 A* A
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
  b, Q) U0 l/ q# H) d( d6 Q* J1 N7 ^
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

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

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆
5 u7 M  x6 [4 h/ ]. I( o( P我在看過回文後有找到定義檔  difines.v的檔案
& a: Y- K! B* H/ m找的結果是 被mask掉的一行定義??
7 \  \& X$ W  M  |( j2 g4 \; A" j0 q+ {$ R4 J+ d+ [
這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
+ _/ W$ y' G$ s; l8 j6 J* ?但是這個`ifdef `else `end卻又一直的出現
: Y: v" c3 I+ O) i5 ?* B以下是我在define找到的描述及定義程式片斷
# Y0 O6 q3 Y' d% S0 M7 I9 w`ifdef TEST_IMPL: `! @# P# l% Y. t1 w
        // Do not modify this section
2 U, m9 ]: u7 F: Y+ I: @        // this is to run the test bench0 K" `0 q! i3 ]) V7 J
        `define UFC_HADR        17
# V. W: n: F! I) k" ~# [* B        `define RF_SEL        (!wb_addr_i[17])
6 j/ Q; X' O8 f; J# }; _6 i        `define MEM_SEL (wb_addr_i[17]), w- o7 Z$ k/ H6 \' \+ N
        `define SSRAM_HADR 14
1 l* j5 f; F1 u- a        //`define ASYNC_RESET9 _5 g( E% L1 i' g" ~+ c: S
`else% _8 p, O4 n- F: c/ u
        // Modify this section to suit your implementation
0 j! ^  e1 f. ]1 g3 ~. y        `define UFC_HADR        12
9 d4 u3 l: z8 N        // Address Decoding for Register File select5 b/ ], [) m# r/ @9 i
        `define RF_SEL        (!wb_addr_i[12])$ k- _0 ?6 g2 P/ U+ ^/ k' p
        // Address Decoding for Buffer Memory select
: \$ w6 t8 ^1 y8 J  ~8 a        `define MEM_SEL        (wb_addr_i[12])
. N4 u- \8 L$ i        `define SSRAM_HADR        9
9 ]; \" ]* ]6 b7 _1 d) m- C# ^% R        // The next statement determines if reset is async or sync.
3 e7 y' ^0 V# e        // If the define is uncommented the reset will be ASYNC.9 c: V5 i9 @1 V) Y9 q1 |" z
        //`define ASYNC_RESET" @% y, G" P( H" a6 t7 v
`endif2 J. p5 x* ~0 F" o2 M/ O0 G
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
' H$ B1 i1 p6 R6 y0 w4 L有相關的定義..看到最後真被搞糊塗了..
0 T; y8 l9 K- x  ]; r* H/ A! X4 E7 h* u2 Y' R3 g; s' Z1 I% X1 s3 R
另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到
9 g1 a/ x$ ~/ y) r( _7 e照walltsou大所說的
* W) _" e# q# b( N9 |若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
8 Z: V" ]; U, A7 a8 F若 否 則執行 always@(posedge clk)% H0 U7 |! I  y, {( y7 ^

) W8 ^3 _0 o; P0 `所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
# y: [  s: s, H那這樣我又有個問題(不好意思問題好多 ^^")# ]! K$ P9 K+ f3 R1 m: x# y
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣4 {  b6 C1 F& q, f- x5 O  p

( ?4 d1 U9 D$ P; ]若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
6 }9 \! X1 w7 b& A1 balways @(posedge clk or negedge rst), x: q; X. D2 ~& Z3 H1 t) l
if(!rst)        6 e  K) y" f9 b& u! O
    state <= POR;: ?8 U4 O; ~% [9 g- |
else            
( Q5 X; c6 E5 f    if(vbus)   , W6 G! o& X& m* _6 C, ?  s' o
        state <= POR;
5 k5 x' V$ f1 H5 {" N    else          , E" I) h( A7 d& h3 q4 M
        state <= next_state;3 @( x4 T  C# ^! P
% X5 Z' N! F% b- D- Y3 i
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:4 {4 F. G8 }! B) R9 J

; n: b0 B8 |! Xalways @(posedge clk)
* Y+ z: M$ i$ w- z$ Zif(!rst)        
0 F# j. I* h$ T, B! r0 H# D6 R    state <= POR;5 A9 W3 y) L5 C6 y# e! [
else            
) @! \6 s- ]- k3 V    if(vbus)   
( j7 K$ k+ s% l( ~2 f2 u/ e9 o& s        state <= POR;
4 g' A3 N' O8 N5 i9 W+ \    else         
) b- F: V' ]  `9 a        state <= next_state;: A9 D9 K- t5 b4 s  ?. `
" b. ~# q0 k' T* P+ o" [' |
這就是一個明顯的同步RESET電路。
0 j4 p8 O. B- o; a8 ~5 C/ K% y7 D* W5 |* R7 G2 J4 ?# u3 z
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。/ Y1 R- i# E, ~6 J9 w) A9 T6 j

) H1 D% Z9 c  y: _* ?; l* S  q  s你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。3 Z9 @9 v0 U, `& C: x7 @% |/ u# j
1 E  O* m, i; @: Y9 v9 T
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
6 ]0 l+ k7 Y" g# }http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉...., d4 n$ k& @+ n9 _% z6 T/ Y
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...
9 k6 m0 b( [3 m7 S5 v) Rgreatsky 加油啦! 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語法使用上的時機及電路在合成方式9 V8 i0 l2 u' T
我會好好的研究同步與非同步的使用,謝謝$ {5 |9 ?# n/ N4 v3 l3 p$ n

8 K$ j5 ^* J7 w: h, u& E/ h6 z另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz+ a: X( r' a3 F5 T; V9 j8 X$ Q- Q
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky + C: C$ ?) r) j. }. _, n5 M
7 Y4 R& |& \) H9 M

& D  ^8 c4 N( A5 i" B5 E# k    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
" V7 k8 o' b6 ~- i9 e: G# c
5 j, ~# Y" T3 k( k+ F% OThanks a lot!~!
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~2 a& ^  W4 Q# A) u; {: y  A
Thanks a lot
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-9 01:06 PM , Processed in 0.171601 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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