オリジナル命令のシミュレーションによる動作確認
追加したNAND命令の動作をシミュレーションにより確認します。
追加したNAND命令を実行させますが、
KITEアセンブラにはNAND命令が定義されていないため、
NAND命令の命令コードをそのままでは出力できません。
KITEアセンブラの .word 擬似命令を用いて直接NAND命令の命令コードを出力さ
せます。
NAND命令演算とアドレッシングモードが正しく動作しているかどうかが確認でき
るような命令列を作成します。
これを nandtest.asm として作成します。
ld #0xaa ; acc = 0xaa55
swp
or #0x55
.word 0xb955 ; nand #0x55
push
ld PTR
mv ixr, acc
pop
.word 0xba00 ; nand ixr, 0
swp
.word 0xba00 ; nand ixr, 0
.word 0xba00 ; nand ixr, 0
halt
PTR: .word PTR1
PTR1: .word 0x55aa
.data 0xfff
.word 0 ; start vector
kiteasm および lst2ram を用いて、シミュレーションにかけるためのメモリイ
メージ(nandtest.ram)を作成します。
kite_test.v 内のメモリイメージ初期化部分を nandtest.ram に変更します。
//
// Load instructions on Memory
//
reg [15:0] MEM[0:4095]; // Memory Image
initial
begin
$readmemh("nandtest.ram", MEM); // 変更
end
verilog コマンドによりシミュレーションを行うと以下のような結果が得られま
す。
まず、ACC=0xAA55 にした後、nand #0x55 命令で、0xAA55 と 0xFF55 の NAND
を演算します。答えは 0xAA55 の反転である 0x55AA となり正しいことがわかります。
次にインデクス修飾アドレッシングが正しく動作するか確認するために、IXRレ
ジスタをPTR1に設定し、0x55AAと演算できるよう準備しておきます。
ACC=0x55AA と nand ixr, 0 命令で、0x55AA と 0x55AA の NAND を演算します。
答えは 0x55AA の反転である 0xAA55 となり正しいことがわかります。
次に、ACC=0x55AA と nand ixr, 0 命令で、0x55AA と 0x55AA の NAND を演算
します。答えは 0x55AA の反転である 0xAA55 となり正しいことがわかります。
最後に、ACC=0xAA55 と nand ixr, 0 命令で、0xAA55 と 0x55AA の NAND を演算
します。答えは 0x0000 の反転である 0xFFFF となり正しいことがわかります。
---- acc=0000 ixr=000 sp=000 out=0000 pc=000 c1aa
---- acc=00aa ixr=000 sp=000 out=0000 pc=001 bc00
M--- acc=aa00 ixr=000 sp=000 out=0000 pc=002 9155
M--- acc=aa55 ixr=000 sp=000 out=0000 pc=003 b955
---- acc=55aa ixr=000 sp=000 out=0000 pc=004 d400 ← nand #0x55 実行後
---- acc=55aa ixr=000 sp=fff out=0000 pc=005 000d
---- acc=000e ixr=000 sp=fff out=0000 pc=006 f008
---- acc=000e ixr=00e sp=fff out=0000 pc=007 d000
---- acc=55aa ixr=00e sp=000 out=0000 pc=008 ba00
M--- acc=aa55 ixr=00e sp=000 out=0000 pc=009 bc00 ← nand ixr,0 実行後
---- acc=55aa ixr=00e sp=000 out=0000 pc=00a ba00
M--- acc=aa55 ixr=00e sp=000 out=0000 pc=00b ba00 ← nand ixr,0 実行後
M--- acc=ffff ixr=00e sp=000 out=0000 pc=00c f800 ← nand ixr,0 実行後
M--- acc=ffff ixr=00e sp=000 out=0000 pc=00d 000e ← halt 実行後のレジスタ内容(000eは無視してよい)
命令実行の波形は以下のようになります。
TimeA および Baseline カーソルのところで、0xBA00 の NAND演算が正しく動作しているこ
とが分かります。
いかがでしょうか。
新たに追加する命令が、既存の命令とほぼ同様な処理で実現できるのであれば、
容易に新たな命令を追加することができます。
HDLを使用していますので、もっと複雑な命令でも容易に追加できます。
例えば、これまでの演習では、
- 乗算 (MUL)、除算 (DIV)
- 複数ビットシフト
- ビット演算 (ビットセット、ビットリセット、ビットテスト、ビット反転など)
- 10進数演算 (BCD演算、10進補正命令など)
- 絶対値演算 (ABS)
- 2の補数演算 (NEG)
- インクリメント、デクリメント演算の拡張
(命令フィールドの空きを利用して、ある程度の範囲で加減算値を指定できるようにした)
などの演算命令を追加していました。
以上を参考にして、あなたもオリジナルプロセッサを設計してみましょう。
※ ちなみに、NOR命令のように単に演算子を書き換えるだけで実現できる簡単な命令は、
※ NAND命令の追加後のソースを2文字書き換えるだけで実現できます。
※ このような命令は、できれば追加命令として選択しないでください。
また、オリジナル命令の追加により、プログラミング効
率やプログラムの処理効率がどの程度向上するか考察してください。
| Home |