Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-1-11 19:14:52 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
各位先進好~3 [' L! q8 E/ p3 _
我是剛從學校進入這領域的新生,說不上是初學者
1 N0 X% K( J( }/ `/ W: j因為若要設計一些簡單的project,這點我還堪用
/ r& d' z" P. ?另外,小弟也用過兩大FPGA廠商的EDA相關的Tool : Xilinx ISE 、Quartus II 、ModelSim ...等6 v5 N/ G  {+ a" Y/ G7 ^
% ?; L$ |! V" A$ h( h5 |
不過最近剛近公司,開始學著看程式卻發覺有一些寫法我不太懂。
  C. q. q& {- f# F是關於 `ifdef ... `else .. `endif; Y5 r; p. e+ Z& C

. l9 M' X7 @( C4 |' }# K下面舉某段code  請哪位有經驗的大大能幫我解釋一下
, E: l, h7 n  V$ R8 x2 q/ S; U1 i
`ifdef ASYNC_RESET
! R: N% s# Y+ R1 c5 R" r" L4 r        always @(posedge clk or negedge rst)) L4 p3 \. j6 m  w5 _0 x
`else
0 `) s" T/ U+ l+ Y        always @(posedge clk), C7 G$ O9 ~7 L) A% R0 Z+ s
`endif
/ H# ?+ U$ I0 ^" v9 `        if(!rst)        state <= POR;) W# O' q# V2 \) R7 s9 ~* v
        else
# P1 b. @1 y6 Q3 z% b9 u5 b, j! y4 W                    if(vbus)   state <= POR;) s) d7 w0 l) I) i. g- U- b6 {
        else          state <= next_state;
  v; o: a( T  [
* j5 K& `2 }1 Q) ^: V請各為大大賜教了!
& a1 i/ b; p7 x9 Z$ d4 p$ [5 ^9 p- B8 y" G3 V: j2 I
我是在猜想說,若條件符合者 是以always@(posedge clk or negedge rst) 再接到 if ..else  J& \# i1 f3 b* ~
不過這條件判斷是以ASYNC_RESET為依據嗎?
+ g8 V/ d) p5 d. f0 o2 i& d但我在程式中找不到這個ASYNC_RESET的相關程式斷落..
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
15#
發表於 2011-9-14 10:06:18 | 只看該作者
~~~~~~~~~~~~~~~~~~
% n, Y* H) z' c* g% I! MThanks a lot
14#
發表於 2011-9-14 10:05:10 | 只看該作者
回復 3# sakho
: S* r/ B8 \3 G+ b' T; N& h; b" v/ q( v1 ~8 c/ X; h
Thanks a lot!~!
13#
發表於 2011-5-19 15:19:28 | 只看該作者
回復 6# greatsky 8 n" j# t; q1 b- d2 I

5 t* J% o  P* t  \; u; d1 v' v& s+ D9 S
    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語法使用上的時機及電路在合成方式
7 G; |# `* A! `( s我會好好的研究同步與非同步的使用,謝謝
9 v0 D8 z1 v+ }* a5 H+ t9 Z' ~( S5 _* a
另外我會好好的寫code的,若自己沒看過其他人寫過的code還不太有所長進,自己寫的東西跟以前做專題那種Code Style沒兩樣 Orz
  h" E/ o$ [7 ]3 L. R) y也謝謝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找感謝囉..... `3 p* Q9 o' T/ M) r7 E
8樓的算標準答案了, 不管是preprocessor還是synchronize / asynchronize reset都解釋的很清楚囉...
6 \; D/ H- E3 L8 ^+ T! wgreatsky 加油啦! code多寫, simulation多run,就會愈來愈清楚了...

評分

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

查看全部評分

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

回復 #7 greatsky 的帖子

你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣+ s0 m  r3 b# P4 o
# {+ i5 |0 R: @) I5 i2 y
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:" e9 w9 _$ J4 W- w3 B
always @(posedge clk or negedge rst)
* @0 W$ w3 g3 A0 `* u0 t' V2 T( \; mif(!rst)        ' O5 X8 E3 l8 }/ o+ U
    state <= POR;
  j# G7 \: F3 G* z! d* L) nelse            
0 y8 ^3 S! v+ Y1 X- |5 g& |    if(vbus)   # W) B; U/ S/ N9 H7 s6 U+ s
        state <= POR;
5 G6 J# Z3 \; D    else         
% l- `7 f+ t& i. C& T6 D        state <= next_state;" Y6 ~# z) S( S
9 o$ I) J  ?9 ~& s( E: g. i
這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
( p) F. o. {8 k: n8 p& i9 U8 _  R0 G& D; U
always @(posedge clk)
$ F8 m3 ]8 Z2 m- Aif(!rst)        3 T) W# d$ f( f6 n) |
    state <= POR;
" _8 ?! f8 m0 U5 J: S7 Helse            
  f9 }) e/ w8 W! ?- e2 c4 `0 Y8 j1 t    if(vbus)   + l8 J2 r2 R; H$ V" R
        state <= POR;
8 n$ H2 `) B+ K2 r5 b    else         
* P- J  `, y% K2 A0 C8 e  z        state <= next_state;- M4 h+ f5 p) h, R2 G) y

8 S5 \3 z9 G$ y& D這就是一個明顯的同步RESET電路。, c/ ]+ Y5 T0 w9 b6 H: }
; P' v% E. ]) Y. E. g+ }
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。" T3 S0 l2 z% }0 g8 F

4 L; [8 E# V# n( O+ U你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。7 _% M% I# N9 U7 C; q& b
/ @! g" v! t/ }& l8 E! z
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
& z2 {9 z5 _6 V9 U3 ?) a5 khttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf

評分

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

查看全部評分

7#
 樓主| 發表於 2007-1-22 15:40:58 | 只看該作者
在回文後再看過walltsou大的回文思考時,突然想到1 R$ O) T% F, J# Q# }6 U5 P* M
照walltsou大所說的
6 w3 E5 f8 o: u! _+ V若 有 定義AYNC_RESET則執行 always@(posedge clk or negedge rst)4 t0 i8 U& l% E' g
若 否 則執行 always@(posedge clk)- H% L% k- a5 F
2 B- K$ D4 T, I" P- O6 m; {/ E
所以再看到我前一封回文的 被mask程式 那也就是說這程式也只會執行 否的部份囉??' `9 D* f( w7 g' Y$ D7 j; j
那這樣我又有個問題(不好意思問題好多 ^^")+ t: P0 F$ `( K
若照這樣看來不就僅僅在posedge clk時有動作,那若有rst訊號來也不就都不會有動作?
6#
 樓主| 發表於 2007-1-22 15:30:27 | 只看該作者

回復 #3 sakho 的帖子

首先感謝masonchung 版大及 sakho大 及另外兩位先進的回覆$ a& i  X/ M; l& ]
我在看過回文後有找到定義檔  difines.v的檔案
& }3 Y0 e) C! `" y1 {找的結果是 被mask掉的一行定義??
, A. @0 ?* P9 g9 z
7 w* z- k/ n. y3 y7 g7 A這結果讓我有點失望,因為在其他相關檔案中也不曾有這行的定義
, ^+ I/ N: [, X5 @1 D% E: {但是這個`ifdef `else `end卻又一直的出現  G/ O) |; F" ?0 F
以下是我在define找到的描述及定義程式片斷' ?! J( C2 P! [
`ifdef TEST_IMPL
: Y$ @9 r) J- F3 I  n        // Do not modify this section
3 V- E" W9 @9 q- {& d6 g9 q9 G$ o        // this is to run the test bench* `! c2 c  m; p/ F: Y$ |: Q4 s
        `define UFC_HADR        178 b( P. e; A6 k' \; }
        `define RF_SEL        (!wb_addr_i[17])
/ }- z8 S8 B& j: E' N/ H6 C        `define MEM_SEL (wb_addr_i[17])
  `" T2 I7 O7 y1 J5 y        `define SSRAM_HADR 14
# o$ V/ I2 }7 T' U6 P0 w/ R3 F        //`define ASYNC_RESET& Q, |5 H9 p% U, M
`else
  N0 H  M/ p7 a* j7 E' L, U        // Modify this section to suit your implementation) a+ N5 }' b/ }: v
        `define UFC_HADR        12
- s$ N2 N* G* U. h3 ^% @        // Address Decoding for Register File select
# J- [- H. O+ I, ^        `define RF_SEL        (!wb_addr_i[12])
0 r' ?+ |: V. f        // Address Decoding for Buffer Memory select
6 x1 A5 G, d. b1 @1 @( h5 b$ R        `define MEM_SEL        (wb_addr_i[12])2 ?/ z) D" v! V
        `define SSRAM_HADR        9" G) I/ n# ?( q4 G4 M9 i
        // The next statement determines if reset is async or sync.
1 ]3 l; o8 x5 {- H# {        // If the define is uncommented the reset will be ASYNC.9 n/ C- l  l, Z6 b+ _7 z
        //`define ASYNC_RESET, R9 X9 u6 f6 V+ @. N
`endif
* e4 g: @  i$ r- u* e在看過TEST_IMPL的定義也只是對特定的變數做定義,也沒有跟ASYNC_RESET
( [3 y! G% d7 Q有相關的定義..看到最後真被搞糊塗了..
" t, ?: F* f, D. s
) \/ j5 l4 B0 p  I. J* u9 K7 _另外我是在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信號。也就是符合條件的是程式碼,不符合條件的當成是註解刪除。
0 K+ _' e$ {* a! i3 o. h所以`ifdef  `else  `endif會改變轉譯時的文章樣子,對於開發除錯版本特別有用。
: c2 O4 D' }/ F
4 v& E0 C' d( d" ][ 本帖最後由 walltsou 於 2007-1-19 10:12 AM 編輯 ]

評分

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

查看全部評分

4#
發表於 2007-1-17 10:03:21 | 只看該作者
以 ncverilog 為例
4 s6 e7 t# v$ b
7 P  b! r, I2 ^; Z3 _' Cncverilog -f list_file +define+ASYNC_RESET" q! e2 B- _+ {' @- E

8 W" S+ U8 L+ Y" L那會定義在跟 Test Bench 相關的檔案裡, 可以如同 sakho 所述般去做 search ...

評分

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

查看全部評分

3#
發表於 2007-1-17 00:19:47 | 只看該作者
`ifdef  `else  `endif的用法其實就如masonchung大講的一樣. M3 d9 e: b9 C% `) S# y
8 t  i8 w8 V" z
ASYNC_RESET
8 ^5 M5 U$ L+ Z% x2 o6 |8 O4 |可以用grep 來搜尋整個目錄# y( w0 s. B% }- t0 e
Ex: grep ASYNC_RESET *.v  或grep ASYNC_RESET *.*% Q! W  ~7 }9 B9 ^. U5 _% H% }
小弟都是這樣做的啦

評分

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

查看全部評分

2#
發表於 2007-1-11 19:29:36 | 只看該作者
這個`ifdef  `else  `endif 是用在整合不同外在條件的寫法
/ |3 v, Q  S# V, i/ Y% F0 M' f6 {7 L3 M% c  }' L* b4 h
相對的 ASYNC_RESET 會用`define 來定義, 可能在別的verilog檔案內

評分

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

查看全部評分

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

本版積分規則

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

GMT+8, 2025-2-9 09:50 AM , Processed in 0.187201 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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