このプログラムを、kiteasm を用いてリスティングファイルを作成します。
$ ~kuga/bin/kiteasm -l testadd
000001 ; 000002 ; 再帰を使用した加算プログラム 000003 ; 000004 ;lab. mnemonic comment 000005 .text 000006 0000 C108 _MAIN: ld #0x8 000007 0001 BC00 swp 000008 0002 9100 or #0x00 ; sp = 0x800 000009 0003 F004 mv sp, acc 000010 0004 C800 in 0 ; input n 000011 0005 D400 push 000012 0006 200A call radd 000013 0007 D000 pop 000014 0008 CC00 out ; result 000015 0009 F800 halt 000016 ; 000017 000A F009 radd: mv ixr, sp 000018 000B C201 ld ixr, 1 000019 000C D400 push 000020 000D 9100 or #0 000021 000E 5015 jpz radd0 000022 000F 8C00 dec acc 000023 0010 D400 push 000024 0011 200A call radd 000025 0012 D000 pop 000026 0013 F009 mv ixr, sp 000027 0014 8200 add ixr, 0 000028 0015 F009 radd0: mv ixr, sp 000029 0016 C602 st ixr, 2 000030 0017 D000 pop ; dummy pop 000031 0018 E000 ret 000032 000033 .data 0x100 000034 0100 0000 ZERO: .word 0 000035 0101 0064 D100: .word 100 000036 000037 .const 0xfff 000038 0FFF 0000 .word _MAIN
$ ~kuga/bin/lst2ram testadd.lst
@0000 C108 // 000006 0000 C108 _MAIN: ld #0x8 @0001 BC00 // 000007 0001 BC00 swp @0002 9100 // 000008 0002 9100 or #0x00 ; sp = 0x800 @0003 F004 // 000009 0003 F004 mv sp, acc @0004 C800 // 000010 0004 C800 in 0 ; input n 中略 @0101 0064 // 000035 0101 0064 D100: .word 100 @0fff 0000 // 000038 0FFF 0000 .word _MAIN
$readmemh("testadd.ram", MEM);のように記述します。
また、IN 命令を実行した際に入力する値は、
io_DATA = 16'h000a; // Input Value
シミュレーションを行う際にはこれまでに書いた Verilog-HDL 記述で include で参照されているもの以外のファイルをすべて書く必要があります。 例)
$ verilog kite_test.v kite_top.v kite.v alu.v acc.v ir.v r12.v pc.v fr.v ar.v dec_seq.vまたは、入力する引数部分を例えば "kite.vv" のようにファイルにセーブしておけば、
% verilog -f kite.vvで実行することができます。
このファイルによるシミュレーションでは、HALT 命令を実行したことにより シミュレーションを停止します。したがって、HALT 命令を実行しないデバッ ク中のKITEプロセッサではシミュレーションが停止しません。その場合は、^ Cキー (コントロールC) を押してシミュレーションを止めたのち、^Dキー でシミュレータから抜け出て下さい。
以上の方法によりシミュレーションを行うと以下のような結果となります。
波形出力画面は以下のようになります。赤色のカーソル地点は実行開始か
ら 1.106 ミリ秒後(1MHzのクロックを使用しているので1,106クロック後)にHALT
信号が "L" から "H"に変化しています。これにより、HALT 命令によりシミュ
レーションが停止したことを示します。また、ACC の値が "0037" を示し
ていますが、これは 1〜10までの加算結果である 55 の16進数を意味
します。このように、設計したプロセッサがこのプログラムを正確に実行した
ことを示します。
(この信号波形は最上位階層(kite_top)の信号ではなく、第2階層(kite)の信号を表示していま
す。)
"testadd.asm" が動いたからといって、KITE-1 プロセッサ
が完成したわけではありません。 なぜなら、このプログラムは KITE-1
プロセッサの命令のほんの一部しか使用していないためです。プロセッサの動作
が正しいかどうか 次のプログラム
(perfect.asm) を実行させてみましょう。このプログラムはKITE-1マイクロ
プロセッサの全ての命令を使用し、命令の動作が正しいかをチェックできるよう
考慮したテストプログラムとなっています。
以下にperfect.asmの実行例を示します。5,739,000ns時間付近のACCの値が
"900D" を示しており。ほぼ正しく動作していることが確認できます。
回路にバグがある場合、どの命令正しく動作し、どの命令が正しく動作しない かを波形表示のみで捜し出すのは至難の技です。そこで次に、期待値比較によるシミュレーションの方法を紹介し ます。
My mail address is
kuga@cs.kumamoto-u.ac.jp .
Last modified on