Kindleの半額セールを眺めてて見つけた本。 VerilogとかでMIPSを作っていく、という題材で、プロセッサを勉強する、という本。FPGAで動きそうだし、作りながら勉強出来たらいいな。

1章 2進数とかゲートとか

1.5の2進数とかゲートくらいまでは別段見る所は無い。

1.6のゲートの実現周りは物理的な特性の話とか出てくるので一応真面目に読む。

1.7は半導体の話。nMOSとかpMOSの話はこれまでの人生で何度も読んでるはずだが毎回わすれてるので、きっと身につかない気はする。

一章、たぶん要らない割には結構読むのに時間が掛かった。 こういうの、あんまり詳しくないので出てくる都度真面目に読んでしまうが、効率という点では飛ばした方がいいんだろうなぁ。

ただpMOSとnMOSの話はそれなりに勉強になった気もするので、読んで無駄だったという気もしない。

2章 組み合わせ回路とかブール代数とか

組み合わせ回路(タイミングが無い奴)も本題からすると要らなさそうなので飛ばして良いと思うのだが、 この辺もそんなにしっかりマスターしてる訳じゃないのでつい真面目に読んでしまう。

例題 2.10 デジタル表示のカルノーマップ

例題 2.10は暗算で解け無さそうなのでメモをここに書く。 表2.6からカルノーマップを書こう。

まずはSa。

images/2019-09-09-000435/0000.png

これを2のべき乗となるなるべく大きな丸でくくる。

images/2019-09-09-000435/0001.png

この図から読み取ると以下か?

images/2019-09-09-000435/0002.png

合ってそう。他はまぁいいだろう。

3章 順序回路

このへんまでは以前デジタル回路の本でやったはずなので、ガンガン進めてとっとと4章に入りたい。

3.2 ラッチとフリップフロップ

サクサク進んだところ、フリップフロップのあたりで分からない言葉がちょこちょこ出てくるので2章の該当箇所を見直し。

  • 伝送ゲート
  • バッファ
  • トライステートバッファ
  • アクティブHigh とバー

1章や2章は飛ばそうか悩んだが、軽く読んでおいて良かったな。

例題3.6 N進カウンタ

まずはバイナリ表現。

images/2019-09-09-000435/0003.jpg

答えを見るとS0とS1が逆だが、これはどちらでも良かろう。 S1’にS1バーがかかってる所が違うな。これ要らない気がするが。

とりあえず次のワンホットをやるか。

images/2019-09-09-000435/0004.jpg

例題3.9 回路からFSMの導出

練習の為やってみる。 S1がアンロックと言ってるから、これが1になればいいのかな。

まずは状態表を書く。 全通り書こうとしたら16通りくらいあって辛いので、ちょっとサボれないか考える。

1つ目のANDは、A0かA1バーならdon’t careだな。この辺に着目してさぼれる所はさぼるか。

images/2019-09-09-000435/0005.jpg

この表を眺めつつ状態遷移図を描く。

images/2019-09-09-000435/0006.jpg

つまり11を入れてから01を入れると開く訳だな。

回答を見ると、出力表の所がじぶんの手順には無いな。 S1と一致してるから必要性は感じないが、正しい手順という点では作るべきだったか。

まぁこの辺は今後必要ならやる機会はあるだろうからこの位で良かろう。

3章後半は読むだけ

タイミング分析とかは軽く頭の中でやってみて少し間違えてたが結果は納得した、くらいで先に進む。 この手のはちゃんとマスターしようと思えばいくつか練習問題をやらないとダメそうだが、どうせあんま使わんだろう、という事で。

必要になったら戻ってきてちゃんとやる(ゆとり)

4章 ハードウェア記述言語

ようやく本題の4章まで来た! 少し最初の方を読んだが、やはり動かす環境が欲しいな。 とりあえず手元のFPGAを動かしてみるのが先か。

FPGA環境設定

本はAltera前提だが、別のFPGAを借りれたので自分はこれで行く。 まずはツールをダウンロード。

Xilinxのツールを使う、との事なので、vivadoのwebpack版というのをダウンロードした。

次にツールの使い方をググって、ここを見つける。

Getting Started with Vivado

だいたいはこれに従うのだが、xdcファイルの所だけ具体的なボードによるので、そこだけ自分でやる。 xdcの該当する行をコメントアウトして使う。

get_portsの後にある変数名がverilog側でPort Nameとして指定できる。

という事でハードの人にいろいろ質問しつつLチカに成功!ご協力感謝。

4章を一通り読んで

手を動かそうと思ったが、どれも動作自体はみれば分かる例が多く、読むだけで最後まで辿り着いてしまった。 ただ理解出来たという感じでも無い。

Verilogの難しさというのは、たぶん記述とやってることの遠さにある気がする。 書かれている事の挙動は普通のプログラマなら見れば分かるが、「そう書かないといけない理由」がわからない。 何か実現したい事に対して、ハードウェア的に可能な形に変形する、という過程があって、その結果を記述していると思うのだよなぁ。

という事で正解を見てもいまいち重要なところを学べていない。 どうしよっかなぁ。 演習問題をやってみるか。

なお、途中からVHDLは見ずにSystem Verilogの方だけ見てた。 VHDLは記述がだる過ぎる。

5章一通り読み終わり

ちょっとPCの前に居ない事が多かったので、読むだけ先に読み進めていて、さきほど5章が読み終わった。 5章はALU、浮動小数点数(足し算のみ)、カウンタ、SRAM、DRAM、ロジックアレイという感じの内容。

5章の内容は、半分以上は昔どこかで読んだ事あるものが多いので、お話としてはこんなのあったな、くらいで読める。 ちゃんと理解出来てるという気もしないが、この辺は内容をざっと理解した上で実際にVerilog書きながら覚えていきたいのでまずはこの位でいいかな。

昔読んだ時はぼんやりとした理解だったが、今回は前よりはちゃんと理解出来た気がする。二回目か三回目か覚えてないが反復した結果、理解度が上がってるっぽい。

FPGAのあたりは初めて見る気がする。あまり理解出来た気はしないのでそのうちまたちゃんと勉強する機会が欲しいな。

6章も一通り読んだ

最後のx86は飛ばしたし、読まなくても分かるC言語のコードをどうアセンブルするか、みたいなのは飛ばしたが、ニモニックとかは一通り見ておいた。 mipsこんな感じか。 なんか昔みたことあるなぁ。どこだったか思い出せないが。 この上の16bitにロードしてorするの、なんか記憶にある。WinCEか?忘れた。まぁいい。

だいたいmipsがどういうアーキテクチャかも分かったのであとは実装するだけだな。

System Verilogを書いていくポストを作る

理屈は理解した、という事で実際に書いていきたい。 取りあえず4章の演習問題を幾つか解いてみて感じをつかみ、その後の進め方を決めたいな。

PCから書く方がいいな。ページ分けるか。

System Verilogを書くぞ!

7章 マイクロアーキテクチャ

Verilogは別ポストにしたので、こちらは本を読んでいく感想を書いていこう。

今はlwとswの実装を読んでいるが面白いな。

昔パタヘネとかで読んだ記憶があるのだが、当時は今よりデシタル回路の理解度が低くて、ゲートのあたりからつながって理解出来る感じが無かった。

今回はデジタル回路レベルで構成要素は割と理解出来ているし、Verilogでの書き方も想像出来るので、なんか「ちゃんと分かった!」という気分になる。

この手のプロセッサの接続みたいな図、これまでの人生でもたくさん見てきたが、作る側の視点にたって一つずつ組み立てて行くのは、ただ仕様を調べるために見るのとはまた違った感動があるな。 プロセッサづくりの楽しさを知った。

パイブラインまで実装した

詳細は上記のVerilog関連の方のポストに書いたが、7章は単一サイクルと5段パイブラインだけ実装して、マルチサイクルは読むだけにしておいた。

パイプラインのストール処理はなかなか複雑で本当にあってるかは良く分からないが、本に載ってたテストアセンブリは動いている。

ここまでやればこの本に載ってる事の主な部分は一通りこなした、と言って良いんじゃないかな。

8章 I/O

I/Oはさらっと見た所お話程度で、あまりちゃんとFPGAで実装出来る感じには書かれていない。 実習的な教材としては7章までがメインで8章は付録っほい扱いだな。

キャッシュのあたりは一通り真面目に読む。 知らない事は無いが忘れている部分は多いのでこの機会に復習。

疑似LRUの実装方法はこれでは良く分からないな。Uとnewの2つのカテゴリにする、と言っているが、newの側をUにするのはどのタイミングなのだろうか? いつもnewは一つとするなら新しいブロックを入れる時に付け替えればいいが、、、 2-wayは実装出来るくらいは理解出来た。

仮想メモリは飛ばす。この本はPCの話を前提にしてる所が多いよなぁ。 tlbとかの話だが、DRAMとの接続の話が無いのでこの辺は試せないのだよな(上記のキャッシュも)。

SPIとかは軽く眺める程度。この辺は仕事で触ってたのでまぁまぁ詳しい。 結構詳しく書かれていて驚く。ただこれだけ書かれても試せないよなぁ。 まぁ8章はあくまで頭に一度入れておく程度の位置づけか。 この無駄に詳しいRS-232の説明の代わりにDDRをもっと詳しく説明した方がいいと思うんだがなぁ。

そもそも8章はPIC32という既製品での解説で、自分で作る話じゃないのだよな。ちょっと本書の他の章とずれてる気がする。

VGAは面白そうなので真面目に読んだら、最後の所でDACを使ってるので、 A/DコンバータとDACも真面目に読む事に。 昔仕事でADCがついてたが動かし方が分からずFPGAで同じ事させてごまかしてた、という事があり、あの時この辺ちゃんと使えたら良かったのになぁ、という気にはなるな。もう一度そういう機会があるかは怪しいが。

何故かVGAだけちゃんとVerilogの部分が書かれていて、PLLとかの設定もやってる。そうそう、これが無いとね。 何故かモジュールのインスタンシエートの所でここまで解説してないシンタックスの書き方を使ってるが…(この章はやはり別の人に書かせたんじゃないか疑惑)。

sync_bはなんぞや?と思うと、画面を書き終わって一番左上に戻る時のsyncか。

HFPは水平のフロントポーチ、BPはバック・ポーチか。

一通りVerilogコードを理解した。VGAはコントローラ自作出来そうなくらいは理解出来た気がする。

本の感想: なかなか良い演習書だと思う

Verilogでプロセッサを書こう、という人にはとても良い本だったと思う。

初めて学ぶ時にこれで良いかは分からないが、どこかで理屈を一応は読んだがあまりちゃんと理解出来た感じでは無いな〜、という程度の普通のプログラマが、ここらでちゃんと勉強するか!と思って読むには良く書けている。

忘れてる事を思い出す程度には十分なくらい解説があるし、あまり不要な回路周りの説明が長くない。

自分にとってはC言語とアセンブリの対応とか不要なものも多く、マシン語とアセンブリの対応などももっとコンパクトにまとまった表とかで短く書いてくれる方が使いやすいが、この辺は知らない人向けの話なので評価はそれらの人たちに任せる。

7章までの内容はなかなか良く、 ちゃんとパイプラインのmipsを独習で作れた。 Verilogはほぼ素人という状態で始めたが、ちゃんと最後には一通り理解して自分で書けた。 Verilogの勉強をしよう、という時の良い入門書になってると思う。 ここからはリファレンスだけでいいかなぁ。

本文だけだとパイプラインの実装はやや厳しいが、演習問題の回答のpdfに回路図があるので、それを参考にすればちゃんと書ける。 演習の回答は奇数番しか(一般の人には)公開されてないが、割としっかり書かれているのでかなり役に立つ。

Vivadoなどの説明はハード屋の友達に質問したりして進めたので多少の詳しい人のヘルプは欲しいが、ちょっと聞く程度で乗り越えられる範囲とは思う。

本書はやはり実際に書いて動かさないとありがたみが無い。 しかもちょっと解説が答えになってしまってる所もあるので、適度に読まずに自分で図を描いたりしないと写経になりがちに思う。

だがそのへんは自分で判断出来るので、適度に読まずに自分で作って、結果を答えと見合わせたり分からない所をちょっとカンニングしたりして進めるのにちょうど良い。

読むだけだとパタヘネの方が良いと思う。 やはり本書は実際に作る際の手引として使うのが良い。 そしてVerilogはやっぱ書いてデバッグしてみないと良く分からない事が多いので、この辺勉強したい人はぜひ作ってみた方が良い。 そういう点でこの本はなかなかオススメである。

この本はプロセッサを作る所まででほぼ終わってて、8章のキャッシュなどの解説はいまいちに思う。 そして7章までだと、DRAMが弱い。

DDRのバーストモードとか全然書いてないので、 実際のシステムにプロセッサを組み込むには足りない事は結構ある。

そういう点では教養レベルでプロセッサを作る事を学ぶのにちょうど良いが、そこまでの内容しか無い、というのは目次からはちょっと予想出来なかった事だ。 ただそういう物だ、と最初から思えば良い本だと思う。

あとPCを前提としすぎてて、スマホとかの基本的構成とか最近のGPUで機械学習の計算ぶん回す時代とはちょっとずれてて、少し古い気はする。 今風にアレンジしても書けるんじゃないかなぁ、と思うが、まぁ学生の勉強としてはまずPCを理解する事かなぁ、とも思うので、これはそういうものかもしれない。

そういう訳で、手を動かさないといまいちな本だが、手を動かす前提ではかなり良く書けていたし、手は動かすべきと思う。だからこの本はプロセッサ設計を学ぶには良い本だと思う。

追記: 実際に別の物を作る時も有用だった

その後SIMTに拡張していろいろ大きく変えた物を作ってみたのだが、何度も本書のいろいろな所を見直す事になった。 演習書としてだけじゃなくて、終わったあとに手元に置いて参照するにもなかなか良かった。

ただ非同期な話とかFIFOとか必要な物が幾つか欠けているので、参照用途には不足は感じる。 ただ最初にあるき出すのに必要な程度にはいろいろ載ってるので役割は果たしていると思う。

なかなか良い本なんじゃないかな、これ。