8.2のテーマはバイトアドレッシングです。今まではROMと同じくRAMも常にワード(2バイト)単位でアクセスしていましたが、RAMについてはワードでもアクセスするがバイト単位でもアクセスできるように拡張します。

8.2の演習問題も一応は終わりました。一応と言っているのは、本ではWebからテストベンチとテストプログラムをとってきて実行結果が本と一致するかでVerilogコードを検証せよとあるのですが、らしきものが見つからなかったため、自分で作ったテストベンチとテストプログラムで確認したからです。

ただ、RAMにワードアクセスする既存のロード、ストア命令がおかしくなっていないかは未確認です。

今回からRAMアクセスが偶数アドレスに対してか奇数アドレスに対してかで処理が変わるので結構難しかったです。POCOのVerilog記述での対応はもちろんするのですが、テストベンチ側も色々変わってきます。

本節を勉強して良かったこととして、Big Endian/Little Endianの用語の命名理由が納得できました。

今までは、上位(Big)のデータが先に来る(Endじゃない側)のをBig Endianと呼ぶのは不自然な気がしていたのですが、データのEnd(LSB)がアドレスの大きい方(Big)にあるからBig Endianと呼ぶとの説明でもやもやが解消できてよかったです。

とうとう第8章 入出力:I/O に入りました。

CPU内部で演算しているだけじゃなくて外部と情報のやりとりができれば、つたない機能しかなくても使える感じがしてきて嬉しいです。

演習8-1はディスプレイ表示用のレジスタを制御してメモリ上の0~4番地に置かれているデータを表示するものです。POCOはメモリマップドI/Oなので命令を追加しなくてもソフトが作れます。

本を読んだ印象ではディスプレイ関係のVerilogコードを書くことはここの主題ではないのでVerilogコードを用意したからそれをWebから持って来てソフトだけ作ってみなさいと言ってるみたいなのですが、Webを探しても該当するVerilogコードが見つかりませんでした。なのでソフトを作って自分が考える範囲では多分できているだろうというところに留めています。

ただ、Webを探して収穫がありました。

この本は8章までで一旦学習終了とする予定なのですが、POCOは1サイクルで1命令が完了する仕様になっています。これはあまりに普通じゃない気がするのでマルチサイクル化まではやりたいのですが、それだけのために9章のパイプラインを勉強するのは荷が重いと思っていました。

が、Web上にマルチサイクルにするがパイプラインまではしないVerilogコード及び解説があるのに気付きました。よって8章が終わったらそこまで勉強して一旦本件は締めたいと思います。

ゴールが見えてきたかな。

演習6-4が動き、やっと第6章が終わりました。

演習6-4は、跳び先アドレスを入れたレジスタを指定してサブルーチンコールすることにより、16ビットのアドレス空間のどこにあるサブルーチンでも呼べるJALR命令をPOCOに追加するのが課題でした。

Verilogの修正の方は大分慣れてきて比較的すんなりとできました。この命令はどの制御線をどの値にすれば意図通りの動作をするかを考えれば修正箇所は自ずと決まります。

が、ソフトウェアの方で失敗しました。

演習6-3のソフトで現在位置から11ビットの範囲にあるサブルーチンをコールできるJAL命令を使っていた箇所を単純にJALR命令に置き換えるだけで良いと思っていたのですが、JALR命令で指定するレジスタに跳び先アドレスを入れる命令も追加したためプログラムが1命令長くなり、そのためJMP命令で後方ジャンプする距離が1長くなっていました。

アセンブラレベルでは以前と同じラベルにJMPしているだけですが、バイナリレベルでは値が変わります。要はまだハンドアセンブルしていたのがまずかったということですね。早くアセンブラ作らないと。。(^^ゞ

でもこの失敗で改めてラベルという概念やアセンブラの有り難味を感じることができたのは収穫でした。今まではそんなのあって当たり前と思っていましたから。