仕事で役立つ人気ビジネスアプリおすすめ!
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
コンピュータアーキテクチャの話 (29) マイクロプロセサの実装コスト
よく知られているように容量を充放電するのに必要なエネルギーはC*V^2であり、消費電力は、これに1秒あたりの充放電回数α*fを掛けたものになる。ここでfはクロック周波数であり、αは回路の動作率である。回路の動作率はクロック分配系のようにサイクル毎に充電と放電を行う回路では1.0であるが、一般の論理回路ではサイクル毎に1、0、1、0を繰り返す場合でも1サイクルに充電、または放電が1回であり、αは0.5となる。
前回述べたように、トランジスタのゲート容量は微細化にはあまり影響されずチャネル幅1μmあたり1fF程度である。また、配線は1mmあたり100fF程度であると考える。これらの値は、当たらずとも遠からずの値であるが、当然、使用する半導体プロセスにより異なるので、実際にはそれに合わせて見積もりを行う必要がある。
CMOS LSIの消費電力要素であるゲートと配線(下位2層だけを表示)を示す。
一例であるが、上図のように1.2fFの入力容量を持つ2入力NANDゲートが1平方mmに15万ゲートあると、入力容量の合計は360pFとなる。一方、配線ピッチを(ITRSの最小寸法より緩めであるが)200nmとすると、びっしり配線を作ると1平方mmの中には長さ1mmの配線を5000本作ることができる。しかし、実際のLSIでは配線の無い部分があり、また、電源配線もあるので、信号配線は全体の30%程度というのが普通であるので、1平方mmあたりの配線容量は150pF程度である。
これは配線層1層あたりの容量であり、第23回 に配線断面の電子顕微鏡写真を載せたように下層が密な配線、上層はピッチが大きくなり単位面積あたりの配線容量は減少するので、10層配線の場合は、全体では密な下層配線6層分程度の容量となる。
このため、典型的には65nm世代のチップ1平方mmあたり、360pFのゲート容量と900pF程度の配線容量がある。電源電圧1.1V、クロック2GHzでαが1.0とすると、C*V^2*α*fは3.05Wとなる。回路の動作率は論理設計に依存し、また、プロセサがどのような処理を行っているかで変わり、プロセサ内でも回路ごとに異なるので、一定値ではない。しかし、非常に大雑把な目安としてはα=0.1程度(論理回路だけで見ると0.05程度であるが、クロック分配系やクロックが直接接続される部分は1.0である)である。この場合、1平方mmあたりの電力は0.3Wとなり、50平方mmのプロセサコアは約15Wを消費する。
最近では、消費電力が大きな問題であり、不要な回路へのクロックの供給を止めるクロックゲートを行うのが一般的であり、これによりαを小さくすることが出来、IBMなどの発表によると~20%程度電力を削減している。つまり、クロックゲートにより、15Wを12W程度に減少させることが出来る。
一方、大容量の2次キャッシュはタグを引いてからヒットした部分だけを読み出す方式が一般的であり、キャッシュを構成するメモリの一部だけが動作すれば良いので、動作率は更に小さい。このため、4MBの2次キャッシュを含めて、チップの消費電力は15Wから20W程度と見積もられる。
以上が容量の充放電によるダイナミック電力であるが、最近の微細化されたトランジスタではゲート電圧をゼロにしてオフ状態としても電流が漏れるリーク電流が無視できない値である。また、極めて薄くなったゲート絶縁膜をトンネル効果により電子が通り抜けることによるゲートリークも問題になりつつある。これらによる漏れ電流の値は半導体プロセス依存であるが、ITRSロードマップの値はトランジスタのチャネル長1μmあたり400nA程度である。チャネル長0.8μmのトランジスタ 4個で2NANDゲートが構成されており、半分がリークに寄与する(オフのトランジスタだけがリークに寄与する)とすると、1.6μm分の640nAのリークと見積もられる。これが500万ゲートあるとすると、3.2Aのリークとなる。
メモリセルはチャネル長 0.1μm程度のトランジスタ6個で出来ており、同様に計算すると1bitあたりのリークは120nAのリークである。4MBの場合は、これがほぼ40Mbitあるので、2次キャッシュ全体のリークは4.8Aとなる。
両者をあわせると8Aのリーク電流であり、1.1V電源とすると8.8Wとなる。そしてダイナミック電力をあわせると、全消費電力は25Wから30W程度となる。但し、2次キャッシュのメモリのリーク電流はかなり大きいので、各社ともメモリには高めのVthの低リークトランジスタを使うなどの方法でリーク削減対策を行っており、上記のリーク電流より小さくなっているのが普通である。
IntelのCore Duoプロセサは65nmプロセスを使用し、チップサイズは約90平方mm、2次キャッシュは2MBである。2MBの2次キャッシュを20平方mm程度とみると、各コアは35平方mm程度である。上記の計算を当てはめると、2GHzクロックの各コアのダイナミック電力は約10W、2次キャッシュのダイナミック電力は2W程度と推定される。そしてリーク電流は各コアが2.2A程度、2次キャッシュが2.4A程度となり、これらを合計すると約30Wとなる。
Core DuoのTDP(Thermal Design Power)は31Wであるが、TDPは製品チップとしての上限値であり、Core Duoの標準的なチップの消費電力は20~25Wと思われる。ということで、大雑把な見積もりであるが、オーダーとしての値は一致している。
コンピュータアーキテクチャの話 (52) 4004の設計を追体験する
ここでALUの設計に戻って、次は、ALUの中の一番の大物であるADDERの設計に取り掛かろう。
1ビット フルアダー回路
この図に示すように、フルアダーは、1個のXORでAとB入力の加算を行い、もう1個のXORでA、Bの和とキャリー入力C-inの和を求めSumを生成する。そして、その下の3個の2NANDと1個の3NANDは、桁上がりのキャリーC-outを計算する。3個の2NANDは、それぞれC-inとA、C-inとB、AとBの両方が"1"となると"0"を出力し、4番目の3NANDにより、C-outを"1とする。つまり、A、B、C-inのうちのいずれか2個以上が"1"であるとC-outが"1"となる。ということで、フルアダーはA、B、C-inの3つの1ビット入力を加算した結果と桁上がり信号を生成することができる。
このフルアダーで1ビットの加算が出来るようになったので、次は4ビットのアダーである。多ビットの加算を行う高速アダーについてはいずれ稿を改めて説明しようと思うが、4004の設計では高々4ビットの加算であるので、最も単純なリップルキャリー方式のアダーを用いる。この4ビットアダーの回路を次の図に示す。
4ビット リップルキャリーアダー
最下位ビットのA0とB0とCinをフルアダーで加算し、そのキャリーを次のA1、B1のフルアダーに入力するというように、キャリーを次々と伝搬させていく。ADDERは、加算だけでなく、減算も行う必要があるので、ここで、一寸、数値の表現法の話と減算のやり方について述べておこう。
正の数値は単純な2進数で表わすとして、負の数値の表現法には1の補数表現と2の補数表現、あるいは、1ビットを符号に用いる方法などが考えられる。最上位ビットをサイン(符号)ビットとし、+3は0011、-3は1011とする表現法は整数の加減算に適しないので、通常、整数の表現としては用いられない。しかし、浮動小数点数の場合は単純な加減算ができないので、この表現方法が用いられている。
1の補数表現は、例えば3のバイナリ表現の0011に対して-3は、各ビットを否定して1100と表現する。しかし、この表現法で表わした+3と-3の加算は、0011と1100の加算であり、1111となる。つまり、0000と1111の両方がゼロを表わすことになり、面倒である。
これに対して、2の補数表現の負数は1の補数表現に1を加えたものであり、-3は1101となる。2の補数表現での+3と-3の加算は、0011と1101の加算であり、10000となる。ここで最上位ビットからのキャリーを無視すると結果は0000となり、上手くゼロとなる。また、+3と-2の加算の場合は、0011と1110の加算となり10001となるので、これもキャリーを無視すると0001となりOKである。そして、結果が負になる+3と-4の加算は、0011と1100の加算であり、1111 = -1となり、これもOKである。というように、2の補数表現を使うと正、負の数の足し算が上手く行くので、現在の計算機は整数に関してはこの表現法を用いている。ということで、ここでの設計は2の補数表現を用いることにする。
2の補数表現でA-Bを行う場合は、Bの2の補数を求め、それをAに加えてやれば良い。しかし、2の補数表現はビットごとに否定を行いそれに1を加えた数であるので、そのままでは+1が必要になる。しかし、A-Bを求める場合には、ADDERにAと、Bの否定を入力し、さらにキャリーC-inを"1"にして加算を行えばBの2の補数表現を加算したことになる。この関係は任意のビット長に当てはまるので、12ビットの引き算を4ビットづつ実行する場合は、B-high、B-mid、B-lowと4ビット毎に区切って、それぞれの否定を取り*B-high、*B-mid、*B-lowとし、先ず、A-low+*B-low+1を求め、キャリーをYに保存しておき、次にA-mid+*B-mid+Yを計算し、また、キャリーをYに格納し、最後にA-high+*B-high+Yを計算すれば良い。
また、4004のSUB命令はボローを含めて減算を行う命令であるので、ボローが無い場合は、上記の減算を行い、ボローがある場合は、2の補数表現にするための+1とボローの-1が相殺するので、C-inをゼロとして加算をおこなってやれば良い。つまり、ボロー付きの減算の場合は、Yを反転してC-inとすれば良い。
加算と減算動作を行う4ビット加減算器の回路を次の図に示す。
4ビット加減算回路。減算のためのインバータとマルチプレクサを含む
前の図に示した4ビットリップルキャリーアダーのB入力側に、否定をとるためのインバータと、Bか*Bか、およびC-inかその否定かを選択するマルチプレクサを付加している。そして、Add / Sub信号により、加算の場合はB側を、減算の場合は*B側を選択する。この部分は、インバータとマルチプレクサの替わりにXORゲートを用いても良い。
そして、ALUで最後に残ったのが、CC Genサブユニットである。このサブユニットは、JCN命令において次のような条件が成立しているか不成立であるかを判定する。
C2=1:アキュムレータの内容が"0"の場合にはジャンプC3=1:キャリーが"1"の場合にはジャンプC4=1:テスト信号が"0"の場合にはジャンプC1=1:上記のジャンプ条件を反転
これを実現する回路は次の図のようになる。
CC Gen生成サブユニット
アキュムレータの内容が"0"となっていることの検出は、ACC0~3の4ビットの信号を2個の2NORと1個の2NANDで4入力OR回路を作ってAll-0を検出し、これをインバータで反転しているが、4NORを使っても良い。そして、この条件が検査されるのはC2=1の場合であるので、次の2NANDでC2とANDを取る。キャリーフラグは、Yレジスタの出力をそのままC3とANDすれば良い。そして、TESTは"0"の時に条件成立なので、インバータで反転してC4とANDを取る。これらを3NANDで纏めると、条件が成立した場合には"1"になる信号が出来る。C1が"1"の場合には条件を反転するためにXORゲートを使い、条件の成立、不成立を保持するためにCCフラグFFに格納する。条件成立/不成立の格納はJCN命令の最初のX3サイクルに行う必要があるので、X3とCJN、1stByte信号をANDしてFFのエネーブルに入力している。
コンピュータアーキテクチャの話 (40) 4004の設計を追体験する
4004プロセサは連載の32回に掲載した基本命令サイクルの図に示すように、A1-3、M1-2、X1-3の合計8サイクルで一つの命令を処理する。論理設計の足慣らしとして、この8サイクルのタイミングを発生する回路を作ってみよう。NANDゲートやフリップフロップ回路は分かったけれど、これを使って論理機能をどうやって作るのかを理解したいという読者向けで、8進のカウンタとデコーダという簡単な回路なので、そんなものを作るのは朝飯前という読者は読み飛ばして戴きたい。
ここでは電圧はLow/Highの2状態を取り、Lowが論理"0"、Highが論理"1"を表わすとする。また、NAND回路は入力の論理値のANDの否定を出力する回路である。フリップフロップ(FFと略記する)は、クロックCKが"0"→"1"に変化するタイミングでD入力の論理値を記憶してQ出力に出力し、それ以外のタイミングではFFの出力は変化せず以前の状態を保持する。
タイミング発生回路は、Sync入力がLowになるとその次のサイクルはA1になり、全体を8サイクルで繰り返す必要がある。8サイクルの周期であるので、各サイクルを区別するには、最低3ビット(2の3乗=8)の状態が必要である。このため、3個のFFを用いる回路を設計したものが次の図である。
8状態のタイミング発生回路
4004のタイミング発生回路はΦ1、Φ2とSyncという入力を持つが、Φ1、Φ2は2相のPMOSダイナミック回路であることから必要になったものであり、FFを使った1相クロックのタイミング発生の観点からはΦ2をクロックCKとして良い。
正確には、4004はSync入力を受け取るのではなく、X3サイクルの信号からSyncを発生し、他のチップに送り出す。一方、4001 ROM、4002 RAMは、同期のために4004からのSyncを受け取っている。従って、上記の回路は4001、4002用のタイミング発生回路である。
一方、4004 CPUにはReset信号があり、この信号をSync入力に入れ、Resetが解除された次のサイクルからA1 サイクルが始まるようにすれば良い。
MCS4システムのタイミング図では、Sync入力が"0"の状態でクロックCKが入るとA1状態となる必要がある。上記の回路においては、全部のFFがリセットされてQ出力が"0"となった状態を最初のA1サイクルとしている。
従って、Sync入力が"0"の状態でクロックが入ると全部のFFが"0"状態となり、Syncが"1"の場合は、FF1、FF2、FF3の順に上位ビットとすると、最下位のFF1はクロックがL→Hと変化(クロックが入ると呼ぶ)するに従って状態を反転し、次に上位のビットであるFF2はFF1が"1"の状態でクロックが入ると状態を反転する。また、最上位のFF3はFF2、FF1の両方が"1"の状態でクロックが入ると状態を反転する。そして、各FFは、これ以外の条件では、クロックが入っても以前の値をそのまま保持するという回路を作れば良い。
上図のNA1、2、3、6、7のNAND回路にはSyncが入力されており、Sync=0になるとこれらの回路の出力は"1"となる。これにより、インバータやNA4、NA8の出力は"0"となりFF1、2、3の入力が"0"となるので、クロックであるΦ2が入るとFF1、2、3は全て"0"となる。
Sync=1の状態では、NA1の他方の入力はFF1の*Qであり、クロックが入るたびにFF1の状態は反転する。FF2のD入力は、FF1の状態(Q出力)が"0" (*Qが"1")の場合は、NA2、NA4を経由してFF2自身のQ出力と同じ状態がD入力に入るので、クロックが入っても以前と同じ状態を保つ。一方、FF1の状態が"1"の場合は、NA3、NA4を経由してFF2自身の*Qが入力されるので、クロックが入ると状態が反転する。同様にFF3は、FF1とFF2がともに"1"の場合にはNA7、NA8経由でFF3自身の*QがD入力にフィードバックされるので、クロックが入力されると状態を反転するが、それ以外の場合にはNA6、NA8経由でQがフィードバックされるので、以前の状態を保つ。
これで8状態の遷移を行う回路が構成できたので、残りはFF1~3の3ビットの状態からA1~3などの8つのタイミング出力へのデコードである。A1はFF1~3の全部が"0"の状態であるので、FF1~3の*Qが全て"1"の状態をNAND回路で検出し、これをインバータで否定する(結果としてANDとなる)ことにより作ることが出来る。また、A1はFF1~3が"1"、"0"、"0"の状態であるので、FF1はQ、FF2、3は*QのANDを取ることにより作ることが出来る。残りの状態についても同様に、各状態の2進数表示が"1"の場合はQ、"0"の場合は*Q側の信号をANDすれば良い。これを行うのが図のFF群より右側の回路である。
コンピュータアーキテクチャの話 (38) 4004の設計を追体験する
もう一つ、重宝な回路としてトライステートゲートがある。トライステートインバータの回路図を次に示す。
トライステート インバータの回路と論理記号
通常のゲートの出力は"0"か"1"の2状態であるが、この回路は、Enable入力を"0"にすると一番下側のN-chトランジスタがオフ、一番上のP-chトランジスタもオフとなり、出力はVddにもVssにも接続されない高インピーダンス状態(回路理論では、インピーダンスをZの記号で表すのが普通であるので、High-Z状態とも言う)となる。この第3の状態を取りうるので、トライステートと呼ばれる。次に示す図は、トライステートゲートを用いたマルチプレクサ(セレクタとも言う)の回路図である。
トライステート回路を用いたマルチプレクサ。左:論理回路図、右:論理シンボル
En1~4の信号は、一時期にはどれか一つだけが"1"になるように制御されたエネーブル信号であり、出力OutはEnが"1"となっているトライステートゲートを通して、入力に応じてVddかVssに接続される。一方、Enが"0"の回路はHigh-Z状態であり、出力をVddにもVssにも引っ張らず、出力に影響を及ぼさない。従って、この回路により、In1~4の信号の一つを選択して出力することが出来る。
右側の図は、簡易的な記述であり、In1~4の4つの入力の一つがSelect信号により選択されることを示している。この後に説明する論理設計では、図を簡単にするため、この略記法を多く用いるので覚えておいて欲しい。
状態を記憶する基本単位回路はラッチ(Latch)と呼ばれる。ラッチは戸などに付けられた掛け金の意味であり、掛け金を掛けて情報を閉じ込めて保存するということから名付けられている。
情報を閉じ込める基本回路は、次の図の3と4のゲートのループからなっている。G入力が"0"の状態ではゲート1と2の出力は"1"となり、ゲート3と4の出力はそれぞれのゲートの他方の入力の否定となる。ゲート3の入力の否定がゲート4の入力となり、その否定がゲート3の入力となるので、G=0の状態では、ゲート3の入力が"0"でも"1"でも安定した状態となる。つまり、情報を閉じ込めることが出来るわけである。
通常ゲートで構成したラッチ
上記の回路は、ゲート1にはD、ゲート2には*D(テキスト形式では文字の上にバーは付けられないので、以降では*Qと*を前置することで否定を表わす)が入力されており、入力Gが"1"の状態では、ゲート1の出力は*D、ゲート2の出力はDとなる。
Dが"0"の場合は、ゲート4の入力が"0"であるので、他方の入力に関係なくその出力は"1"(=*D)となる。従って、ゲート3の入力は双方"1"となりその出力は"0"(=D)となる。Dが"1"の場合は、論理をたどると、この逆でゲート3の出力は"1"となる。つまり、Dが"0"であるか"1"であるかに係わらず、Q出力はDとなり、*Q出力は*Dとなる。
ここでG入力を"0"に変化させるとゲート1と2の出力はともに"1"となり、情報を保持する状態となるが、G入力が"0"となる瞬間にはゲート3の他方の入力は直前の*Dの値であり、3の出力はDとなる。一方、4の他方の入力は直前のDの値であり、出力は*Dとなる。つまり、G入力が"0"となるとDが"0"でも"1"でも直前のDの値をそのまま保持する。
注意深い読者は、G入力が"1"から"0"に変化する瞬間に、同時にDの値が変化するとどうなるのかと質問するかも知れない。これは実に鋭い質問であり、同時がどれだけ同時かにもよるが、Dの変化が早めであるほど変化後の値になる確率が高く、遅めであるほど変化前の値になる確率が高いが、同時に近くなるほどどちらの値になるか不定になり、本当にギリギリのタイミングでDが変化すると、リンギングと言ってQ、*Q出力が中間状態付近で振動して"0"か"1"かに落ち着くまで長い時間が掛かる。従って、G入力の"1"→"0"変化の直前と直後のある期間はD入力を変化させてはならないという期間があり、直前側の時間をセットアップ時間、直後側をホールド時間と呼び、論理設計を行う場合は、この期間にはD入力を変化させないようにしなければならない。
コンピュータアーキテクチャの話 (26) マイクロプロセサの実装コスト
論理回路のLogical Effort
CMOS回路がスイッチする遅延時間は、ゲートを構成するトランジスタを通して流れる電流で負荷となる容量を電源電圧Vddの1/2の電圧まで充放電する時間で決まる。充電する負荷容量は、次段のゲートの入力容量と配線の寄生容量が主な要素である。
ゲートを構成するトランジスタを全て2倍に大きくすると充放電する電流も2倍となる。しかし、次段のゲートのトランジスタも2倍にすると入力容量も2倍となり、遅延時間の改善効果は2倍より小さい。ゲートを構成するトランジスタをどんどん大きくしていくと、ついには配線の寄生容量はゲートの入力容量に比べて無視できる程度に小さくなり、これがゲート遅延時間の下限となる。この下限の遅延時間はトランジスタのゲート入力容量とドレイン電流の比で決まる。ITRS2004では2入力NANDゲートに同じゲート3個を負荷として接続した場合の遅延時間が示されており、90nmテクノロジでは約24ps、2007年の65nmテクノロジでは約16psとなっている。
インバータと2入力NAND
この図はインバータと2入力NANDのトランジスタ回路を示している。インバータはP-TrがオンになるとOutをVdd方向に充電し、N-TrがオンになるとOutをVss(グランド)に放電する。一般にはLow(Vss)→High(Vdd)とHigh→Lowの両方向のスイッチの遅延が同程度になることが望ましく、P-Trの大きさ(ゲート幅 W)をN-Trの2倍程度に取る。そのため、ここではN-Trのサイズは1 Unit、P-Trのサイズは2 Unitとした。
一方、2入力NANDはN-Trが2個直列に接続されている。抵抗を直列に接続した場合と同様に、トランジスタも2個直列に接続すると1個の場合に比べて流せる電流はほぼ1/2になる。一方、P-Trは2個並列になっているが、in1、in2の一方だけがLowになった場合は、1個だけがオンする。このため、2入力NAND回路では、(1入力がスイッチした場合の)Low→High、High→Lowの遅延を同程度にするためにN-TrとP-Trのサイズはともに2Uが適当である。この図には無いが、3入力NANDではP-Trが3個並列になり、N-Trは3個直列になるので、N-TrはP-Trの1.5倍の3Uサイズが適当である。
このように、同じ放電電流を流そうとすると、インバータより2入力NAND、2入力NANDより3入力NANDではN-Trを大きくする必要がある。この関係を総合して表わす考え方としてLogical Effortという理論がある。同じサイズのN-TrとP-Trでは流せる電流が2対1の場合、インバータでは2UのP-Trと1UのN-Trが用いられる。入力容量はP-TrでもN-Trでもトランジスタのチャネル幅Wが同じであると、ほぼ同じである。従って、インバータの入力容量Cは3 Unit分である。2入力NANDではN-Trが2個直列になるので2倍のサイズが必要であり、各入力は1個のN-Trと1個のP-Trに接続されるので、入力容量Cは4 Unit分となる。
以上の説明では、充放電電流を一定にするようトランジスタサイズを選んだが、逆にインバータと入力容量を同じにするためには、2入力NANDを構成する全トランジスタの単位サイズ Uを3/4に縮小する必要があり、充放電電流も3/4となる。つまり、同一入力容量とした場合、同じ負荷容量をつけた2入力NAND回路の遅延時間は、インバータの4/3倍となる。この4/3倍が2つの入力のNANDを取るという論理動作に必要な努力(Logical Effort)である。同様に、3入力NANDの入力容量は5 Unit分であり、Logical Effortは5/3となる。
一方、次の図に示すように2入力NOR回路ではP-Trが直列になり、N-Trが並列に接続される。電流駆動能力の小さいP-Trが直列になるので、直列にならないN-Trと同じ電流を流すためにはP-Trのサイズは4Uにする必要がある。
2入力NOR
このため2入力NOR回路の入力容量Cは5 Unit分となり、Logical Effortは3入力NANDと同じ5/3となる。NANDとNORは相補的な関係にある論理演算であるが、一般的なCMOSではP-TrとN-Trの電流駆動能力がアンバランスであることからNOR回路の方が大きなLogical Effortとなる。このため、実際の論理設計では、信号の極性を工夫してNANDを多く使うように回路を設計することが多い。
なお、以上の説明では、同じサイズのN-TrはP-Trの2倍の電流が流せると想定してトランジスタサイズを決め、Logical Effortを計算したが、実際の半導体プロセスではこのN-TrとP-Trの電流比は厳密に2対1ではなく、多少異なっている。特に、最近の歪シリコン技術を用いるとP-Trの電流改善の方が大きく電流比は1対1に近づく。従って、回路を設計する場合には、実際に使用する半導体プロセスのP-Tr、N-Trの電流比に合わせてトランジスタサイズを決め、Logical Effortを求めるのが良い。