Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
各位先進好~
3 q- K* ?- C4 Z2 f; \% [我是剛從學校進入這領域的新生,說不上是初學者
8 z5 t4 A0 R# ?. k( j* G$ s  D* Y% ~因為若要設計一些簡單的project,這點我還堪用
# u- |9 a7 l1 w  Z2 Q7 d另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等' @9 I/ y0 x0 l& A& t6 w

. u  F  W! l* k/ k$ I2 l6 }9 _不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。# u. `& n$ g$ K+ y$ n
是關於 `ifdef ... `else .. `endif
- Z4 [% u2 O; S6 m& V' P& L6 A( p( B( N7 ~$ [6 ]8 Z0 h
下面舉某段code  請哪位有經驗的大大能幫我解釋一下( ?; c- N$ q2 W; t( V, O
+ i2 i- A* D) b  K: r9 ?% ?9 N; G
`ifdef ASYNC_RESET; G( O) T5 ]; s( B
        always @(posedge clk or negedge rst)+ Y9 |8 n4 _, L
`else
4 a9 X) U6 n8 n: h: a; v2 c  d        always @(posedge clk)
" |- }- \2 q7 j7 ^: K3 {" O$ T% d`endif+ v, G! K( X$ H$ j% U# h% V) N
        if(!rst)        state <= POR;
, d3 V  u' l$ c: A0 @# |3 E. P, H        else& f) Z. {$ d' t$ f2 Y
                    if(vbus)   state <= POR;
! S. L. N6 i7 b        else          state <= next_state;0 W$ {% o( A' g+ ^/ K7 u
3 N% ?% o7 B! B& P9 U
請各為大大賜教了!
* y4 H2 u8 s+ k# Y( g2 I& q$ s+ g1 r% Y+ b- A
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else- M6 a- m9 T7 [7 k1 {' L5 `
不過這條件判斷是以ASYNC_RESET為依據嗎?
  v3 Y( J  n3 h& X但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~, T# C6 A- |7 ]# _8 ~: D* X; r
Thanks a lot
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
! J/ M3 W4 ]: i! \
0 Z* G8 n4 |/ O* t" vThanks a lot!~!
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky 2 V1 s9 d  d" `

) Q9 s' E6 H% X7 v' j1 h% ~7 e7 ?/ |1 C$ ^
    ASYNC_RESET 是 synopsys synthesizer 的識別字, 可以決定用 那種 d-FF 去合成線路!!!
12#
發表於 2007-1-23 11:41:53 | 只看該作者
OK...沒問題, 那個altera的很簡單, xilinx的我最近也會找時間弄看看...
11#
 樓主| 發表於 2007-1-22 23:41:25 | 只看該作者
感謝 garywlee大  詳盡的解說,看過解說後我能夠有所瞭解`ifdef `else `end語法使用上的時機及電路在合成方式
  z" i  L% e  |* T* v我會好好的研究同步與非同步的使用,謝謝6 Z. ^$ I+ X: a7 d5 {7 I

/ q8 S3 |3 o" i  H3 N另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz: m) S! g' w2 y% a/ @
也謝謝tommywgt的回覆,我再自行問您 FPGA內建LA的使用方式
10#
發表於 2007-1-22 21:33:55 | 只看該作者
對了...大家都知道modelsim很好用, 再提供你另一個你也許已經知道的東東, 那就是現在的fpga都內建LA了, altera的LA跟Xilinx的chipscope都好用, 你把compile完的結果download 下去FPGA可以用JTAG直接看結果哦, 用過的人都會不想再用真正的LA了...
9#
發表於 2007-1-22 21:29:18 | 只看該作者
給garywlee 按個好, 不過題目不是我發的找greatsky找感謝囉....
. r6 r# H9 ]$ m. {7 k8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...+ o1 N0 y0 w4 A+ Y5 |  I5 I0 S
greatsky 加油啦! code多寫, simulation多run,就會愈來愈清楚了...

評分

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

查看全部評分

8#
發表於 2007-1-22 21:17:21 | 只看該作者

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣1 z) {! N% H  g- ]& H
7 U% V+ R  ^* c* X+ i# J$ v
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:
4 f7 L' h$ f) y4 ralways @(posedge clk or negedge rst)
+ n. i. w! B7 W: u1 Yif(!rst)        
' _& k) N5 P6 C5 t0 o3 R    state <= POR;
  ~3 b9 c9 y4 O2 }9 k& w. |+ `else            
# u1 f* B7 A+ Q    if(vbus)   
. X" {* Q4 {2 O$ G9 I( z        state <= POR;
% t; s$ D8 L# r0 F& p    else          8 Q2 D& S" E8 Y4 Z" ]$ o
        state <= next_state;' t, W: W. m2 e

* R  \& m* p9 ~, F這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:1 C- N# [; i( |" I. W7 n5 C2 t

$ E7 P$ k+ i0 \, M* _. y& \0 T. k; X0 jalways @(posedge clk)
' q5 g8 U& q% q  r- {7 J. G+ mif(!rst)        
4 y; r: W; w* j9 R. Q    state <= POR;6 _: e% _2 {9 X* F
else            
  P$ N+ ^5 s- E- v    if(vbus)   
$ A5 V9 X8 O/ }" R        state <= POR;& s) [9 ?( H" k- k) O" ^! V' E% c- r% c' a
    else         
- z6 K4 U8 |! T        state <= next_state;% w8 {# [6 A. D) G+ h

! {, ^$ U$ ]/ W; `' Y# V# _這就是一個明顯的同步RESET電路。" {8 x, f- I; W. w! c

3 V* u/ ?" J& i" M2 X; ^透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。0 {* ^& s1 D9 E5 G# F* _
, z. k. `" e- c7 [# H- R
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。
8 b+ L* U7 A- n' E5 D
! C9 D  j1 w  ?. I" k最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。/ w! W% ~0 E; _$ E/ \( g) t
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到( t: b# V7 n8 r1 j) J
照walltsou大所說的. t/ z$ F2 S  U
若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)
' J  U" ]7 G8 ^, u. o8 L若 否 則執行 always@(posedge clk)
  x, Z, Y6 s4 S! c" h/ X7 E5 V. @1 ?: Z! N+ }0 M
所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??* _# F- m" q9 B8 ]2 c! h
那這樣我又有個問題(不好意思問題好多 ^^")
+ k7 g8 ^, X, p# K# o0 J( F6 ?  w若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
6#
 樓主| 發表於 2007-1-22 15:30:27 | 只看該作者

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆( \% |: e4 d* K& s- O4 ~
我在看過回文後有找到定義檔  difines.v的檔案
! Y" c8 H1 g1 _2 M! D2 F找的結果是 被mask掉的一行定義??
+ q, W5 z' I% \
/ k8 H& P: p$ C" P" w8 `) g這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
+ V4 W; r* a4 w1 Q; D/ e4 [7 f但是這個`ifdef `else `end卻又一直的出現
- S9 a4 N/ [& P  W以下是我在define找到的描述及定義程式片斷
' H  e2 B- x4 F+ q& O; L! D`ifdef TEST_IMPL# n9 y' _& f4 U; ^5 Y. M
        // Do not modify this section  B: U7 M2 W3 z) `, Z1 c7 m
        // this is to run the test bench  C) Q, V# u0 u- ^
        `define UFC_HADR        17+ v5 {- N, g$ W. ?  a
        `define RF_SEL        (!wb_addr_i[17])
. ?. o+ q2 H/ e* z0 i        `define MEM_SEL (wb_addr_i[17]); Z/ ]0 _+ ]/ ?/ d
        `define SSRAM_HADR 14& m" E$ W: u9 D- g4 {' D& G$ c
        //`define ASYNC_RESET
' x2 i; g5 S; m8 T0 i2 L! z' n`else
0 W1 ]' c% I) g0 x; X        // Modify this section to suit your implementation4 M' Z& E& h) i7 E
        `define UFC_HADR        12, e9 R5 [' p( l4 G/ p6 o7 G) X
        // Address Decoding for Register File select8 [. C) J  p& k6 x# g
        `define RF_SEL        (!wb_addr_i[12])9 ?3 u# s# G+ i( e
        // Address Decoding for Buffer Memory select
: _& c+ }( C, q, ^8 D        `define MEM_SEL        (wb_addr_i[12])9 \7 C+ d/ @& ?- S: E, a
        `define SSRAM_HADR        9
% r1 I; o8 o; W% M; ^" O9 q9 o( a        // The next statement determines if reset is async or sync.8 C& J" V1 i1 f- W  [
        // If the define is uncommented the reset will be ASYNC.1 T, e! \" Y: E* C$ c* R5 T6 T7 c
        //`define ASYNC_RESET5 J) H: d/ y. x# T) H1 T) s
`endif' u( [) L' m, S  ]: |  j! x
在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET0 [# c+ _# Q$ x0 u1 f
有相關的定義..看到最後真被搞糊塗了..
' S$ {# Z& M: y! n1 A& |7 {8 k2 h8 E* _  O
另外我是在windows XP的UltraEdit 觀看程式的,好像沒辦法用grep尋找 ORz
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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。" _; ]+ G- ^0 `" \' ?; Q9 s+ n: j
所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。& K/ F8 S( F4 Y3 L* Y. X& l
6 Q! J( Z! ?. t( L, s* l
[ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例; O7 P' m+ [, }6 j0 I4 K; H1 H
9 |, L5 ~! m! `
ncverilog -f list_file +define+ASYNC_RESET
2 m$ }8 O1 d! c: M  r" w& R9 |% e, D2 f, R+ x# W
那會定義在跟 Test Bench 相關的檔案裡, 可以如同 sakho 所述般去做 search ...

評分

參與人數 1 +1 收起 理由
greatsky + 1 感謝啦!只剩這一點了感謝你的回覆

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣
6 a& W& H: V" e8 A4 N7 Z4 c
# B& A; S# d5 Q/ uASYNC_RESET2 z+ v7 f' P- N* S+ l: f( h' L- c
可以用grep 來搜尋整個目錄* y' y6 b) d  l* J% y8 l
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*
9 ~1 }$ X5 P7 B; y, [& \小弟都是這樣做的啦

評分

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

查看全部評分

2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
2 \2 ^% Q; n+ D, B% O
9 Q2 ?- u9 T0 L/ ?- e0 V, V相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-16 11:58 PM , Processed in 0.125016 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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