|
|
上一篇所提到的是:BIOS entry point. 它是第一個被 CPU 所抓取並執行指令之處.每家BIOS都有其相應的 file,要牢記.
2 ~3 ^4 t' d8 w" b/ J/ n
- n3 I) @' Y# J& S1 x在本文中,要提及: Jumpless ! 在此要先說明Jumpless的意義.它代表:"用 s/w方式來 config clockgen generator,使之產生正確的 頻率s 來供應系統運作". 重要性在於:假如某個 frequency錯了,則將導致 system abnormal or malfunction...
! E! L* M5 Q% |
3 q3 K2 J/ a7 K) f" B$ O% N! |% a有哪些 frequencies由 clockgen 提供?- `+ g) w% `3 {8 _- w4 H
- CPU clock (在此指的是 : host clock, Ex. FSB800 CPU 需被 supply 200MHz clock)( Z7 S- Q. p" W6 ~
- DRAM clock( depends on chipset design; Ex. DDR 533要被 supply 266MHz clock)
- ]* g% P& X/ {5 {& o0 x& m更正 : DRAM clock現在都是由NB產生 . 外部的最多是 buffer而已. 並非 clock generator. 原因是為了保持較良好的 host clock & DRAM clock的同步.
9 d: H" Q0 A7 R2 D d9 |/ G9 A
+ E3 p% w. t+ y+ z" R, V7 E補充:我舉的例子是以前的chipset design. 現在我做過的 chipset 其 DRAM clock的確由北橋來推. 北橋中有一會 register定義: CPU-DRAM ratio.
( y( ~5 h1 |* {! W: w; d, G" VEx. CPU clock = 100MHz. Ratio = 3:5,則可得 DRAM clock = 166MHz1 l6 F" j4 i% ?7 i( o! |2 e
% j4 `; i T7 H/ u0 r. M- AGP clock: 標準 is 66.6MHz (= 1/2 PCI clock)/ Z+ |5 I: u: G
- PCI clock: 33.3MHz
( ~# X% }* Y7 ~8 V) v6 Q- SATA clock: 100MHz(see SATA spec,似乎還要更精確...)) \7 v: i( I" p3 j# U
- Link clock: 即假如NB/SB中間有 link,亦由clockgen提供
8 [5 }8 H2 _- L8 M4 a% v- USB 1.1 clock: 12MHz( }; {# l/ ]- ~+ G/ A" X" L! b
更正: USB 的 clock 是 48MHz- ]: M1 a6 Z! k
補充:我們 chipset的 design是: 由 clockgen提供 12MHz clock(或由 external crystal提供),被 PLL吃進去後,會產生 48MHz給 USB 1.1(你說的應該是這部分). 至於 USB 2.0,則是 supplied other freuencies !* j6 v& g* ]/ _$ P% o4 O# N- Y. U2 u' i
+ D9 Y0 K: [+ o, t. ?& E7 q, m0 I
- SIO clock...etc' d0 O, O% k# @8 ^: Y
8 C& ]: I6 L. g; P7 {* E
Clock Generator的架構' V$ L9 }% u/ J$ H* u6 f
=> ClockGen基本組成為 PLL(Phase Looked Loop) + Div. PLL 的輸入為 14.318MHz, 利用 迴授方式產生出 frequency F;之後 經過 Div 除頻,便得到 desired frequency,見下列圖示:
* }: x, A+ x6 [4 S$ K# Y: n T& n. Q
14.318MHz -> PLL -> F -> Div -> f
. L, H$ Q2 O( I
1 e9 ~0 ^" V. @6 _' K9 nEx. F = 400MHz, 為 PLL振出來的;若 Div = 4,則 f = 100MHz
5 Y: F# {) ~7 [0 f# L( l. H
5 S) E6 ]% j; A3 E3 g$ yClockGen的 spec中,會列出許多 registers,好比是 Function 的 "contact window",透過這些 registers可以設定此clockgen !
6 t, m( A+ T5 A" {) O
, R m9 H( I* b3 S2 e8 j# T6 {0 m更正:其實PLL 不是單純一個的 div. 鎖相迴路的參數是兩的divider 組成 M(VCO divider)/N(REF divider) 6 {6 l0 Z0 C: p3 z1 J4 F3 `4 o
補充:觀念上來說是 PLL所振出的頻率經 div後可得到 desired frequency. 但在 clockgen中:5 w/ n7 N* ~, a8 T) f
1. 有 2 bytes(即所謂的M,N)來決定 VCO$ W+ u0 d9 d! U2 H1 R1 G
2. 有幾個 bits來決定 div;一些主要的 frequency都有相對應的div8 Y" U+ H( Y) n
3. VCO / div = frequency
9 V5 N1 x- l/ @/ z9 K
5 c" ^) x( @' R3 R, k/ i; y( R- QHow to access ClockGen: k4 ^6 z' q* B& t+ Q) B# L
=>現今存取 clockgen的方式,都是透過 SMBUS來達成. SMBUS 有分 1.1 and 2.0,不過大同小異. SMBUS是 2-wire protocol;由 SMBUS master(即內建在南橋內部的 SMBUS controller )來下 command 給 SMBUS device(Ex. Clockgen);Command中常用的有 Block Read/Write & Byte Read/Write 0 I) z/ m# t4 b4 O# V
! ~! y& ] T" W4 y不同家 chipset 的 SMBUS controller implement方式不同,自然下command的方式亦不同;主要的步驟是:
N$ g; |/ q5 E! g1 T* |( r- pre-init( clear status or ...)
- Q; C3 A4 y) P- put slave address(要 access 的對象)
& b9 W6 M" @$ ]6 s8 E" V ~( ~- decide Read or Write
" V" N/ r, q) K3 h+ t: p- put command(Protocol type, Ex. Block or Byte access)* ^- c' `9 z% g
- put offset(要存取 自 clockgen中的哪一個 Byte開始...)' |" W# s" L8 `8 O3 J2 i6 n
- put data if (Write device)2 ~6 j$ b0 C* _4 m' G
- start transaction !!!
. r6 T" @7 d" {9 }( ]% m& Q0 l(... processing ...)5 D9 ]: ~1 m5 S. k! I* L; l. P
- get "Complete" status to check if transaction is done successfully; V2 f; W) V8 p5 \5 O% q* E) v
(...wait for system reset...) - w" T+ G: l: N! m6 w9 V. P
" N6 V* ?% U- l. w8 t e
* 當 start transaction後, SMBUS controller便會將 programmer所 prepare的資訊將之轉成 SMBUS command打給 device;完成後應該在 controller端有 status register可以檢查,看看是否 transaction ok or failed,或是有其他 error conditions.
* B! F! O. B O! c: S' f
2 T5 t+ `# s6 W. v1 T( Z透過這樣的方法,programmer便可以 config clockgen使之產生正確的 frequencies.
. |% `0 i" U8 u) F; r8 \0 y) ]# [. U+ k( P9 k
[2 Programming ways for clockgen]* h' `0 ^4 B3 l5 X) S# b$ Y* s
=> 現今的 ClockGen有提供兩種方式 for S/W config. 一為 table mode,一為linear mode. Table mode指的是: ClockGen spec 中會有一個 table,裡面說明: 要產生 ? frequency 要填 ? 值.因此,這種方式只需program 1 byte to Clockgen就行了. 若是 linear mode,則是坊間所說的無段變頻,即可以微調frequency. Ex. table mode只提供 100/133/166/200MHz,但 linear mode則可以提供類似 102.6/136.3/168.7..等的頻率. 此時,要program的 byte數就很多了.....除此之外, linear mode也可以config 所謂的 spread spectrum(%),板廠測EMI時會用到4 z* D9 D. S$ C' c' ?) K" W9 `
! w4 `0 W" |4 `: B2 ^7 O/ A
【Notes】4 G N* v2 x# N* ~) R
1. For NB platform power-on CPU frequency 由 2 pins來決定;DT platform會由 Jumper決定.不管如何,之後做Jumpless都可以 override掉原 clock settings
4 m5 r4 L3 K! P4 t8 ^5 }% W+ e
" }% G! ^' x& x9 x' N更正: 不是只有NB如此.不管DT 或server. CPU FSB 也是 pin(由於FSB頻率比NB多.所以是 3 pins )來決定的.不是jumper. 即使要做超頻設計會對這三pin做手腳, 也不會使用jumper- q0 G3 u; P, S& \
$ c4 ]' Q0 H# C) u' P6 n4 i
$ k7 T+ o% e% ]8 f: G# Q- F" q/ B& o2. 有些 clockgen所提供的 SS 都是 center spread. 若需要 Down spread則可以由 center spread搭配 改變後的 frequency(類似直流準位)來達成3 b" b1 P6 Q7 C+ @' q' W
# `, K7 C. Z6 w' Q' [
給我正確的頻率,其餘免談 ...^_^... " m0 c3 i" M& E. ?0 l
6 X6 g( b( u8 w: }=====================================================================' V, ^, V4 T* R) M, ?; W$ Y" s
Q&A9 W) h( J: d( i" E9 G$ ^$ y
=====================================================================5 R `6 i- N4 E& b. v8 p$ r
>前輩我有幾個問題要發問!9 l5 X& [7 d. U: K8 q, l
>1. 你這邊說的Table方式頻率是指供應給CPU頻率嗎? Intel網站的CPU說明,他說是固定的不可調的? 所以這不是HW固定住(Latch)設定值了嗎?
; K. K- D. L* \* F) D: J2 w8 J>; d& F* u8 a# Q5 g. K
>2. 可以解釋一下Down Spread/Center Spread /...所代表的意思嗎? 還有用途?
( U& S% Z) s1 ]>
' I- R! Z. s* D>3. 我目前也在嘗試Program ClcokGen(新手上路),很多專有名詞還沒搞懂,另外目前ClockGen不是可以. {& V. { D: f0 Q: b3 |4 T
>輸出不同頻率嗎? 為什麼Table方式只需要Program 1 byte就好 ???還是說各家廠商設定方式不同,有些廠# @" q/ \9 P% l: ^' R. S# P
>商只要利用1 Byte 就已經選擇好所有的頻率了(33MHZ/48MHz/DOT96MHZ/LCD27MHZ...)?8 C$ I' a5 e& I) X/ {. D
* n% B* r1 V$ [5 H& V, P
[For #1]8 ]4 ~) j# `6 m! t
=> 我所謂的 "Table"方式指的是: 為了方便設定,clockgen designer會專門提供一個byte register(8-bit);此 byte的某些 bit fields(Ex. bit[4:0])可以讓programmer填一組值,例如 01001b. 此值 write 至 clockgen成功後, CPU/DRAM/AGP/PCI/...etc 都會是固定的頻率. Ex. 100/133/66/33/...etc. 所以才說只填 1 byte only !
+ K [2 O l+ O/ I( `' m, @5 @( d1 U$ m8 I9 c
此值一旦填至 clockgen, clockgen便依據該 byte(可參考 spec前幾頁,會有一張表說明: bit[4:0] <-> frequency combinations)來產生出 frequencies.
+ s9 ?- R8 c2 J6 p" O3 ]9 O+ _1 y9 a2 e: `& t* `$ D
不管用哪一種方式(table or linear mode),都會 supply CPU frequency !!!不過,此時的 CPU frequency is CPU的外頻 ( CPU 總頻率(core) = (外頻)*(倍頻 <-multiplier) )
]+ [% J* G* j# |
]# _/ p/ E" o) |* Z) {Ex. 外頻 200MHz(Merom CPU, FSB 800),倍頻 = 12 -> core freq = 2.4GHz9 P: ~# T* U8 [0 d" Z5 |
- k2 B) L5 N4 D: C4 v還有,BIOS可以調整 外頻 & 倍頻 ! 沒問題 ! 不過,若遇到鎖頻的CPU(Ex. 量產版的CPU),倍頻可能無法調整.但外頻還是可以靠 config clockgen來達到 !!!. Q; @& A: h; c. E1 {$ L( P
* a7 f, V( X$ d" [' r
For #2- _7 L) O* p; z) G
=> 假設要達到 100MHz 且 SS = 0.5% center spread.則:+ S3 I& f. ^+ f+ a1 k
(...想像以前學的直流與交流的訊號...)
: K1 p* ?9 D" B
7 H; b& d& S% l100MHz 相當於 直流的部分,其值不隨時間而變; 0.5% center spread好比弦波訊號(振幅是 100M * 0.005 * (1/2);所以,兩者的合成便是: 以 100MHz為中心,其值隨時間而變,振幅 is 100M * 0.005 * (1/2) 的訊號 !!!
) T. ~; W! n8 i. b1 [" m2 d5 d2 Z3 Y5 q
我 '猜' 要這樣測試的原因是:所產生的 clock一定不會是 perfect的 100MHz,有可能因為元件或是外部干擾而被 "改變".為了模擬這樣的情況,我們會將 clock的 spread spectrum enable,產生 "隨時間而改變"的頻率,來測試系統的穩定度...等& n3 L+ f/ m3 D5 h& w
# X6 |5 J$ E! |Down spread 0.5% 指的是:距離 水平 100MHz, 最低的值是 100M-100M*0.005,最高值則是 100M本身( 等同於: 水平值 99.5 + center spread 0.5%, right ? )
$ r4 [% F# C, ], u! w: C; U% ]" P. Y; u8 U' f& c4 h1 H. ^. ~
For #3
* B( i6 o# X' p; v, @=> 前面提過,只設 1 byte 就可以產生所有頻率是因為: clockgen公司已經把設定各頻率的功能"濃縮"在一個 byte裡面 ; programmer只要 config this byte 就可以了...0 L n' F; S, K: t% L4 c1 ?
2 y+ A1 d% T2 M% _$ Q* 關於 EMI 測試部分,有錯請指正. ( ...我有用到 "猜" 字眼...^_^ )# J: r d, ^$ `+ C& e% z
3 w) v! I. u3 T) O4 t8 ], t+ q
[[EMI 測試的知識]]7 X% C4 h! P4 @1 P( G2 ^9 u {
由於 對clock信號來說. 鋒(peak)值是能量最強的地方. 所以peak的能量就會不斷累積, 發射出來. 因此在頻譜上就會出現能量很強的頻率. EMI 工程師的工作就是要想辦法屏閉這些電磁波的干擾. & i" x" w% z0 e& c9 r# i, G- q
: [( m1 j6 Q+ Z% `% ~6 }
為什麼需要 spread spectrum? 由於PLL 十分精準. 也就是說 100MHz的clock, 其 peak & peak之間的距離一致(波長固定). 所以能量十分驚人. 使用展頻可以使 peak 的距離改變(由於頻率不斷的在一個範圍內改變, 這個可以用示波器累積clock信號來看) 所以累積的能量會比較低. 這樣EMI 可以比較好處理.
@0 K# o2 r! h; I1 N
3 I& V; C! Y1 L1 O3 |至於為什麼會有要求BIOS一開始就把展頻開著, 以確保板子的穩定? 很簡單.不開展頻clock很穩定.自然比較不會有問題. 展頻一開. 由於頻率是浮動的. 很多設計欠佳的板子就會不穩定. 及早發現才能及早修改. |
|