動かしてわかるCPUの作り方 第10講
第10講 パイプライン処理により高速化する
いよいよ最終章。そのまえに、GHDLのシミュレションでWarningが出ている。不定値を整数に変換するところで出ていること、実際の入力もそうなっているところまでは検証できた。気になって色々模索したが、原因の特定には至らなかった。おそらく、ROM/RAMのアドレスが不定になっていて、電源投入直後のリセットが同期式のためにしばらくリセットできないことが関係していそうである。ModelSIMだと問題ないのだろうか。
パイプライン化によるハザード解消のために、NOP命令が追加される。NOP命令追加は2段階ある。まずは、CPU_emulatorに立ち戻って対応し、さらに機械語を生成した。その後、VHDLの実行ユニットでも対応した。さらに、ハザードの生成を検出してフラグを立て、2ステージ何もしない状況を追加した。
実装時には、ハザード解消のために2ステージ実行するときに、プログラムカウンタはインクリメントする理由がよく分からなかった。波形を見ながら動作を追った結果、理解できた。実行ユニットでは2ステップの間何もしないが、命令フェッチとデコードは新しいプログラムカウンタで処理しなければならない、というだけのことであった。さらにいうと、後段のRAMへの書き込みも無効になっているので、何も起きないことになった。
シミュレーションの結果、RAMへの書き込みが上手くなされず、出力値が出ていない事に気がついた。書き込みフラグが立っていないところまで突き止めて、ソースに戻って確認した。遅延させたアドレスを見ておらず、変なアドレスに書き込んでいることが判明した。だんだんデバッグも分かってきた気がする。
ところで、書籍の完成度が終盤になるほど低下しているのが気になった。コード変更箇所を赤くするという方針が、守られていないところや一貫していないところがある。いくつかは気がついたのだが、1箇所は見落として上記のバグを作り込んでしまった。
感想
本書籍は、4ステージパイプラインにすることを前提として、最初から最後まで天下り的に設計が提示される。かなり分かった気になれるが、どうしてこうするのが良いのか、といった深い部分の理解は難しそうである。CPUはある意味教育用として枯れた題材なので、そういうものでも良いのかもしれない。
動かしてわかるCPUの作り方 第9講
第9講 プログラムを独立化しメモリを実装する
Quartusを前提とした内容になるため、GHDLで検証するのはやや面倒になってきた。Alteraライブラリを導入すればシミュレーションが可能であることまで確認できた。一方で、タイミングシミュレーションは完全にお手上げになる。
Alteraライブラリについては、Githubから借用した。GHDLでコンパイルしてやれば、altera_mfも普通に使えることが分かった。もちろんテストベンチを書いてシミュレーションもできる。ただ、ROMデータ作成のツールはなく、自動生成されるコードもないので、書籍を参考に写経することになった。
ROMの導入については特に違和感もなく、理解も出来たと思う。気まぐれにaltera_mf.vのaltsyncramを読んでみた。言語を知るにはライブラリを読んでみるのがおすすめという話もあるので。mifという独自フォーマットだけではなく、Intel HEXフォーマットにも対応している模様。ただ、それよりも驚いたのは、VHDLとしてバリバリにフォーマット解析をしているところ。こんなに記述能力が高かったのか。依然として回路設計としてはひたすら配線を手打ちさせらている印象しか持てないのだが、ことシミュレーションについてはかなり柔軟にできそう。
RAMの導入は2段階になっている。前半は、二重に持っていたRAMの実態を、一つにまとめること。その代わり、読み込みと書き込みの2種類のタイミングを考慮できるように、設計をやり直している。機械語を読みだした後に、機械語に含まれるRAMのアドレス(即値)が確定するので、デコードステージでRAMから読み出せば良いということらしい。ところで、RAMのテストベンチをシミュレーションしたところ、RAMに記録されずに入力がそのまま出力に出てくるような波形になっていた。書き込み信号線を考慮するのを失念していたようで、コードを見比べたらすぐに判明した。
ROMとRAM前半を一旦CPUに組み込んでみた。といっても、実機がないのでCPUそのものではなく、CPUテストベンチに組み込んだ。そして、シミュレーション。特に問題なさそうである。
RAMの導入の後半は、AlteraのRAMライブラリを使う。アドレスを指定するバスが読み書きで異なるが、実態は一つであるため、書き込みのタイミングを再検討する必要がある。ところで、RAMへの書き込みを指示する信号は、ライトバックフェーズになった直後に無効になるのだが、なぜこれで安定してRAMへ書けるのかよく分からない。
FFにはセットアップ時間とホールド時間があるのだが、回路遅延に対してホールド時間は無視できるレベルぐらい小さい模様。おそらく、基準クロックのゆらぎは回路遅延よりも更に小さいのだろう(要出典)。概ね理解できた気がする。
動かしてわかるCPUの作り方 第7、8講
第7講 VHDL を用いてCPU を設計する
パタヘネに比べて、この設計に至る過程がかなり省略されている。そういうコンセプトではあるのだが、一読するだけではどこまで理解が得られるのだろうか。逆に、ある程度理解しているところなので、それほど難しい点はない。
VHDLの実装だが、ひたすら写経して、それが終わった時点でかなりの満足感を味わえた。GHDLのコンパイルがものすごく早いので、そのストレスはなかった。また、エラーメッセージも比較的的確なので、修正もサクサク進んだ。
書籍通りに進めると、CPUのテストベンチも例が提示されている。これをつかって、引き続きGHDLでシミュレーション&GTKWaveで波形を表示した。
あれ、なんかプログラムカウンタが早い段階で停止している。何か間違っていることは分かったが、どうやってデバッグすれば良いのか分からず、途方に暮れた。以下は、私がたどったデバッグ手順。PCからすると、JE命令で意図せずPCが上書きされているらしい。JE命令は比較結果を保持するCMP_FLAGで判断しているので、これを表示してみる。しばらく有効にならないはずなのに、有効になっている。ここで、ALUを実装しているexec.vhdの該当する命令の記述を確認するも、特におかしなところはない。となると、その手前のCMP命令が怪しいのかも。ALUに入力されるREG_AとREG_Bの波形を見ると、たしかに同値になっている。CMP命令の実装は正しいようだが、そもそもREG_AとREG_Bが同値になること自体が意図していない。cpu15_btのレジスタまわりの接続を確認していると、REG_Bを指定する第2オペランドが、第1オペランドと同じになっている!というわけで、ここを修正して、再度シミュレーションを動かしてみる。外部メモリに相当するIO65_OUTを波形表示してみると、期待通りの値になり、さらにPCも停止している。というわけで、うまく行った模様。
第8講 FPGA評価ボード上でCPU を動作させる
単なる読み物とした。なぜなら、実機を持っていないので、あまり検討しても楽しくない。7セグ表示の仕組みを作っても、波形しか見られないので、何が起きているのか全然分からない。
動かしてわかるCPUの作り方 第4~6講
第4講 論理回路の基礎を復習する
特筆すべきことなし。
第5講 ハードウェア記述言語のVHDL を用いて回路を表現する
この章は検証が難しい。というのも、回路の記述例は多数あるのだが、テストベンチがないためにシミュレーションができない(テストベンチは次章の最後のほうに登場する)。なお、付録にもそういった記述はない。章構成としてここに入れるのがベターであることは理解できるが、手を動かして理解するという点では難がある。
第6講 FPGA 評価ボード上で簡単な回路を動作させる
基本的に読み物。Altera (Intel)のCyclon Vを搭載しているDE0-CVというFPGA評価ボードを対象としている。FPGAの内部構造についても簡単に触れているが、かならずしも詳細まで理解させようという意図は無い様子。FPGA評価ボードの入出力(スイッチや7セグ)については、回路レベルで紹介されており、その点では読み応えが多少ある。
GHDLの導入
書籍の前提に従ってQuartus Primeをインストールすれば話は早いのだが、かなり巨大なソフトウェアなのでインストールをためらっている。そもそも実機を持っていないので、そこまでやる必要性も感じていない。一方で、シミュレーションはしてみたい。そこで、VHDL対応のOSSであるGHDLをインストールして検証した。また、波形の表示にはGTKWaveを利用した。いずれもWindows環境である。
P.157 図 6-20 30行目 prot_mapはport mapの間違い。
GHDLはコンパイルとシミュレーションの動作を引数で切り替えるので、ちょっと最初は戸惑う。とはいえ、分かってしまえば、それほど難しくない。
VHDLは方言が多いらしい。GHDLはIEEE標準に厳格であるため、書籍のとおりにテストベンチを書くとエラーとなる。synopsys方言を有効にし、さらに-fexplicitオプションを有効にする必要がある。
動かしてわかるCPUの作り方 第1~3講
第1講 ソフトウェアからCPUの動作をイメージする
1から10までの合計する計算を例に、C言語、インラインアセンブラ、の順番に理解を深めていく。曰く、「ソフトウェアからPUの動作をイメージする」。
この辺は理解しきっているのでさすがに得るものはなかった。ただ、これらを知らなかった昔の自分はどのぐらいすんなり理解できただろうか。高校生の時にZ80(書籍だけ)やPICに触れていたので、もっと昔まで遡る必要がありそう。
ふと思い出したことがあった。プログラミング言語は英単語がたくさん出てくる。そのため、英語のスペルをきちんと習得していないと、写経するだけでもエラーがいっぱい出てきて挫折する。特に、Win32プログラミングはひたすらAPIが長い上に、昔はIntelliSenceもなかったので、完璧に挫折した。
第2講 シンプルなCPUのアーキテクチャを決定する
内容からすると、命令セットの導入と同義である。
ハーバードアーキテクチャを採用する。PICもこれを採用していて、当時は宣伝文句になっていた気がする。電子工作レベルでは、動的にプログラムを書き換えることもないので、特にアーキテクチャを気にすることはなかった。
Wikipediaの説明によれば、キャッシュがデータと命令で分かれている最近のCPUでは、事実上ハーバードアーキテクチャらしい。主記憶まで含めれば依然としてノイマン型アーキテクチャになる。
命令は15bit、データは16bit。命令は4bit、レジスタ種類は3bit、8種類、即値は8bit。プログラムカウンタは8bit、よって即値で任意箇所に移動(Jump)できる。主記憶のアドレスも8bit、よって即値で任意メモリにアクセス(Store/Load)できる。
命令セットの設計こそが肝で、パタヘネでも丁寧に説明しているのだが、本書では天下り的に与えられている。ここは、書籍の趣旨からすると仕方ないかもしれないが、RISCの醍醐味が感じられないくてちょっと残念な気もする。
第3講 C言語を用いてCPUの動作をエミュレートする
簡易型アセンブラとCPUエミュレーションが一体となったソースコードが提示されている。コードを最後まで見れば一目瞭然なのだが、書籍の冒頭にある説明から読むと、何の話をしているのか全然分からず混乱した。
前者は、ある種のDSLとして実現されている。そう書いておいてくれれば良いのに。コードを見るまで何の説明をしているのか全く分からず頭を抱えた。
後者は、極めて素直なエミュレータで、これも命令セットと同様で天下り的に与えられている。
書籍として読むのは簡単だが、コードを写経してみるのも面白い。C言語で実装したが、オペコードと演算子が一対一対応していることを実感する。|=や&=、三項演算子で記述がどんどん短くなる。
一箇所、エミュレータのLDL命令で、即値と0xffでANDをとっているところがある。即値を返す関数で0xffとANDをとっているので、冗長だが、何か意図的だろうか。フェールセーフにしては、他のところでそういうケアをしていないので、一貫性が無い。
せっかくなので書籍の紹介。
動かしてわかるCPUの作り方10講を購入
「動かしてわかるCPUの作り方10講」がふと目に止まったので購入。久しぶりに紙の書籍も、と頭をよぎった。紙書籍の場合、買った直後は良いのだが、保存を考える場所がない(家が狭い)。というわけで、いつも通り電子版にする。
出版元が技術評論社であることに気が付き、PDFでも入手できるのではないかと版元のウェブサイトを確認した。PDF/EPUBがKindleよりも廉価に入手できる。数年前に「Androidを支える技術」を購入して以来の利用だった。
PDFには全ページ透かしが埋め込まれている。購入者名とメールアドレスが左上に表示されている。画面の大きさによってはかなり目立つので、ちょっと鬱陶しいと感じる。以前からそうだったのかなと上記書籍を開いてみたら、表示されていた。当時は気にならなかったんだが、なんででしょうね。
4連休でどこまで出来るのかわかりませんが、新しいことに挑戦してみようと思っている。シミュレーションまでで良いので手を動かしてみるつもりです。理論的なところ色々勉強したので理解しているつもりですが、Hello worldレベルを超えるHDLは書いたことがなく、早くそのレベルを卒業したい。
Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)
- 作者:有野 和真
- 発売日: 2017/02/22
- メディア: 単行本(ソフトカバー)
Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)
- 作者:有野 和真
- 発売日: 2017/03/24
- メディア: 単行本(ソフトカバー)
カプセルホテルを初めて利用してみた
カプセルホテルのひとつであるファーストキャビンに宿泊してみた。お手頃価格だし(今回は4300円)、大浴場もあるので、リピートしても良いかなと思う。
快適に寝られるかどうかは、騒がしい人が宿泊していないことなので、そのへんはギャンブルです。私自身はあまり音が気にならないので、リスクは低いです。それでも、物音で一度目が覚めました。
良いところ
- 部屋に電源とWiFiがある
- 大浴場がある
- スリッパあり
- フルフラットのベッド
- 全室通路側
下3つはネタです。ホテルのコンセプトが、飛行機のファーストクラス・ビジネスクラスよりも快適!というものなので。
微妙なところ
- 部屋前のカーテンの開け閉めの音が大きい
- ベッドが硬い(スプリングのみ)
- 共有スペースの清掃頻度はあまり高くない
早朝だったからたまたまの可能性もあり - ヘッドホンの品質は高くない
結局自前のイヤホンを使った
なお、博多には電子情報通信学会の画像工学研究会に参加するために一泊で来ています。参加というか、幹事補佐業務と、研専委員会出席が主業務です。