System verilogでCPUの創りかたのTD4を実装してみる
やっぱり現代社会を生きる者としてRTLくらい書けないとヤバいなと思ったので、1カ月くらいかけてSystem Verilogを勉強した。誰かのために、ここに記録を残しておく。ちなみにこの記事の新規性はたぶんないと思います。(きっと車輪の再生産)
私のスペック
- 半導体回路設計についてはまあまあ詳しいはず
- RTLの原理は理解しているはず(デジタル回路の本は何冊か読んだことがある)
- コンピュータアーキテクチャ初心者(パタヘネ本を3周くらいしただけ)
- RTLを自分で書いたことはない
まとめ
- 今さらVerilog HDLとか時代遅れな気がするので、System verilogでRTLを書いてみる
- 無料界隈ではそれなりにメジャーらしいIcarus verilogというVerilog compiler & simulatorを使ってみる
- Windows 10のノートPCにLinux環境を立ち上げて、Linux環境で作業する
- 「CPUの創りかた」という本の4bit CPUをsystem verilogで実装する
Linux環境整備
まずはIcarus verilogが動く環境を作らないといけない。Windows版とLinux版があるんだけど、普段から使い慣れているLinux環境の方がストレスフリーだったのでLinux版で作業することにした。
ということで、WindowsマシンにLinux環境を作るところから始める。Linux環境の作り方は色々あるようなんだけど、Twitterのお兄さん達が教えてくれたWSLというやつをインストールしてみる。
WSLのインストールの仕方はテキトーにググってください。ちなみに私はWSL2(最新バージョンらしい)ってやつをインストールしました。Linuxは色々な種類があるんだけど、OS関係でハマりたくなかったので一番メジャーだと思われるUbuntuを選びました。
あとはX serverというやつがGUIアプリ(波形viewerとか)のために必要だったのでVcXsrvというやつをインストールした。詳細はテキトーにググってください。例えばこんな感じのサイトによくまとまっています。
Ubuntuのインストールが終わったらIcarus verilogをインストールしてみる。Linux版のインストール方法はIcarus verilogのホームページに書いてありました。ちなみに
$ sudo apt-get install verilog
だとIcarus verilogの最新版(ver.11)が落ちてこなかったので、テキトーにググってver.11を手動でインストールした。ちなみにver.11以降でないとsystem verilogのalways_ffが使えないようです。
System verilogの勉強
そもそもRTLを書いたことがなかったので、何冊か教科書を読んでみた。
そもそもSystem verilogもVerilog HDLもほとんど変わらないので、Verilog HDLの教科書でVerilogの基本を勉強した。この本は日本語&薄い本なので1日もあれば1周できるはず。やる気があれば、この本に書いてあるコードを自分で書いてシミュレーションを回してみると良いと思う。
私はVerilogのプロになるつもりもなかったので、実際にコードを書いてみて分からなかったら参照するみたいな使い方をした。
この本はそもそもコンピュータアーキテクチャの教科書なんだけど、コンピュータアーキテクチャの内容は微妙で(パタヘネ本の方が良かった)主にSystem Verilogのチュートリアル本として使った。System VerilogとVerilog HDLの違いがそれなりに良くまとまっている。
これらの教科書を読むだけだったら2日もあれば十分だと思う。
CPUの創りかた&TD4
System verilogの勉強用の題材として、例の「CPUの創りかた」という教科書に書いてるTD4という4bit CPUを実装してみることにした。CPUのデザイン自体は非常に簡素だったので、ほとんどの時間はSystem verilogに慣れる&実装のデバッグに費やしたと思う。
以下にTD4の構成図を示す。(実はこの全体構成図が本にはまとまっていなかったので、実装するときにちょっとだけ苦労した。)
実装するにあたって少し悩んだのがP241の'JNC Im'の真理値表の実装。P241にはxx1111って書いてあるんだけどC flagを実行後に必ず0にしたい(P240)なら111111にしないといけない気がする。実際の回路実装(P275)も111111になってるし。たとえば001111でレジスタAが1111だとほとんどの場合でC flagが1になる。ここは本の誤植だということにして111111で実装した。
以下に、完成版のソースコードをまとめておく。System Verilogを書くのは初めてなので色々とイケてないと思うが、将来の誰かのためにインターネットの海に放流しておきます。
作業量
せっかくなので、TD4が動くようになるまでにかかった時間をまとめておく
- 始めてから終わるまで: 1カ月(環境設定1日&週に2時間くらいの開発ペース)
- 真面目にやれば2-3日くらい?
- 教科書読みも2-3日くらいあれば十分だと思うので、私みたいな初心者でも1週間もあれば問題なくこなせる感じでした
感想&まとめ
- どうせなら論理合成からのP&Rまでやってテープアウト&実測するともっと理解が深まると思う
- 初めてのRTLだったけど、慣れればそこまで大変ではないかなという感想だった。真面目にやるなら、あと2-3プロジェクトくらいこなすと良い感じになると思う。
- RTLだとカウンタが2-3行くらいで記述できるのすごい