幼女でもできる自作CPUチップ (14) CPUチップのレイアウト

前回の記事

ourfool.hatenablog.com

では、CPUチップの製造に向けて、CPUの各回路ブロックのレイアウトをおこなった。

 ここまでの作業で、CPUに搭載する回路ブロックのレイアウトを全て終えることができた。あとは各ブロックの電源・GND線や、対応する信号線を接続したのち、チップ外部と接続される線を、外周に設けられたボンディングPADと接続すれば、ついに自作CPU、LO5をワンチップ化したものが完成する。

 さて、まずは、各ブロックを適当に配置しよう——としたところで、ふと冷静になってみると、どうもおかしなことに気が付いた。今回試作を想定しているチップの面積はおよそ3mm角だが、PADや外周の電源リングを除くと内部回路に使える面積は高々2.5mm角である。一方、各ブロックの大きさは大きなもので1辺1mmを超える。なんだこのクソデカ回路。終わった。

 そんなわけで、真面目に面積をよくよく鑑みて設計する必要があるとわかり、それぞれの配置は以下のようになった。

f:id:ourfool:20170322000325j:plain

特にプログラムカウンタとALU、出力ポートなどは、事前に配線経路を検討して、最小線幅・線間隔のぎりぎりを攻めて配置した。当たり前だが、ドチャクソ大変だった。

 今回使う2umCMOSプロセスでは、メタル配線がなんと2層しかない。そのため、配線同士が干渉しないよう事前に考え考えして、慎重に配線をおこなわなければならない。LSIにおける配線のごく基本的な戦略として、縦と横で使うメタル配線を分けるというものがある。縦は2層目、4層目、6層目、といった偶数層のメタル、横は3層目、5層目、7層目といった奇数層のメタル、といった風にである。アナログ回路(専ら手配線する)にしろ、ディジタル回路(専ら自動配線するため、使用するメタル層は設定で決める)にしろこれが基本戦術である。なお、今回はそもそも2層しかメタルがないので、まあブロック間のグローバルな配線はどちらかが横でどちらかが縦でいこ、詰まったらそんとき考えよ、といった適当な感じで配線していった。

 まず、レジスタセレクタ、ALUの配線をおこなった。ここはスペース的に余裕があるので、間違いのないよう、兎角、空いた空間を等分割しそれぞれの配線を割り当てる、と意識して引いた。

f:id:ourfool:20170322001818j:plain

 下図は出力ポートとALU、プログラムカウンタの間で、ここが最も難しかった。データバスをそれぞれに接続する上、各々の選択信号を引き出す必要もある。しかしながら、上で示したブロックの配置からわかるとおり、全体の面積削減はここの空間をどれだけ小さく出来るかにかかっている。そのため、最小面積を目指して細かな調整を加えつつ配線した。

f:id:ourfool:20170322002218j:plain

 その後、各々の回路ブロックの電源・GNDを接続し、PADへと接続する配線に名前をテキストで貼り付け、と色々面倒な作業をした末、最終的なレイアウトは以下のようになった。割と感無量である。

f:id:ourfool:20170322002434j:plain

PADへの接続配線の最終的な接続は、チップ試作の都合上、大先生にお願いした。ここで深く感謝いたします。

 さて、そんなわけでなんとか一通りレイアウトを終えた————とかなんか割と順調に終わったように書いてしまったが、実際には相当に過酷、というか無謀な作業であった。予想の10倍の時間がかかったうえ、最終的には締切当日の朝に意識朦朧の中なんとか終えた、ってか終わったのか?これ終わったの?といった有様であった。

 冷静に考えると、ブロック内より遥かに配線量が多い上、・2層しかメタルがなく、・面積にも余裕がない、のだから時間がかかるのは当たり前なのだが、通常手描きしているようなアナログLSI設計では双方ともあり得ない条件だったため、全く見込み違いとなってしまった。結論、ディジタル回路は手描きするべきではない。

 とにもかくにも回路のレイアウトは終えられたが、このままではブロック間に空白が目立ち、そこで密度エラーが生じてしまう恐れがあると、最後の最後に思い至った*1。これを何とか回避するため、最後の力を振り絞って空白にダミーのパターンを挿入し、最終的なチップレイアウトを以下のように得た。

f:id:ourfool:20170322004849j:plain

 さて、そんなわけで、ついに自作CPUであるLO5(Laconic Original 5-bit processor)のチップレイアウト≒製造用マスクデータが完成した。あとは製造を待つばかりである。いよいよ、幼女でもCPUチップが自作できることが証明されるのだ。

 次回はこのチップの測定とその結果について書くことになるはずである。あるいはその前段階で、測定基板の設計や、アセンブラの開発について書くかもしれない。

*1:比較的新しいプロセスだと、製造工程での表面平坦性を確保するために、メタル層の密度をチップ全体で均一にしなければならない、という厳しい設計ルールが存在する。なお本試作は全く遅れたプロセスなので、そんな設計ルールは存在しない。

幼女でもできる自作CPUチップ (13) レジスタ・プログラムカウンタのLSI向けレイアウト

前回の記事

ourfool.hatenablog.com

では、CPUチップの製造に向けて、命令デコーダとデータセレクタのレイアウトをおこなった。

 今回は、残された回路ブロックである、レジスタとプログラムカウンタのレイアウトについて書いていく。

 最初におさらいしておくと、外部メモリやクロック回路、命令デコーダも含めたCPU全体のブロック図と、演算コア内部のブロック図とは、それぞれ以下のようになっていたのであった。

f:id:ourfool:20170227001555j:plain

 

f:id:ourfool:20170303192320j:plain

  前回までに、ALU、命令デコーダ、データセレクタのレイアウトを終えたため、残ったのは、レジスタA, Bとプログラムカウンタ、出力ポートとなる。このうち、レジスタA, Bと出力ポートは、回路としては同一のものである。したがって、レジスタとプログラムカウンタのレイアウトを完了すれば、一通りの要素ブロックレイアウトが完了することとなる。

 これまで書いてきたALU、命令デコーダ、データセレクタが全て組み合わせ回路—現在の入力信号に応じて出力信号が一意に定まる—だったのに対して、今回書いていくレジスタやプログラムカウンタは順序回路—クロック信号の立ち上がりに応じてデータを変化させる、つまり過去のデータを保持することができる—である。クロックが出てくるといよいよディジタル回路という感じがしてよさを感じる*1

 まず、レジスタについて書く。レジスタはDフリップフロップと2入力のマルチプレクサから構成されている。

f:id:ourfool:20170303222713j:plain

 Dフリップフロップはクロックの立ち上がりでDの値を取り込み、Qへ出力する機能を持っている。次にクロックがもう一度立ち上がるまでは、その値を保持し続ける*2。ここでは、マルチプレクサの出力がDと繋がっている。仮にLoadの値が0だと、Dフリップフロップの出力Qは入力Dへと短絡され、クロックが何度立ち上がってもDとQは同じ値を保持し続けることになる。一方、Loadが1になると、Dフリップフロップには外部から来たDataが入力される。これによって、Dフリップの入出力はDataへと変更される。

 以上に示したように、この回路が、Loadが0→同じ値を保持し続ける、Loadが1→Dataを取り込む、という機能を持った記憶回路として働くことがわかる。これを5つ並列にすると、5bitレジスタの完成である。

f:id:ourfool:20170303234655j:plain

  次に、プログラムカウンタについて書く。カウンタの機能はクロックの立ち上がり毎に2進数の00000から11111まで出力値を変えていくというものである。基本的な構成はレジスタと似ているが、ちょっと面倒な回路なので細かな説明は省略する。ネット上の記事だとこちら

qiita.com

が詳しいしわかりやすいので、是非ご参照いただきたい。
 そんなこんなで、プログラムカウンタのレイアウトについては、以下のようになった。

f:id:ourfool:20170303235736j:plain

 

  さて、レイアウト後に、それぞれについて前回の記事同様SPICEファイルを生成し、その挙動を検証した。

 以下はレジスタについてのシミュレーション結果である。rst(リセット信号)がHIGHのときにクロックの立ち上がりに応じてout0(出力信号)がLOWへリセットされ、load(読み込み信号)がHIGHのときにはクロックの立ち上がりに応じてin0(入力信号)をout0へ反映し、LOWのときには以前の値を保持し続けていることがわかる。

f:id:ourfool:20170303235905j:plain

 次に、プログラムカウンタのシミュレーション結果を同様に示す。クロック信号の立ち上がりに応じて、rst(リセット信号)がHIGHのときリセット、以降は出力信号の各bit (out4, out3, out2, out1, out0)が、(0, 0, 0, 0, 0)から(1, 1, 1, 1, 1)まで、つまり10進数で示すと0から31まで、クロックに応じて順々に増えていっていることがわかるはずである。LOWとかHIGHとか0とか1とか混在して無茶苦茶な説明だが、とにかく動作は合ってるので感じ取っていただきたい。

f:id:ourfool:20170304000239j:plain

 さて、そんなわけで、全ブロックのレイアウトを終えた。命令デコーダ以外を適当に並べたレイアウトが以下のツイートの添付画像である。

 今回までで、CPUチップに搭載する各ブロックのレイアウトを全て終えることができた。あとは、これらの入出力を適当に配線でつなぐだけである。こんな楽勝な作業はない、優勝確定—なんてことはあるわけがなく、地獄を見た。がそれについては次の記事で書くこととする。

*1:現在のディジタル回路のほとんどはクロック信号を元にした同期設計である。しかし、非同期設計にも長所があり、むしろ研究ネタとしてはこっちが盛り上がっていく気配もある

*2:Dフリップフロップの詳細動作についてはめんどいので省略する。一応内部回路構成について述べておくと、マスタースレーブ方式(Dラッチ2つを接続した構造)で、スイッチ+インバータではなく、クロックドインバータを用いている

幼女でもできる自作CPUチップ (12) 命令デコーダ・データセレクタのLSI向けレイアウト

前回の記事

ourfool.hatenablog.com

では、CPUチップ製造前のテストとして、自作ALUチップの実装と評価をおこなった。

 ここから本記事まで半年弱と、だいぶ間が空いてしまったが、「ALUチップ作ってなんか一仕事終えた感がでてきたし放置気味でいいか・・・」などと不遜なことを思っていたわけでは全くなく、次の試作へ向けて存分に力を蓄えていたのである。

 さて、今回はいよいよCPU全体を載せたチップの製造に向けて、各ブロックのレイアウトと検証を進めていく―というか、実のところ既にレイアウト+検証済みなので、それについて後追いで書いておく。

 まず、命令デコーダについて。「(4) 命令デコーダ設計」で書いたとおり、機械語命令をCPU内の各回路ブロックの選択信号へと変換するデコーダ回路を設計する必要がある。ゲートレベルの表現は既に完了しているので、あとはこれをLSI上の実レイアウトにすればよい。今回に関しても、配置配線などという高級な手段は使わず、人力でゲートを配置し手配線する。レイアウトツールには、フリーのレイアウトツールであるGladeを用いる。フリーソフトの割にかなりつよい。というかこれがフリーソフトって何がどうなっちゃってるのというレベルである。しかも質問フォーラムでの対応が非常に丁寧で、日本時間のいつ質問しても速攻で返事が返ってくる。謎。しかしこれからLSIを作る幼女の方にはとてもおススメである。

f:id:ourfool:20170226230735j:plain

 さて、そんなわけで命令デコーダのレイアウトをおこなった。全体図は以下のようになった。

f:id:ourfool:20170226231252j:plain

左端の出っ張った部分にはインバータが5個配置されており、各入力信号の反転信号を生成している。IN0~4と、IN0~4の反転信号の計10信号がそこから引き出され、ずらっと並んだ各ゲートに入力されている。「(4) 命令デコーダ設計」の記事に書いた回路図まんまである。

f:id:ourfool:20170226231606j:plain

 

 続いて、データセレクタについて書く。データセレクタの役割は、3種類のデータ (レジスタA, レジスタB, 外部入力) or 全て0 (つまりGND電位) の計4種類のデータから1種類を選んで出力することであった。

f:id:ourfool:20170226233034j:plain

というわけで単に1bitのマルチプレクサをちょいと工夫して配置してやればよい。まず、単純な2データ1選択信号のマルチプレクサは以下のようになる。

f:id:ourfool:20170226233246j:plain

NMOSとPMOSの相補スイッチを使った形である。で、これを2つ並べ、それぞれの出力をさらにもう一つのマルチプレクサへ入力してやると、4データ入力、2選択信号のマルチプレクサができる。1つ目の選択信号で4データのうち2データが勝者として選ばれ、2つ目の選択信号で優勝者が決まるトーナメント方式、と考えるとわかりやすいかもしれない。

f:id:ourfool:20170226233615j:plain

ここで、SA, SBは選択信号、INA, INB, INIが入力信号、GNDがGND電位を入力する部分である。これで1bitのセレクタができた。なお、3つのマルチプレクサの他に2つのインバータを最終段に加えている。これは、マルチプレクサの非フルスイングな出力をGNDから電源電圧までのフルスイング出力に直してやるためである。トランジスタのON抵抗とかが関係ある(適当)。

 あとはこの1bitセレクタをシンプルに並列に並べてやればよい。とても簡単。

f:id:ourfool:20170226234059j:plain

 デコーダセレクタの検証については、Gladeのノード抽出機能によりCDLファイル (cadence社のソフトに使われているSpiceもどきの回路記述形式) を吐き出したあと、それをSpice形式へ書き直した上でもって、LTSpice (ADSpice) でおこなった。使い慣れないLSI用フリーEDAツールを離れ、Spiceでの検証を始めると、実家のような安心感を覚える。

 以下がそのSpiceファイル。普段Spiceで検証するようなアナログ回路ではあんま見ないクソ長かつクソフラット(階層化されておらず全部MOS)記述である。

f:id:ourfool:20170226234509j:plain

 下はシミュレーション結果。入力電圧を0V or 5Vにして各出力を確認した。

f:id:ourfool:20170226234700j:plain

 さて、今回は命令デコーダとデータセレクタの記述を終えることができた。結果として、下図の青く塗りつぶした部分の設計が完了したことになる。

f:id:ourfool:20170227001555j:plain

チップ内部はあとレジスタとプログラムカウンタを残すのみである*1。ちなみに、諸般の都合でLO10は5bitのCPU (LO5) にまた戻ったが、まあその辺は気にしないで進んでいきたい。やはり、5bit=命令32ステップで優勝できるアプリケーションを考えてこそのエンジニア、だったのだ。そういうことにする。

 

*1:てか、これも実は既に終わってる

幼女でもできる自作CPUチップ (11) 自作LSI(4bit ALU)の実装・評価

 前回の記事

ourfool.hatenablog.com

では、自作ALUの搭載されたLSIチップ用に、プリント基板を設計し、製造をおこなった。

 今回はいよいよこの基板に自作LSIチップを搭載し、所望の機能が実現できるかArduinoを使って検証する。

 まず、QFPを基板に手半田した。64pin、0.5mmピッチということでそれなりに細かい作業にはなるが、フラックスを塗りたくって適当に半田を流しておけばなんとかなる。重要なのはとにかく半田を流し過ぎないことのように感じる。基板のフィニッシュをHASL(有鉛半田レベラー)にしておけば、元々基板側にコーティングされた半田が存在するので、外から流す半田はおまけ程度でよいように思う。

なお、QFPの半田付け時には上図のような基板を固定する器具があると非常に助かる。

 今回作る基板はQFP以外とにかくピンヘッダとピンソケットをつけまくるだけなので、QFPさえ乗り越えればあとはサクサクであった。なお、Arduinoとの接続用ピンソケットについては、ピンソケット 1x8 (8P) リード長15mm: パーツ一般 秋月電子通商 電子部品 ネット通販のような15mmリード長のものを採用した。Arduino上に乗った部品とシールドとの干渉を防ぐためには、深くまで挿入してもシールドと部品類間にある程度隙間の残る、15mmリード長の採用が一番簡便である。

 そんなこんなでついに一通り実装を終えた。実装後の基板は以下のような見た目。

 さて、実装を終えたところで今度はArduinoでの評価用プログラム作成をおこなった。具体的に流した最も簡単なプログラムは以下のようなものである。

gistd484ec560e80761b7191bdceff30e6b7

 ここでピン名のID1-4は4bitの入力データ1、IM1-4は4bitの入力データ2、IS0-2は3bitのALU選択信号、O1-4は4bitの出力データをそれぞれ表している。パソコン上のコンソールにA-Eの文字を打ち込むと、それぞれに対応する、ADD(加算)、SUB(減算)、AND、OR、NOT演算がおこなえるよう、ALU選択信号に相当するピン電圧が決定される。その後、入力4bit+4bitの全パターンをぶん回す。入力データの値と出力データの値は 毎回コンソールに表示される。このあたり、マジで幼女レベルのテストコードなので読めばわかるはずである。

 このプログラムに合うよう、QFPからの出力とArduinoピンを接続した。先ほどの小綺麗な実装から嘘みたいに汚い配線状況となった。

f:id:ourfool:20160922004946j:plain

 その配線チェックを終え、祈るような気持ちでプログラムを動かしたところ・・・・・・・・・・・何か挙動がおかしい。しかも規則性がよくわからない、ヤバい。

 この時点で割と死にそうな心持ちになり一旦きんいろモザイクを読んだ。すると数時間後、電源系のそれらしい接続ミスを発見した。やはりきんモザは神。

 5V電源を与えるべきQFPのピンが複数あると気付いたため、ソケットを増設、ジャンパワイヤでつなぎ直した後、息を呑んでプログラムを動かすと・・・

 

 めっちゃ動作した(勝利)

 

 測定系の全景は以下のとおり、ノートパソコンとArduino、今回自作したシールドさえあれば動作する。もちろん、ALUをコンソールから操作する必要がなければ、5Vの外部電源さえあればOK。流石に動いているのを見ると感無量である。

f:id:ourfool:20160922010245j:plain

 さて、そんなわけで、自作LSIチップを自作基板に実装し、幼女でもわかるプログラムでその機能を検証することができた。自作CPUの作成に向けて、大きな一歩を無事踏み出せた。次回はおそらく実際のCPUレイアウトに向かっていくことになるだろう。今回ALUについて、論理としては問題なく動くことが確認できたので、今後動作周波数や各モード毎のタイミングについて探っていき問題がないことを確認した上で、レジスタ周りやクロック分配回路の設計に入っていくことになる。

 まあ何はともあれ、本記事もひとまずこれにてひと段落ということで、次回のチップ試作へ向けて力を蓄えていきたい。その間、本記事の内容を別の媒体としてまとめることを考えているので、そちらについても興味を持って見ていていただければ幸いである。

幼女でもできる自作CPUチップ (10) 評価基板の設計・製造

 前回の記事

ourfool.hatenablog.com

では、自作ALUの搭載されたLSIチップの製造について書いた。

 ついにこれで自作LSIが完成したわけではあるが、パッケージングされていないチップ単体(ベアチップ)やQFP品だけ手元にあったところでどうしようもないので、これらを実装するための基板が欲しくなってくる。
 そんなわけで、今回はチップを搭載する基板の設計と製造について書いていく。要するにパッケージの足にそれぞれ電源や信号を与えられれば方法はどうでも良いのだが、今回は張り切ってプリント基板のデータをつくり、業者に製造していただくこととする。

 さて、チップを評価するためのプリント基板を作るにあたって、まず考慮しなければならないのは、何を使って電源や入力信号をチップに与えるのか、出力信号をどのように受け取り測定するのか、ということである。モノホンの人は電源やオシロはもちろんファンクションジェネレータやロジアナあたりは持っているだろうから、それぞれにつながるコネクタを基板に実装してやり、測定をおこなえばよいだろう。しかし、ここで「幼女でもできる」というコンセプトをもう一度思い返したい。すると、チップを測定する方法は一つしかないように思える。

Arduinoをはじめようキット

Arduinoをはじめようキット

 

たったひとつの冴えたやり方、それは一般幼女の味方、Arduinoである。そこで今回は、QFPを実装してArduinoの各ピンと簡単に接続できる、ユニバーサルなArduinoシールドを作る。

 基板のレイアウトには、最近流行り(?)のkicadを用いた。UIが日本語化されているところや、日本の自作コミュニティで広く使われており、情報検索が容易なところが幼女向けであると思う。また、kicadには幸いArduino UNOの基板テンプレートが存在するため、そちらを利用させていただいた。なお、kicadの使用方法についてはこちらKiCadで雑に基板を作る チュートリアル、テンプレートの利用方法についてはこちらKiCadでArduinoシールドを作る ~テンプレート機能の紹介~ - masahirosuzuka's blogを参考にさせていただいた。この場で感謝させていただきたい。

 さて、これらを参考に無事基板データを作成し終えた。kicadのプロジェクトは回路図とそれに対応する基板上のレイアウトから成るが、それぞれは以下のようになった。

f:id:ourfool:20160920230748j:plain回路図

 

f:id:ourfool:20160920230813j:plain

レイアウト図

 kicadには3D表示機能があるのでここで部品の3Dデータをしっかり作っていれば部品同士の干渉などを確認できる。しっかり作ってなくてもかっこ良さげな絵は見れる。

f:id:ourfool:20160920230839j:plain

 Arduinoの各ピンに対して1つ余計にスルーホールを用意したほか、部品取り付け用に基板の右側にピンソケット用のパターンを作った。中心にあるのはQFP用のフットプリントで、それが周囲の2.54mmピッチのスルーホールにそれぞれつながっている。QFPから離れてしまいやや心許ないが、一応パスコン用のスルーホールも角に4つ用意した。QFP側の電源・GNDの配置が決まっていないだけに良い方法が浮かばず悩ましかったのだが、今回はまあこれで良しとした。

 さて、データが完成したところで、Elecrowさんで発注を行った。発注の際には、CADでガーバーデータ(プリント基板の層別形状データ)を吐きだし、それぞれ指定の名前に変えて投げる。

Top layer (第1層、部品面): pcbname.GTL
Bottom layer (第2層、半田面): pcbname.GBL
Solder Stop Mask top (部品面レジスト): pcbname.GTS
Solder Stop Mask Bottom (半田面レジスト): pcbname.GBS
Silk Top (部品面シルク): pcbname.GTO
Silk Bottom (半田面シルク): pcbname.GBO
NC Drill (ドリル): pcbname.TXT
Mechanical layer (基板外形): pcbname.GML

 今回、Elecrowさんの配達オプションにOCS/ANA Expressなるものが追加されていたので選択してみた。一番安価なEMSに比べて数ドルしか値段が変わらないにも関わらず、爆速で届いたので、是非おススメしたい。参考までに、前回のEMSによる配達では発注から現物の配達まで2週間かかったところ、今回は発注から5日で基板が届いた。しかも10枚頼んだら案の定12枚来た。やり過ぎだし中国カルチャーを感じざるを得ない。

 基板を見てみるとわかるように、若干シルクのズレは見られるものの、致命的なミスは見当たらない。普段数10万円で基板製造している人間からするとめっちゃ驚愕である(僕はそんなことしてないがそう思うはずであろう)。


しかもクッソ適当な感謝に何故か日本語でリプが返ってくるなどする。今後も使います。

 そんなわけで、チップに続いて評価基板(Arduinoシールド)の設計・製造を終えた。ついに残すは基板への実装とチップ動作の確認のみとなった。ここまで引っ張っておいて全く動かないということも結構あるのだが、今回のチップは果たしてどうだったのか・・・?次回にご期待いただきたい*1

*1:ふつうに動いた。

幼女でもできる自作CPUチップ (9) CPUテストチップ製造

 前回の記事

ourfool.hatenablog.com

では、CPU製造に先立って、その心臓部であるALUのレイアウトとデータ送付をおこなった。
 そして今回は、ALUの載ったLSI製造について書いていく。よーーーうやく実際のLSIチップの製造である。

 ここでLSIの製造工程について述べておくことにする。LSIの製造工程は大きく二つに分けられる。一つは前工程と呼ばれるウェハ製造プロセスである。半導体ウェハと言われて想像するあのややデカ金属円盤を作るまでがこれにあたる。チップ設計者が送ったデータからマスクパターンを生成し、微細な配線や拡散層のパターンを形成する。トランジスタや配線の大きさは非常に小さく、先端プロセスでは数nmにもなる。これよりも大きなゴミの付着は致命的であるからして、製造はドチャクソ綺麗なクリーンルームでおこなわれる。人間が中で作業する場合には、全身が覆われた怪しげな白装束集団と化すことになる。

f:id:ourfool:20160916191647j:plain

ウェハの写真 (Wikipedia "集積回路"より)

 続いて、後工程というプロセスがおこなわれる。円盤状のウェハに載った大量のチップをそれぞれ四角い形に切り出すダイシング作業や、これをよく見る黒いICパッケージへと封止するためのボンディング作業をそう呼んでいる。前工程のようなクリーンルームでおこなわれる微細加工とは全く異なるスケール感、装置で製造が進むため、明確に区別されている。

f:id:ourfool:20160916191954p:plain

DIPの写真 (Wikipedia "集積回路"より)

 上に示したのは電子工作で使う標準ロジックICなどで見るDIPタイプのパッケージである。あの黒い物体の中に、さらに小さな数mm角のチップが入っており、それが外に出ているリードフレームと細いワイヤを介してつながっている。このワイヤをつなぐ作業がワイヤボンディング*1である。

 パッケージには他にもマジで無限に種類があるが、電子工作レベルでいうと、mbedに乗ってるARMマイコンでよく見るQFPや、ラズパイに乗ってるSoCで見られるBGAなんかがある。intelさんのCPUソケットは最近LGAなんちゃらみたいな名前だが、あれはまんまパッケージがLGA形式だからである。これらは順にピン数が多く、パッケージに必要とされるピン数はざっくり簡単に言うとチップの性能に依っている。

 さて、実際のチップ製造に話を戻すこととする。前回作成したレイアウトデータを工場に送付して数週間後の8月初頭、実際に製造をおこなっていただいた。通常のLSI設計フローではデータ送付の時点でチップ設計者の出番は終了し、あとは野となれ山となれといった感じなのだが、今回は製造工程(上述したところの前工程)を特別に見せていただく機会に恵まれたので、その模様も下に掲載する。

 クリーンルーム内は以下のような雰囲気。パターンの描画やフォトレジストの塗布、洗浄などをおこなう機材が並んでいる。部屋が黄色く見えるがこれには重要な理由がある。というのも、ウェハ表面の金属配線やその他のパターンは、光に反応して溶けるフォトレジストを利用して作っていくので、一般的なライトの下では変質してしまう。そのため短波長をカットした黄色いライトの下で作業をする必要がある。

f:id:ourfool:20160916222607j:plain

 以下はフォトレジストを塗布したり表面を洗浄する装置の動いているようす、ピタゴラっぽいエンタメ感がある。

 

f:id:ourfool:20160916224640j:plain

以上は作成途中のウェハのようす。基本的にはこのシリコンで出来たウェハに対して、
メタルを全面に作る→全面にレジストを塗る→メタルを形成するとこ以外に光を当ててレジストを溶かす→レジスト溶けたところだけメタルを削る→レジストを全部除去する→所望のパターンを持ったメタル層ができる
という流れを繰り返して何層もパターンを作っていく。どうも良い説明になってるのかよくわからんがわかっていただきたい。

 そんなこんなで完成したLSIの写真が以下である。通常のプロセスだと最上層は保護膜で覆われており配線などはあまり見えないのだが、今回のプロセスは保護膜がなくメタルがむき出しになっているため、パターンがはっきり視認できる。

f:id:ourfool:20160916222026j:plain

ALUの顕微鏡写真

 

f:id:ourfool:20160916222015j:plain

ポリシリコンで描いた萌えイラスト

 

 パターン形成後簡単なチェックを施し、後工程を別の工場にておこなっていただいた結果、3mm角のLSIチップが無事完成した。チップ単体の他QFPへ封止したものもいただいた。

 QFPの方は全くもってQFPでしかないのでまあいいとして、実際のシリコンチップについて述べておく。見た目は銀色チックで表面パターンはよく見える。裏側はまっさらでやはり銀色。それと何よりめっちょ小さい。具体的には以下のような感じである。凄くわかりやすくするためねんどろいどと比較した。御覧のとおりちょうどねんどろいどの手の平に乗るくらいしかない。

f:id:ourfool:20160916230252j:plain

f:id:ourfool:20160916230256j:plain

 というわけで今回はLSIチップの製造について書いた。次回はこのチップを実装するための基板設計と実装について書くはずである。書こう。

*1:ワイヤボンディングでない接続方式も特に近年無限に考案されており、チップを逆さにするだの3Dにして複数チップを積層するだの、さらには2.5Dだの、前工程でパッケージングもするだの、要するに色々つよいのが平然と実用化されている。

幼女でもできる自作CPUチップ (8) ALUのLSI向けレイアウト

 前回の記事

ourfool.hatenablog.com

では、CPUを構成する基本の基本の素子である論理ゲートのレイアウトをおこなった。

 今回は、これらの論理ゲートを組み合わせて、半加算器から全加算器、さらには、ALUのレイアウトを作っていく。

 まず、NANDゲートとインバータを組み合わせて半加算器を作る。

f:id:ourfool:20160715231701j:plain

続いて、この半加算器を組み合わせて全加算器を作る。

f:id:ourfool:20160715231747j:plain

さらに、全加算器にマルチプレクサとインバータを加えて、減算を可能にする。

f:id:ourfool:20160715231906j:plain

最後にNANDゲート、NORゲートとマルチプレクサを追加して、論理演算機能を追加すれば、1bit ALUの完成である(勝利)

f:id:ourfool:20160715232021j:plain

 ここまでで1bitのデータに対して加減算や論理演算ができるALUを作ったわけだが、それではあまりにつまらないことしかできないので、これを4つ組み合わせて4bitの計算を可能にする。基本的に4つ並列にするだけなので簡単である*1

f:id:ourfool:20160715232458j:plain

ここで、周りを囲っている線は電源とGND。リング状にしておくと色々と捗る。

 さて、レイアウトが終わった段階で、4bit ALUの機能をLT Spiceでもって検証した。今回使わせていただいたツールには、トランジスタの接続を表現するネットリストをレイアウトから抽出する機能がある。抽出したネットリストをLT Spiceで検証し、所望の動作を示していれば安心といったわけである。

f:id:ourfool:20160715232939j:plain

上に加算モードでのALUの動作を示した。波形は上4つが出力、下8つは4bitから成るData1, 4bitから成るData2である。クッソ不親切だが、よく見ると加算動作がおこなわれていることがわかるはずである。

 そんなわけで(詳細に説明するのが面倒だしつまらないのでドチャクソ駆け足にはなったが)、テストチップ向けの4bit ALUのレイアウトと検証を完了した。この回路が載ったテストチップは8月の頭に製造予定で、9月には測定による検証が始められるはずである。なお、実際にチップ内のパッドにつながれたレイアウトは以下のような感じになった。

f:id:ourfool:20160715233403j:plain

いろいろと深く考えた結果、空きスペースにはとある萌えキャラを搭載した。わかる人には今後の意図がわかる(?)かもしれない。ご期待いただきたい。

 そんなわけで、テストチップ用のALUのレイアウトと検証を完了した。次回は測定用の基板設計、あるいは、実際のチップ製造について書く予定である。

*1:ただし、加減算器のキャリー信号だけはケアしてやらなければならない。