ディジタル回路設計とコンピュータアーキテクチャを読んだ

意を決して「ディジタル回路設計とコンピュータアーキテクチャ」を読んだ。原作著者であるSarah L. Harris、David Money Harrisの名前から、「ハリス本」と呼ばれている。

モチベーション

  • HDLとコンピュータ設計の架け橋となる本を読みたい。
  • いわゆるソフトとハードの境目を学びたい
  • こんな分厚い本読むなら社会人になる前の今しかないやろ。

どんな本?

672ページもあるこの本を通して何を学ぶことができるのか。翔泳社の紹介ページより引用すると、

コンピュータ科学を学ぶ際、心臓部であるマイクロプロセッサの

構造(アーキテクチャ)を理解することは避けては通れない道ですが、

マイクロプロセッサを自ら作成することにより、その理解をより一層

進めることができます。

https://www.shoeisha.co.jp/book/detail/9784798147529

まさにこの説明に尽きるのだが、ディジタル回路の基礎から、最終的にはマイクロプロセッサを設計してHDL(ハードウェア記述言語)で実装していく流れとなっている。現在発売されている第二版では、System VerilogとVHDLが採用されている。

私自身は大学の授業で、ディジタル回路や半導体デバイス、情報理論の授業は受けていたものの、それらの”つながり”をイメージすることができていなかった。本書ではそれら全てからマイクロプロセッサの設計までの関連性を、各章を通して一気通貫で学ぶことができるというところが特徴ではないだろうか。

また、他にも素晴らしい点として豊富な練習問題が挙げられる。ただの読書では終わらずに、自分の目的や重点的に学びたい要素に合わせて適宜例題や練習問題を解き、HDLの実装を進めていけば良いのだ。

「ディジタル回路設計とコンピュータアーキテクチャ」には、本書を通して実装する命令セットアーキテクチャ(ISA: Instruction Set Architecture)の異なる「MIPS版」と「ARM版」が存在する。ISAというのは簡単に言うと、コンピュータがどのように機械語を解釈するかの仕様を定めたものである。ISAに沿ってコンピュータが計算を実行できるように、プロセッサの回路的な構造(マイクロアーキテクチャ)が設計される。

どちらを選ぶのかは各人の好みであるが、オープンソース的であるRISC-Vの世界を学びたいと勝手に思っている私としては、MIPSは設計者が同じ流れを組んでいるため設計思想が近しいこと(ARMの方が若干CISC的?)、そして何よりも翔泳社の電子書籍セールで半額だった(ARM版は出版社が異なる)ことから「MIPS版」を選択した。

さらに付け加えるのであれば、電子書籍版をおすすめする。パソコンとタブレットさえあればどこにでも持参して勉強できるからだ。物理版だと持ち運びがしんどいし、本を開いて勉強するのにエネルギーがいる(個人的見解)。その証拠として我が家の「パタ&ヘネ」は漬物石と化している。

私なりの各バージョンのメリットをあげるので参考にして欲しい。

  • ARM版:組み込み、スマホ等で標準的に用いられているISAである。
  • MIPS版:「パタ&ヘネ」で取り扱われている。RISC-Vと関係性が深い?
  • 物理本:圧倒的達成感、存在感。所有欲が満たされる。
  • 電子本:物理的に軽い。

読み進め方

基礎的なディジタル回路や情報理論については授業でも触れたことがあるので、思い出すために本文はちゃんと読んだが、練習問題は各章の中でも小テーマごとに1~2問ずつくらいのペースで解いた。知らなかった事項についてはノートに書き殴りながら読み進めた。これは、きれいにまとめることを目的にしていたのではなく、私が手を動かしながら勉強した方が理解しやすいタイプだから採用しただけである。また、HDLの勉強も兼ねたかったので、HDLの実装パートではSystem Verilogを用いて、コードリーディングだけではなく自分でも実装するようにした。

各章レビュー

ここからは各章ごとに概要や思ったことをキーワードと合わせて振り返っていく。

1 ゼロからイチへ

複雑な事象をどのように扱いやすくするのか(抽象化、規格化)、アナログからデジタル量に抽象化させることによってどのようないいことがあるのかについておさらいする。その後、デジタルにおける数字の扱われ方(2進数)、それをどのように物理的に表現するか(論理ゲート、CMOSトランジスタ)を学ぶ。基本的に学部時代の授業のおさらいなのでささっと進めたかったが、論理ゲートをCMOSを使った回路図に書き起こすところが不安だったのでゆっくり読んだ。

キーワード

  • ディジタルによる抽象化、規格化
  • 数の体系(2進,16進)
  • 論理ゲート
  • CMOSによる論理ゲートの構築

2 組み合わせ回路設計

学部時代の情報理論の授業なんかを思い出しながら復習。真理値表からカルノーマップを書き起こして、論理ゲートを使って構築するところまでの流れを学ぶ。MUX(マルチプレクサ)やデコーダの仕様から真理値表を作って、論理ゲートで記述するところがイメージを掴みやすくてよかった。グリッチ(ハザード)の発生についても起こりうる回路を図示してくれている。タイミング解析は重要なんだなあ。

キーワード

  • エレメントとノード
  • MUXやデコーダ→ビルディングブロック
  • 伝搬遅延と誘起遅延
  • クリティカルパスとショートパス
  • グリッチの回避とハードウェアコスト

3 順序回路設計

大学の授業の時もそうだったが、ディジタル回路の中でも組み合わせ回路よりも、順序回路の方が役割がイメージしづらくて苦手である。フリップフロップ単体で見ても状態を保持しているだけで何のためにいるの?って思っていた。とりあえずこういうものだと思って読み進めれば、後々のアーキテクチャの章でどのように使われているかがわかるので大丈夫。

あとは、有限状態マシンの中でもMooreマシンとMealyマシンの違いというのが概要だけだと中々理解できていなかったが、状態遷移図や回路図を示して比較されていたのでとても分かりやすかった。今後FPGAに有限状態マシンをHDLで実装する時は、どちらのモデルを使っているのか意識的に選択できるようになりたい。

キーワード

  • フリップフロップ
  • 同期式回路設計
  • 有限状態マシン

4 ハードウェア記述言語

Verilog HDLについてはトラ技SPECIALの「わかるVerilog HDL入門」で少し勉強していたので、この章ではSystem VerilogとVerilog HDLの違いに少し気を付けながら、結構足早に読み進めた。登場した各ディジタル回路はちゃんと一通りSystem Verilogで実装するようにした。波形の確認のために本書ではModelSimが使われていたが、私はIcarus Verilogとgtkwaveのシミュレーション環境を用いてコーディングした。組み合わせ回路や順序回路を論理ゲートで構築しようとするとすごく複雑になるのに、HDLだとこんなシンプルな記述でいいのか、と毎度思ってしまう。

キーワード

  • ディジタル回路のHDL実装

5 ディジタルビルディングブロック

ここまで学んできた組み合わせ回路や順序回路を用いて、コンピュータの設計で用いられる算術演算回路やカウンタ、シフトレジスタ、メモリアレイなどのディジタルビルディングブロックの仕組みをHDLによる実装例と共に学ぶことができる。AND ORといった論理ゲートと算術演算回路などの繋がりが徐々にわかって来るので楽しい。またメモリについてもここで一度学ぶ。

キーワード

  • 算術演算回路
  • 小数点表現
  • メモリアレイ
  • メモリのHDL記述

6 アーキテクチャ

この章では今までと違いソフトウェアの観点からコンピュータアーキテクチャを俯瞰する。Cのような高水準言語がどのように機械語に翻訳されるのか、そしてMIPSアーキテクチャの命令セットを学びながら、どのように機械語を演算処理に変換させるのかを理解できるようになる。この辺りから、まさにコンピュータのソフトウェア的側面とハードウェア的側面の”つながり”が見えてくるのでとてもワクワクしながら読み進めることができた。そして商用として一番普及しているx86アーキテクチャと比較しながらMIPSアーキテクチャがいかに美しいかを知ることができる。

キーワード

  • 高水準言語
  • アセンブリ
  • 命令セット
  • MIPSアーキテクチャ
  • x86アーキテクチャ

7 CPU実装

ここが一番楽しい。ここのために今までがんばってきたと言える。いよいよMIPSアーキテクチャを回路的に実装していくための手段を学ぶ。プロセッサの性能解析の方法を理論的に学びながら、単一サイクルプロセッサ、マルチサイクルプロセッサ、パイプラインプロセッサの性能の違い、そして先端のマイクロアーキテクチャではどのような手段で性能を向上させているのかを知ることができる。またSystem Verilogで単一サイクルプロセッサの実装をしていく。いきなりマイクロアーキテクチャの全貌を見せつけられるのではなく、ISAを元に、一つずつのビルディングブロックを順番に組み合わせていく流れを、設計者の思考と共に示してくれるので、理解しながら実装していけばいつの間にかプロセッサを完成させることができる。楽しい。

またプロセッサの性能を向上させるための努力を学べるので、商用CPUのスペックとして示されている様々なキーワードの本質がわかるようになる。次に自作PCのCPUを変えたくなった時は、今までよりもより深く吟味できるようになりそう(な気がする)。

キーワード

  • プロセッサの設計
  • パイプライン、ハザード
  • 先進的マイクロアーキテクチャ
  • 分岐予測
  • マルチスレッディング
  • ホモ / ヘテロジーニアスマルチプロセッサ

8 メモリシステムとI/Oシステム

コンピュータの性能は、プロセッサのアーキテクチャだけではなくコンピュータのメモリシステムによって決まる。第8章ではプロセッサがメモリからどのようにして早くデータを入手することができるようにするのか、プリンターやキーボードなどのI/Oシステムとどのようにやりとりをするのかといった、プロセッサと外部システムとのやりとりについて学ぶことができる。キャッシュの部分は一通り読んだのだが、中々複雑でイメージしづらかったので、もう一度読み直さないといけないなと考えている。また、大学1年の時に購入した自作PCを逃げ腰のBTO(Build To Order)にしてしまった私にとっては、マザーボードに搭載されている様々なI/Oプロトコルについて、それぞれどのような特徴を有しているのか学ぶことができて非常によかった。

キーワード

  • キャッシュ
  • アドレス変換
  • I/Oシステム

まとめ

ディジタル回路の回路図や、マイクロアーキテクチャの構成図に対して一定の耐性がついたことが何よりも嬉しい。読み進めるには中々エネルギーの必要な量であるが、半導体レベルから徐々にレイヤを上げながら、コンピュータアーキテクチャをハードウェア的側面から学ぶ経験は中々他の本ではできないのではないだろうか(だからこそこの厚みなのである)。また自作CPU系の技術同人誌を執筆されている方や、twitterで見かけるつよつよエンジニア、つよつよ大学生の先輩方がおおよそ読んでいる本なので、そういった方々と少しでも共通のコンテクストを得られるという意味でも本書にチャレンジする価値はあるのではないだろうか。

次にやりたいこと

本書ではHDLを用いてマイクロプロセッサを実装することができたので、次はFPGA(Field-Programmable Gate Array)上にマイクロプロセッサを実装することに挑戦したい。あるいはICを使ったCPU自作(CPUの創り方というバイブルは入手済)やRISC原典を読む。レイヤを上げてOS自作入門やコンパイラ入門なんかも面白いかも。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です