Chip123 科技應用創新平台
標題:
關於Verilog語法一問?
[打印本頁]
作者:
greatsky
時間:
2007-1-11 07:14 PM
標題:
關於Verilog語法一問?
各位先進好~
9 n+ j8 v8 V# s6 E5 a& p
我是剛從學校進入這領域的新生,說不上是初學者
' ]- ]' a8 J- p1 h1 b- w/ I, [. C
因為若要設計一些簡單的project,這點我還堪用
$ v& b; o) i- E" F
另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等
, R& ?7 R, l( ]% r
! `2 ^; f* c# l+ v
不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。
: k1 b& \$ T1 c& v+ b
是關於 `ifdef ... `else .. `endif
. p5 c) y- _3 X
. H/ |5 e% F; i0 ^' x2 v' g7 p* i
下面舉某段code 請哪位有經驗的大大能幫我解釋一下
" ^9 D) r/ P. D- B+ H
% |% g" b, n, N% `+ h! Q5 Z
`ifdef ASYNC_RESET
2 u& e9 N6 b7 w
always @(posedge clk or negedge rst)
2 e( R% k. \# h% \) U5 i& n
`else
) z# @6 T$ Y1 k: j3 }
always @(posedge clk)
0 h5 z) D7 \* x& a+ G$ z8 q
`endif
1 {; w4 X) x! c8 @/ w6 o4 Y$ h
if(!rst) state <= POR;
8 L+ e# n/ b/ c7 f8 D* s
else
7 |) |9 Y7 z) d/ ]! u
if(vbus) state <= POR;
( T6 ]2 Q. L0 B0 o
else state <= next_state;
6 {8 O. K0 h, z0 B5 ~* b
0 V P: {; h4 h1 k% x7 h) l
請各為大大賜教了!
2 Z' }5 d I8 n' e) x0 q" |# t4 V
b% j, j2 B1 w; ^% L
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else
; n' E4 J1 | @' F( D! L
不過這條件判斷是以ASYNC_RESET為依據嗎?
; j! B* P2 O# R' q0 z
但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
作者:
masonchung
時間:
2007-1-11 07:29 PM
這個`ifdef `else `endif 是用在整合不同外在條件的寫法
( N: J) Z( a* v- x
s& J- B+ _2 |7 ~! f
相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內
作者:
sakho
時間:
2007-1-17 12:19 AM
`ifdef `else `endif的用法其實就如masonchung大講的一樣
2 g6 h6 [8 R, m
- i. R. H2 b; h5 B3 n; y# q
ASYNC_RESET
3 J* d$ f+ Z. d" [& {5 O R
可以用grep 來搜尋整個目錄
% M+ J) q8 W' r1 h6 D
Ex: grep ASYNC_RESET *.v 或grep ASYNC_RESET *.*
5 g; Q7 [4 P7 T0 t5 ?2 R
小弟都是這樣做的啦
作者:
hgby2209
時間:
2007-1-17 10:03 AM
以 ncverilog 為例
* v- y8 O. A* q
9 x% y* p ~" `( p' B5 h9 \/ W
ncverilog -f list_file +define+ASYNC_RESET
& Z; i! g/ Q5 ?* w- d
" h7 b8 `2 L" I) L
那會定義在跟 Test Bench 相關的檔案裡, 可以如同 sakho 所述般去做 search ...
作者:
walltsou
時間:
2007-1-19 09:23 AM
我是從軟體轉來的。所以對`ifdef `else `endif的解釋稍有不同。它們比較像C語言的#define,也就是巨集。當程式在轉成RTL時,會經過前處理去掉不必要的註解,在此階段會先作文章處理。而`ifdef `else `endif則在此階段作用做文章取代的動作。以此例來說若之前的文章有定義ASYNC_RESET則轉譯時只會出現always @(posedge clk or negedge rst),另一行則被放棄。經過文章處理後的程式碼再進入RTL轉譯。若是沒有定義則以另一行取代,再進行轉譯,此時不使用negedge rst信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。
. z3 e/ {& l- I2 x r7 D
所以`ifdef `else `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
+ d* x1 O! f N. [
: D2 F. t: T# e$ k N* E
[
本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯
]
作者:
greatsky
時間:
2007-1-22 03:30 PM
標題:
回復 #3 sakho 的帖子
首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆
( u6 t( K1 d& R. \' K
我在看過回文後有找到定義檔 difines.v的檔案
& o8 t3 h9 S6 P% F, K- z; }& h
找的結果是 被mask掉的一行定義??
6 g% J, W6 b* m9 _% a$ Z
( z$ t- T. Z6 n' b3 Z
這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
/ C% J, x0 f4 l' M* W ]& b
但是這個`ifdef `else `end卻又一直的出現
" ~. q1 U9 w: l
以下是我在define找到的描述及定義程式片斷
$ L# k# b2 M% o5 a
`ifdef TEST_IMPL
$ z% J6 y5 g8 X) f! u" w
// Do not modify this section
1 N/ {4 A8 P- Z4 C, z
// this is to run the test bench
9 R% z1 D9 ?' @6 k$ a
`define UFC_HADR 17
. j% S" F; v4 l ]4 S, h
`define RF_SEL (!wb_addr_i[17])
) K6 u$ T1 K$ D" f' N8 z0 Q q' U
`define MEM_SEL (wb_addr_i[17])
- ]% w! I1 ?. n
`define SSRAM_HADR 14
# n* [) G1 W. D; a# W# G
//`define ASYNC_RESET
5 ?$ T0 i. R" s* l1 D6 F1 P( F- k
`else
: {: E% @" P* T, G' t0 f, J* G" b
// Modify this section to suit your implementation
4 J* _9 q5 }* U) Q
`define UFC_HADR 12
! u2 j! p/ y- a7 |8 Z& M; Y
// Address Decoding for Register File select
0 s: ^! u/ `, m2 |
`define RF_SEL (!wb_addr_i[12])
2 i3 s( ?+ p& a8 }& [$ T
// Address Decoding for Buffer Memory select
9 l/ |' L% a$ x! p& |& v5 P# o- }
`define MEM_SEL (wb_addr_i[12])
" a: l' y* d6 g c
`define SSRAM_HADR 9
# u9 q! t$ Y0 Q- M- ?3 F1 Y/ P! j) F
// The next statement determines if reset is async or sync.
$ U$ g1 i: j) x- Z5 M
// If the define is uncommented the reset will be ASYNC.
- Q& G+ N6 _. p0 n j. w0 _3 Q% a
//`define ASYNC_RESET
1 i+ }6 {$ _- |/ |
`endif
. V7 m* U, Y% M8 f/ \9 P
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
6 V: g4 S8 I+ l) y( ^
有相關的定義..看到最後真被搞糊塗了..
H/ p# x% h( a( `( N3 }1 `
+ e3 l$ P& A" \$ j
另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
作者:
greatsky
時間:
2007-1-22 03:40 PM
在回文後再看過walltsou大的回文思考時,突然想到
1 E& d- u; Z5 f- d- c
照walltsou大所說的
% K7 j- @' ^3 M& [ K
若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
& y& U2 U& B8 |% t8 m+ Y2 n+ ~3 |
若 否 則執行 always@(posedge clk)
: |8 l4 ~6 q4 h R3 y, j
7 ]; H( e$ Z$ F, ]! x+ ]
所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??
% ]$ Y# ` A; E" |: _& x8 s
那這樣我又有個問題(不好意思問題好多 ^^")
2 V) @/ n0 h' o% U, F* p
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
作者:
garywlee
時間:
2007-1-22 09:17 PM
標題:
回復 #7 greatsky 的帖子
你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
3 A" D! `( T" z* F8 y' {
$ p6 O) `" x* j) V1 q9 L
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
6 Z5 @# s% I: p1 |$ }( g9 h
always @(posedge clk or negedge rst)
7 {" O9 I4 t8 ~' A3 i8 Q) D
if(!rst)
9 T$ W0 m1 n0 K
state <= POR;
& ^ S/ t; ~1 n4 b4 }/ D) a
else
: V% y% u6 c1 y! [ w: g! ^
if(vbus)
% C7 W* q8 M1 i
state <= POR;
$ C' k$ x% e% y
else
" |2 k X0 n1 C* B3 J
state <= next_state;
+ l: l7 o. R' e( l" e5 r& k
2 [; |; M; x( ]0 S1 }; ]
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
# y% N' ?/ G F! n
/ k7 k7 I7 l0 \0 p% w9 L( f$ ~
always @(posedge clk)
2 F& D3 m+ Z+ Z1 X
if(!rst)
: B) ?4 p: y0 h5 V' y8 z
state <= POR;
/ \) p2 R5 K" m" v6 _
else
: K1 x/ \5 p5 s1 l$ G8 I1 f( _* o1 C
if(vbus)
1 w" w7 c& O4 O& }
state <= POR;
5 M M1 H; c2 T2 g& c# {0 V
else
% E$ G" b9 s+ r+ h' N3 m* _
state <= next_state;
@) l3 p9 p' @% [% Q
3 F" y" D$ e6 ]4 r
這就是一個明顯的同步RESET電路。
# B- h! ?" U$ L, C ~1 y
; |( q* M) U1 e2 l
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。
! _6 l8 y6 N) q. e# y
; i. k. t0 C r) }2 h1 z
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
$ X; S' `: ~3 \: v$ K3 J# j0 f
! J: @# @; j( H6 c+ N
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
$ b: _9 v# w2 W6 L3 r
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf
作者:
tommywgt
時間:
2007-1-22 09:29 PM
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....
8 K+ L. i3 v( w( u* f2 q
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...
& a5 [( B& f% H4 ?: x
greatsky 加油啦! code多寫, simulation多run,就會愈來愈清楚了...
作者:
tommywgt
時間:
2007-1-22 09:33 PM
對了...大家都知道modelsim很好用, 再提供你另一個你也許已經知道的東東, 那就是現在的fpga都內建LA了, altera的LA跟Xilinx的chipscope都好用, 你把compile完的結果download 下去FPGA可以用JTAG直接看結果哦, 用過的人都會不想再用真正的LA了...
作者:
greatsky
時間:
2007-1-22 11:41 PM
感謝 garywlee大 詳盡的解說,看過解說後我能夠有所瞭解`ifdef `else `end語法使用上的時機及電路在合成方式
4 h% a i+ F0 ?! J* S
我會好好的研究同步與非同步的使用,謝謝
; _: H7 _% j. w: U5 X$ M
% @% X7 `7 J7 Q3 F* S p; N7 Q
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz
. r* b ^3 |! m7 C. d- }
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
作者:
tommywgt
時間:
2007-1-23 11:41 AM
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
作者:
albert.hllin
時間:
2011-5-19 03:19 PM
回復
6#
greatsky
. P, S0 F2 S# e# Z0 e( ]
1 [) o2 I1 A5 I2 g; V8 C- F
2 V6 [4 g5 q! ?
ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
作者:
alfred99
時間:
2011-9-14 10:05 AM
回復
3#
sakho
, K* I2 L( ~" p# h" E# y
* @: d' p3 `2 x3 x
Thanks a lot!~!
作者:
alfred99
時間:
2011-9-14 10:06 AM
~~~~~~~~~~~~~~~~~~
3 ? C6 u/ M2 u i0 ?
Thanks a lot
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2