LSI(Large Scale Integration)の民主化が進んでいる

takeoka氏(以下、takeoka):俺ASICと俺CPUを作っているのでその話をちょっとします。

最近、日本でも半導体復興と言われています。(半導体は)お金持ちの物だと思っていたけれど、近頃はGoogleが安く作れるようにしてくれていたり、OpenEDAやOpenLANEというOSSのツールを使えば作れます。

これはだいぶ前からですが、Googleががんばっています。ほかにも、FOSSi(Free and Open Source Silicon Foundation)という非営利団体があって、ここでやった成果をもうちょっとだけ作りたい時は、50万円から100万円出せば作れるという道筋もあって、無料で試作したものを商用量産できるので、大変な零細企業でも作れる環境ができています。

RISC-V Foundationのボードメンバーの河崎さん(河崎俊平氏)はNEDO(国立研究開発法人新エネルギー・産業技術総合開発機構)から資金を受けて、実際にちょっとしたLSI(Large Scale Integration)を作っています。

実はソフトはこれまでも一応あって、このへんに固有名詞が入っていますが、こういうツールでLSIは開発できていました。ところがPDK(Process Design Kit)という、トランジスタをここまで近づけていいという制約条件が書かれたファイルが大事にされてきたため、何千万円クラスのツールを作っている会社にしか供給されず、これまでは貧乏人には手も足も出ませんでした。

日本の現状

そんな中、Googleががんばってくれて、SkyWaterなんかは無料で手に入ります。日本でもこのPDKを勝手にオープンして「半導体をこっちでもオープンソースでやれ」と言って地味にやっている人たちがいて、日本の半導体工場のPDKもだんだん無料で手に入れるようになってきています。

GoogleなどのGAFAはFPGA(Field Programmable Gate Array)を使っていましたが、実はそんなに速くないし、消費電力がすごく大きく、データセンターでメチャクチャ使うと、電気をすごく食ってしまいます。なので、アナログ・デジタル混在でエッジ側でセンサーとすごく小さなマイコンが入ったようなものを作ってばらまこうとか考えているんじゃないかなと思っています。

政府も半導体産業の復興や再興、LSI開発の裾野を広げたいと、公的な半導体系の研究機関がOpenEDAに注目していたり、福岡にあるオープンソースツールで固めているセンターの職員は、親切にいろいろ教えてくれます。こういう合成ツール(CyberWorkBench)はNECの商品が使われていたり、ここの施設(福岡システムLSI総合開発センター)でもだいたい50万円から100万円でLSIの少量生産ができて、それは商売で使っていいですという感じです。

他に、ミニマルファブというのを非営利団体でやっている方がいます。(スライドを示して)似たような装置が並んでいますが、これは、少し作っては次の工程へ行き、またそこの工程から次と、一個一個の工程を手でやっていって半導体を作ります。人間の手間はかかりますが、費用は超安く、1個から作れます。こういうことをやっている人も日本にいて、「なんか楽しそうやな」という感じです。

現在開発中の「オレのSoC(System-on-a-chip)」

私たちは今、SoC(System-on-a-chip)を作ろうとしています。65nmか90nmのわりと太いテクノロジーでASICを作ろうとしています。一応、省電力・省メモリのチップで、ロボットの部品モジュールが簡単にローコストで作れるものを作っています。そこにオレオレCPUである「松竹V」を突っ込みます。これは先ほどの制約を加えるやつで、ゲームみたいになっています。大して論理も入らないので、制約のキツイ中でどう戦うかみたいなゲームになっています。

僕がだいたい「こういう構成でいこうぜ」というところを決めて、まっちゃん、松永くんという大変よくできる人が、3日から10日間あったらわりと何でも機能を作ってくれるのですごいなと。そんな感じでやっています。

RISC-Vコアは東工大吉瀬研の「RVCoreP」というのを基に魔改造しているのですが、一応GnuPrologのコンパイルドコードを速くしています。「Prologなんか誰が使っているんですか」という話がありがちですが、この頃アメリカなんかでも「論理推論を入れないとやはりダメだ」と、機械学習と一緒に論理推論を入れている例が増えてきていて、実際にPrologがこっそりあちこちで使われているということがだんだん判明してきているので、私たちもこれまでどおりPrologを使いましょうと。それをちょっと速くするということをやっています。

それから、僕たちはOSを書き飽きたのでOSなんかのソフトは書かず、ハードウェアマルチスレッドで、ハードウェアでもってタスクスイッチします。一定時間ごとに切り替わるとかですね。それからハードウェア・セマフォで排他と同期をしています。他の排他制御と同期方式としてに一応LR/SCも付けました。キャッシュメモリはないけれどLR/SCが一応使えるようにしました。

これをちょっと今実装しようと思っています。間に合うかどうか。普通は割り込みを起こすんですが、割り込みをなしにして外部ピンからの入力でスレッド起床ができます。割り込みなしで、割り込み相当の処理を専用スレッドでやるということですね。これはOSのプログラムコードもいらないし、ワーキング・エリアも不要です。マルチスレッドだからスレッドのレジスタセットは持ちますが、これの管理コストのためのものがすごく少ないです。

かなり小さいハードウェアでこういうマルチスレッド機構ができています。それから次のページで説明しますが、ROS2の通信部分をハードウェアで実装してやっています。OS不要のチップを作っています。

ROS2プロトコルをハードウェア化している

ROS2プロトコルをハードウェア化しています。「ROS2rapper」という名前です。構成は、少しだけハードウェア用の拡張がありますが、文法的にはC言語ですね。LGPLで配ろうかなと準備をしています。通常ROSはLinuxがないと動かなくて、OSもメモリもたくさんいるし、CPUもMMUが必要な高級なものでないといけないのですが、ハードウェア化したことによってものすごく少ない論理で動いています。バッファ用のフリップフロップがたくさんになっていますが、正味の論理はかなり小さいです。

あとは「ハードウェア論理なので、送信パケットのチェックサムを同時に1クロックで計算できるだろ」と僕が言って、実際に担当者に作ってもらって、一応8サイクルを1サイクルでサム計算をやります。各層のIP層、UDP層、IP層のチェックサムを全部いっぺんにやりますが、なんか「最長パスが長くなって周波数が50MHzでしか動きまへん」とか担当者に言われて「あ、そうですか」と(苦笑)。

そこのチェックサム計算のところを分割すると、最高121MHzで動いて「あ、そうですか」と。うれしいのか悲しいのかよくわかりませんが、そうなっています。ハードウェアなのでロバストで速いです。Linuxのソフトで動くよりもはるかに高速です。それからハードウェアの論理値は小さいので、まぁまぁ良いものかなと(思っています)。

これにはLinuxもいりません。(スライドを示して)こいつ(Ros2アプリ)がC言語ソースになっているので「OSなしで行こうぜ」という感じでマルチスレッドのコントロールも全部ハードウェア化しました。

GnuPrologの高速化

話が変わりまして、GnuPrologの高速化はどんな感じでしょうか。LispやPrologはその言語の性質から動的に型チェックして、それに対応する手続きをディスパッチしています。これから逃れられる、完全にコンパイルできると高速になるんです。Lispはその可能性があるのですが、Prologはやはりなかなかコンパイルに難しい面があります。

ふだんはGnuPrologのWAM(Warren Abstract Machine)という仮想マシンに変換して、(スライドを示して)ここにコンパイルされていく。これを見ているとswitch_on_termというやつで1つ目の引数の型、つまり引数の下3bitを見て分岐しています。

これはCでやっていますが、機械語のネイティブコードにすると、ネイティブコードのルーチンはこんな感じになっています。下位3bitを見て8方向分岐をしています。

80x86で見ると、これはネイティブコードになっていますが、これは飛び先のアドレスをレジスタにパカパカっと入れて、サブルーチンを呼んで最後にそれをやるとそこのどれかに分岐するようになっています。(スライドを示して)ここでCALLとかサブルーチンコールとかしているし、何しとんねんという感じですね。80x86は中のCPUがすごく複雑なので、たぶんあまり遅くはありませんが、5段パイプラインのRISC-Vなんかはすごく素朴なのでこんなことをやっているとすごく時間がかかって仕方がありません。

実際にRISC-Vの64bitのGnuPrologも同じことをやっています。アドレスを積んでサブルーチンを呼んで飛びます。

じゃあレジスタ間接で飛べるようにしましょう。(スライドを示して)ここらのレジスタ、X5からX7レジスタに飛び先アドレスが入っていて、IREGをX28として、X28レジスタの内容が6になっているので、X6番レジスタを参照して、その中身0x400100を取り出してプログラムカウンタに入れてジャンプします。そういう命令を作ってもらいました。

これをやったせいで、FPGA版では最長パスが伸びてクロック周波数が下がったんですが、今作ろうとしているLSIだとここは最長パスになっておらず、この機構が本質的には、クロックスピードを遅くすることはないことがわかっています。

「CPU脳」な人類をパラダイムシフトする

これで最後ですね。一応CとかのHLS(High-Level Synthesis)、高位合成言語で書けるんですが、同時並列でバラバラにデータはアクセスされます。先ほど言ったチェックサムの計算は、データに同時並列でバラバラにアクセスできて、細粒度並列、データ並列度がすごく高まっているので1クロックでできます。

そういうところに気をつけると、ソフトをやっていた人が高級なハードを書けるようになります。そういうやり方で今はLSI作りを進めています。以上です。

司会者:ありがとうございました。13分ピッタリなので質問タイムはなしということで。というか、なんでこれをLTでやろうとしたんですか(笑)。

takeoka:これしかないので(笑)。

司会者:これはフルタイムでやってくださいよ(笑)。

takeoka:できあがったらまた長いほうで(笑)。

司会者:じゃあ次にお願いします。次回はフルタイムでお願いします。かなり興味深い。これをLTでやらないでくださいよっていう……(笑)。

takeoka:わかりました(笑)。

司会者:ありがとうございました。