うぱ@エンジニアの日記

キラキラアメリカ生活

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というやつをインストールした。詳細はテキトーにググってください。例えばこんな感じのサイトによくまとまっています。

www.atmarkit.co.jp

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 verilogVerilog HDLもほとんど変わらないので、Verilog HDLの教科書でVerilogの基本を勉強した。この本は日本語&薄い本なので1日もあれば1周できるはず。やる気があれば、この本に書いてあるコードを自分で書いてシミュレーションを回してみると良いと思う。

私はVerilogのプロになるつもりもなかったので、実際にコードを書いてみて分からなかったら参照するみたいな使い方をした。

  

 この本はそもそもコンピュータアーキテクチャの教科書なんだけど、コンピュータアーキテクチャの内容は微妙で(パタヘネ本の方が良かった)主にSystem Verilogチュートリアル本として使った。System VerilogVerilog HDLの違いがそれなりに良くまとまっている。

これらの教科書を読むだけだったら2日もあれば十分だと思う。

 

CPUの創りかた&TD4 

System verilogの勉強用の題材として、例の「CPUの創りかた」という教科書に書いてるTD4という4bit CPUを実装してみることにした。CPUのデザイン自体は非常に簡素だったので、ほとんどの時間はSystem verilogに慣れる&実装のデバッグに費やしたと思う。

以下にTD4の構成図を示す。(実はこの全体構成図が本にはまとまっていなかったので、実装するときにちょっとだけ苦労した。)

f:id:upa_engineering:20210706091600p:plain

TD4の全体構成図

実装するにあたって少し悩んだのがP241の'JNC Im'の真理値表の実装。P241にはxx1111って書いてあるんだけどC flagを実行後に必ず0にしたい(P240)なら111111にしないといけない気がする。実際の回路実装(P275)も111111になってるし。たとえば001111でレジスタAが1111だとほとんどの場合でC flagが1になる。ここは本の誤植だということにして111111で実装した。

 

以下に、完成版のソースコードをまとめておく。System Verilogを書くのは初めてなので色々とイケてないと思うが、将来の誰かのためにインターネットの海に放流しておきます。

github.com

 

作業量

せっかくなので、TD4が動くようになるまでにかかった時間をまとめておく

  • 始めてから終わるまで: 1カ月(環境設定1日&週に2時間くらいの開発ペース)
  • 真面目にやれば2-3日くらい?
  • 教科書読みも2-3日くらいあれば十分だと思うので、私みたいな初心者でも1週間もあれば問題なくこなせる感じでした

 

感想&まとめ

  • どうせなら論理合成からのP&Rまでやってテープアウト&実測するともっと理解が深まると思う
  • 初めてのRTLだったけど、慣れればそこまで大変ではないかなという感想だった。真面目にやるなら、あと2-3プロジェクトくらいこなすと良い感じになると思う。
  • RTLだとカウンタが2-3行くらいで記述できるのすごい