半導体設計について何も知らない素人が1ヶ月で8bitCPUをテープアウトした話

この記事は HDL Advent Calendar 2021 25日目の記事です。 すいません、11日ほど遅れての投稿です。

この記事では、以下のツイートに至るまでの裏話について話させていただきます。 HDLに関係があるかというとかなーり微妙ですが、許していただきたいです🙏

導入

さて、皆さんCPU自作していますか? 最近もまた、緑の本が出版されるなどして、CPUづくりが盛り上がっているようで、嬉しい限りです。

ご存知のようにCPU自作にもいろんな流派がありまして、オレオレISAの変わったCPUを作ったり、性能を求めてスーパースカラー化したり、自作CPUの上で動かすソフトウェアに凝ったり、電子部品を使って手ではんだ付けをすることによって作ったりと様々です。

上記で挙げた例では、FPGAボードを使ったり、シミュレータで動かしたり、基板に実装したりするわけですが、これらは実際に市販されているCPUとは異なり、実際の半導体のレイアウトになっているわけではありません。現実のCPU製作では、この半導体のレイアウトにも膨大なコストがかかっているはずで、せっかくCPUを作るのであればぜひその大変さを味わってみたいと思うのが人情です。

しかし、半導体のレイアウトをするツール類というのは一般にクローズドで、入手できたとしても莫大な金額がかかります。うーん困った困った...

そんな所にピエロくんがいい情報を持ってきてくれました。

vlsi.jp

オレオレLSIを焼きたいですよね? 焼きましょう。 Skywater社がPDKを公開し、OSSなGDSIIコンパイラであるOpenLANEも生まれました。そしてGoogleの出資によってEfablessが無料でLSIを作らせてくれるプログラム、Open MPW Shuttle Programをスタートしました。 今こそオレオレLSIを焼くチャンスです。あなたの作りたいチップをGoogleの金で作りましょう!

はい、なんとツールが公開されていて、しかも製造もタダでやってくれるらしいじゃないですか!これをやらない訳はありません。しかし、次回の締切まで約1ヶ月...どうなっちゃうの私達!

何はともあれ、手を動かしてみよう!そういう感じで始まりました。*1

Jacaranda-8について

さて、今回テープアウトしたのは1年ほど前にピエロと一緒に作ったオレオレ8bitアーキテクチャ「Jacaranda-8」の「charlatan」という実装です。このアーキテクチャは命令長もバス幅も8bitでとても窮屈ながらも、割り込みにも対応しておりUARTもあるので、意外と楽しいものになっております。簡易的なラベルに対応したアセンブラもあります。詳細はこちらをご覧ください。

LSI設計の流れ

さて、ここに書くことは我々も最近になって理解したことで、つまりこのプロジェクトを進行するに当たっては全然知らなかったことです。

LSIの設計は、LSIの大規模化に伴って自動化が進んでおり、今回のプロセスであるsky130を使った設計についても、OpenLANEというツールが対応しているので、基本的にはVerilogのコードと要求するLSIのスペックを記述したconfigファイルを用意することで行うことが出来ます。

しかし、LSIのレイアウトを実際に描いていく配置配線という作業は本質的に組み合わせ最適化問題で、configをうまく調整したり、Verilogコードの最適化を行ったりしてうまく解けるように試行錯誤する必要があり、ここが肝心で大変な作業という認識です。

OpenLANEについて

OpenLANEはOpenROADという所が作っているLSI設計の自動化ツールで、OpenROADやyosysやmagicといったOSSのツールを組み合わせて構成されています。 f:id:yuhki0223:20211221212225p:plain OpenLANEの中では、LSIレイアウトの生成に必要な各工程が自動化されており、中間ファイルを生成しては次のツールに渡して、というのを繰り返すことでGDSというレイアウトの図形データを作ります。 上の図はその工程の流れを示しています。

論理合成からタイミング解析、テスト、配置配線、最適化などを行います。

Caravelについて

今回のOpenMPW Shuttleでは、Caravelというハーネスが用意されています。Caravelは、RISC-VのマネジメントSoCやGDSの配置などを含むもので、我々のモジュールはこのマネジメントSoCを通して信号を入出力することができます(もちろん生のピンにつなげることも出来ます)。またEfablessがこのCaravelを使ってcaravel_user_projectというレポジトリを公開しており、これを自分の環境に持ってきて、caravel_user_project_wrapperに自分のモジュールをインスタンス化することによってGDSの生成はもちろん、マネジメントSoCを含むシミュレーション等ができるようになっています。

実際の作業の概要

序盤

まずはこれをダウンロードしてJacaranda-8のHDLを配置しました。そのままのconfigでビルドしてみたところうまく行ったかのように見えたのですが、GDSビューワーで確認してみると何も生成されてないやんけとなりました。しばらく色々と調べてみると、yosysの最適化で自分たちのHDLがばっさり無視されてしまっていることが分かりました。

トップモジュールの入出力の記述が良くないようだったので、これらを改善することで解決しました。

中盤

上記が解決すると、今度はビルドが通らなくなりました。現状デフォルトのconfigになっているので、生成するGDSの面積や実装密度などを調整しないとダメなようです。Jacaranda-8はメモリの記述を含んだモジュールのため、回路が複雑化し、大変苦労しました。本来であれば、メモリだけ外部のメガセルを使えると良かったのですが、あまり知識がなかったので結局手を出すことが出来ませんでした。1-2週間、ピエロと共に1回8時間以上かかるビルドをひたすら回し続けました。時にはメモリが足らなくなり、swapを大量に切ることもしばしば。また、efablessのサイトでprecheckというテストを通すことができるのですが、用意されているvmのコンピュータのメモリが16GBで、足りなくなってしまい、急遽メモリを増やしていただくなどの対応をしていただきました。色々試した結果、なんとかビルドには成功することが出来ました。

終盤

さて、最後の仕上げとしてefablessのサイトでtapeoutという最終テストに通します。ここでは、precheckより厳しく製造時のルールに違反していないか、ちゃんと動作するのかなどを見られているようです。

HDLに同期リセットと非同期リセットが混在しているのを発見し、改善しました。 お行儀の良いHDL記述について全く知見がなかったので、もしかするとまだまだ改善する余地があるのかもしれません。

終盤は、特にタイミング解析での違反を解決する作業でした。他のプロジェクトのコンフィグを見様見真似で取り入れたりしました。

締め切りの前日からは、Efablessのメンバーの人がDMでつきっきりで対応してくれるなど、かなり有り難かったです。

まとめ

ざっくりとではありますが素人がテープアウトするまでの様子を書かせていただきました。今まで全く知らなかったLSI製造の一端を知れた気がして楽しかったです。それにしても分からないことが依然として多すぎるので今後勉強していきたいです。

*1:実は、二人でLSIを作ろうと決めたのはちょうど二人で遠くまで出掛けていたタイミングで、空港でOpenLANEをインストールしてあれこれ作業したのを今でも覚えています