CPU+コンパイラ自作ワークショップを開催しました

サイボウズ・ラボの内田(uchan)です。 先日「CPU+コンパイラ自作ワークショップ」というイベントを開催しましたので、その報告をします。

会場入り口の案内板

イベントの概要

2022 年 4 月 29 日、FPGA ボードを用いたオリジナルの CPU と、CPU 用の機械語を生成するための C コンパイラを自作するという趣旨の「CPU+コンパイラ自作ワークショップ」を開催しました。 10 名の参加枠が募集開始 40 分で埋まるという人気ぶりで、当日はみなさんとても楽しそうに作業されていました。

作った CPU 基板はこんなものです。

製作したCPU基板

Tang Nano 9K という FPGA ボードに CPU 内部の値を表示するための LED 表示器やスイッチを接続するための基板となっています。 USB シリアル変換基板を取り付けることで、パソコンと CPU が通信し、機械語をダウンロードしたり演算結果を出力することができます。 プリント基板は市販しておらず、このワークショップ用に特別に設計したオリジナルのものです。

「作った」は誤字ではありません。実際に参加者自らが作ったのです。 ワークショップの前半で、配られた部品をプリント基板にはんだ付けしました。

ワークショップ後半は、FPGA ボードに対して Verilog で記述した CPU 回路を書き込み、コンパイラが出力した機械語を転送して実行する、という流れです。 特徴は CPU やコンパイラをそれぞれ完璧に作ってから先に進むのではなく、CPU とコンパイラを少しずつ作るというところです。 最初は「固定の値を LED に表示するだけの回路」を作って、次に「パソコンから送られてきた値を表示する回路」に進化させる、というような。 それと同時に、コンパイラ側は「最初に整数 1 つを認識する」というものを最初に作り、そこから改良を加えていきます。

イベント当日の様子

朝、開場前に参加者に配布する部品セットを準備します。並べてみると本格的な部品点数で、なかなか凄いワークショップを計画したもんだと思いました。

配布した部品たち

最初にワークショップでやること、今日の流れなどを説明します。 直後にやる基板の組み立てに向け、おすすめの組み立て手順や部品の向きに気をつけよう、などの注意点を話しました。

スライドを映しながらの講義風景

現代の電子工作では表面実装部品を避けては通れません。 表面実装部品ははんだ付けが難しいのですが、価格と性能は表面実装部品を選択する大きな理由になります。 ということで、今回設計した CPU 基板では多くの表面実装部品を使いました。

本日使った中で最小の部品は米粒より小さい

使用する部品のうち最小のものがこれです。手のひらに載っている黒い粒ですよ。 なんと長さ 1.6mm しかありません!

熱心にはんだ付けする参加者

参加者は持参した道具を駆使し、非常に集中してはんだ付けをしていました。 私は各部屋を回り、組み立てのアドバイスをしたり、持ち込んだルーペではんだ付け品質を検査したりしました。

計画と実際

本ワークショップでは表面実装部品を避けずに使用し、参加者のみなさんに細かいはんだ付けに親しんでもらうことにしました。

最も細かい部品はデュアル Nch MOSFET で、ピン間 0.5mm、6 ピンのパッケージです。 ピン間 0.5mm というのは、端子の中心から次の端子の中心までが 0.5mm ということを意味します。 端子と端子の間の隙間は 0.5mm より細く、0.3mm くらいしかありません。

Nch MOSFET

ピッチ間隔がこて先より細い表面実装部品の場合、端子を 1 本ずつはんだ付けするのは無理です。 そこで、先が平たくなっているこて先に換装したはんだごてを使い、複数の端子を一度にはんだ付けしていきます。 参加者には適したこて先とフラックス、精密ピンセットなどを持参してもらい、頑張ってはんだ付けを行いました。

計画では、当日 10 時から基板の製作を行い、午後から CPU およびコンパイラの作成をする、という段取りでした。 直前リハーサルで基板を組み立ててみたときから薄々感づいてはいましたが、蓋を開けてみるとやはり計画通りにはなりませんでした。 基板製作を 15 時くらいまでやって、その後基板を用いた演習、という感じになりました。 普段からはんだ付けに慣れている私でさえ 1.5 時間かかったのですから。しかも 2 枚目の製造で。

参加者の組み立て風景を見て回った結果、いろいろな気づきを得ることができました。 例えば、はんだごての温度設定やこて先を酸化させないための工夫、こて先の使い方などの技法を伝える必要があるとか、 はんだ付けに失敗した場合の修正方法も、経験がないと分からないですからね。

はんだ付けの品質をルーペで検査するuchan
はんだ付けの品質をルーペで検査するuchan

計画通りだったことを上げるならば、事前にリストアップした工具リストが可不足なく活躍したことです。 はんだごてやフラックス、ピンセットなどの工具を持参が必要な工具としてリストアップしておいたのですが、いずれの工具も余すところなく活躍しました。 (高倍率なルーペは必須工具にしていなかったのですが、次回は必須指定しよう思いました)

イベントの真の目的

コンピュータの仕組みに興味を持つ人を増やしたいというのが、本ワークショップの真の目的です。 CPU 基板の組み立てから自分の手でやってみることで、ソースコード上の数式が計算される仕組みを体験するというのが直接的なワークショップの目的なのは確かです。 それに加え、この体験をきっかけとして、コンピュータアーキテクチャというものの存在を知り、興味を持って学習する人を増やしていきたいんです。

プログラミングへの入門に対する敷居は年々低くなっていると思います。と同時に、プログラミングという行為とハードウェアの関連性がどんどんなくなっていると私は感じています。 昔はプログラミングといえばマイコンボードを手元に用意して BASIC プログラムを打ち込む、というように、ソフトとハードが密に関連していたそうです。 今ではパソコンを開き、ブラウザの開発者モードを呼び出せばいきなり JavaScript コードを実行したり、 競技プログラミングのサイトにアクセスするとすぐにコードを入力し、正解判定を受けることができますよね。

特別なボードを買ったりハードウェアの知識がなくても、すぐプログラミングが体験できることで敷居が下がったのは良いことだと思います。 あるいは、プログラミングというものをハードウェアの制約とは無関係に純粋な行為として研究、実践できるようになった、という見方も出来ると思います。

でも、その裏でプログラミングのハードウェア的側面に興味を抱くチャンスが減っているのではないかと危惧しています。 昔、プログラミングを学ぶ過程で強制的にハードウェアを見る必要があったのに、今は「本来は興味のある人」でも、そこに触れるチャンスが無いまま過ごすこともあり得ます。 ハードウェアに触れ、興味を持つ機会を提供するためのイベントが本ワークショップなのです。

ワークショップは少なくとも後何回かは開催したいなと思っています。 今回、いろいろフィードバックを得ることができましたので、次回に生かせるはずです。 次にやるなら、CPU 基板を組み立てるだけの日を確保しじっくり取り組めるようにしたいな、など試してみたい改善案があります。 今回参加出来なかった方、よろしければ次回を楽しみに待っていてください。 そして、今回参加してくださった皆様、どうもありがとうございました。次回以降、経験者として何らかの協力をいただけたら幸甚でございます。