fjt7tdmi のノート

メモ帳みたいなもの

Chisel HDL で超簡単な CPU を書いた

筆不精でずっとブログを書いていませんでしたが、最近いろいろ生活が変わってきているので、これを機会にブログ執筆にリトライします。 というわけで、今回は Chisel で超簡単な CPU を書いてみた話。

知っている方も多いでしょうが、chisel は近年注目を集めているハードウェア記述言語です。 私は学生時代に SystemVerilog で CPU を書いていて、その後流行り始めた chisel をいじってみたいとずっと思っていたのですが、最近ようやく chisel を書き始めました。

Chisel に入門するときにやったこと

技書博で、だいにんぎょーさんの「Chisel を始めたい人に読んでほしい本」を買っていたので、とりあえずそれを読みました。今は booth で買えます。

これ一冊読めば chisel で簡単な CPU を書くくらいはできますが、公式にも目を通しておきたかったので、以下のページを読みました。

Chisel の資料と言えば、バークレーの方が書いた原著論文が引き合いに出されることが多かったですが、もうかなり古くなってしまったので chisel3 wiki とかを読んだ方が良いです。

作ったプロセッサの構成

ごく単純な In-Order スカラ・プロセッサを作りました。いわゆる MIPS 5段パイプラインみたいなやつです。(私が作った他の CPU に合わせたため、パイプラインは5段ではありませんが) 命令セットは RV64I のみを実装しており、riscv-tests の fence 以外のテストが通ることを確認しています。 一応ソースコードは public にしていますが、正直他の人に参考にしてもらうレベルではないかな…まあ、これからがんばります。

他人のコードを読む方法

最近、他人が書いたコードを読む機会が増えてきました。
何万行もある未知のコードをどう読み解いて行くのか、自分の中で方法論が出来てきたように思うので、メモっておきます。

コードを読む目的を明確にする

一番大事なのは、「何を知りたいのか」ということを明確にした上でコードを読むことです。適切な目的を持たずにコードを読んでいると、途中で興味を持つポイントがどんどん変わって行って、何を調べていたんだかわからなくなるということが起こります。そんなことをしていてはいつまでもコードを読む作業が終わりません。短時間でコードを読み終えるためには、コードを読む目的を明確にしたうえで、その目的を達成することに集中する必要があります。

 

私がよく設定する目的は、

  • 自分は○○という機能を実装したいので、それに必要な API について調べる
  • とにかくコードの全体像を知りたいので、モジュールの機能を全てリストアップする

などです。

 

メモをする

コードを読んで行く際は、必ずメモをとるようにしましょう。コードを読むときにやりがちなのが、IDE やエディタで適当に関数の定義を追っていくという、ネットサーフィン的なやり方です。しかし、これでは何のためにコードを調べていたのか/何がわかったのかが、すぐに頭から抜けてしまいます。

 

前節で「コードを読む目的を明確化しろ」と書きましたが、「目的」は必ず目立つ場所に書いておきましょう。そして、コードを読む際は定期的にそれを見るようにしましょう。これにより、本来の目的を忘れて単にコードを眺めている状態に陥るのを防ぐことができます。

 

また、コードを読んでわかったことも、必ずメモを取るようにしましょう。どんなに綺麗に書かれているコードでも、「(コードを読んでいる)今の自分の目的に合わせて整理されている」ということはあり得ません。自分にとって大事なことがわかったら、忘れないうちにメモをとるようにしましょう。

 

メモを取る道具は何でもいいです。私はプログラマの癖にアナログな人間なのでペンとノートを使いますが、エディタでもブログでも良いので、自分の使いやすいものを選びましょう。

 

つまり、頭を使って手を動かせということ

コードを読むのは、コードを書くよりはるかに頭を使う作業です。コードを書いている時は、プログラムを実行すればフィードバックを得られるので、「作業の進捗度」や「現状の問題点」を比較的容易に知ることができます。しかし、コードを読むときはそうはいきません。コードを理解できたか判断できるのは自分しかおらず、「作業の進捗度(どこまでわかったか)」や「現状の問題点(何が分かってないのか)」を知ることは簡単ではありません。

 

難しいことをするときは、それなりの作戦を立てなければなりません。「コードを読む目的を明確化する」のは、その作戦の最初にして最も重要なステップです。

 

頭を使う作業を行うときは、手も一緒に動かした方が効率が上がります。私がコードを読む際に「メモを取る」のは、あまりに難しくてメモを取らんとやってられんからです。