MySOC USBHostとLCD制御を組込( 7)
          SPU81の命令の実行を検証

 VerilogHDLでFPGAに設計したSPU81(シーケンス・プロセッサ・ユニット)の命令の動きを確認します。
 確認方法は、確認用プログラムをプログラムメモリ初期化データとしてプログラムメモリに記憶させ、ModelSimでシミュレーションして内部動作を確認します。
 目視で内部動作を確認するので手間が掛かりますが、開発初期段階では確実な方法です。


以下の内容を整理した物をここに置きます。

検証プログラム Spu81Diag1をここに置きます。
検証プログラム Spu81Diag2をここに置きます。
検証プログラム Spu81Diag3をここに置きます。

検証プログラム Spu81Diag4をここに置きます。
検証プログラム Spu81Diag5をここに置きます。
検証プログラム Spu81Diag6をここに置きます。
検証プログラム Spu81Diag7をここに置きます。

●検証で見つかった不具合とそれによる仕様の変更

 検証で見つかった不具合とそれによる仕様の変更を下記します。
 SPU81は、以前に記録した数枚の仕様書とMyマイコンComet2eの設計資料を参考にして設計しました。このため、設計時間は短くなりましたが厳密な定義がおろそかになりました。全体的には、違和感が無く使い勝手の良い物となりました。しかし、一部の命令を削除したり使い勝手が悪いところもあります。 次に、変更した内容を記録します。

 @STM a,M 命令の使用時の注意
   STM a,M 命令の直前の命令が、STM a,M 命令で使うAccに書き込む場合、直前の命令がAccに書き込むデータは
   採用されません。データを書き込む前のデータが採用されます。
   対策は、Accに書き込む命令とSTM a,M 命令の間にNOP命令を挿入します。

 ABITS b,r命令とBITR b,r命令は、実装していません。使わないでください。

 BAccをレジスタ番号で指定できる様にしました。
  例えば、ADD a,r命令で、Acc0とAcc0の加算ができます。

 CSTM a,M 命令順序操作のシーケンスの一部変更
   命令レジスタの内容をメモリアドレスにするルートを追加しました。

 Dアッセンブラで使用する「Asm命令処理コード」を追記しました。
 

●命令検証の波形の見方

 左の波形はModelSimでシミュレーションした波形で、信号はブロック毎に区切って配置しています。
 それぞれの信号ブロックは、SPU81の関係するブロック構成を矢印で示していま。





●検証プログラム Spu81Diag1 での検証

 次のリストに示すようにLDI、ADDI、SUBI、JUMPの基本な命令を検証します。
 検証の波形は、その1とその2の2枚になっています。

Spu81Diag1 のアッセンブルリト

000 : 03000; Start LDI 0,00h ;Acc0<-00h
001 : 03001; LDI 0,01h ;Acc0<-01h
002 : 03002; LDI 0,02h ;Acc0<-02h
003 : 03004; LDI 0,04h ;Acc0<-04h
004 : 03008; LDI 0,08h ;Acc0<-08h
005 : 03010; LDI 0,10h ;Acc0<-10h
006 : 03020; LDI 0,20h ;Acc0<-20h
007 : 03040; LDI 0,40h ;Acc0<-40h
008 : 03080; LDI 0,80h ;Acc0<-80h
009 : 03200; LDI 1,00h ;Acc1<-00h
00A : 05201; ADDI 1,01h ;Acc1 = 01h
00B : 05202; ADDI 1,02h ;Acc1 = 03h
00C : 05204; ADDI 1,04h ;Acc1 = 07h
00D : 05208; ADDI 1,08h ;Acc1 = 0Fh
00E : 05210; ADDI 1,10h ;Acc1 = 1Fh
00F : 05220; ADDI 1,20h ;Acc1 = 3Fh
010 : 05240; ADDI 1,40h ;Acc1 = 7Fh
011 : 05280; ADDI 1,80h ;Acc1 = FFh
012 : 05201; ADDI 1,01h ;Acc1 = 00h
013 : 03400; LDI 2,00h ;Acc2<-00h
014 : 07401; SUBI 2,01h ;Acc2 = FFh
015 : 07402; SUBI 2,02h ;Acc2 = FDh
016 : 07404; SUBI 2,04h ;Acc2 = F9h
017 : 07408; SUBI 2,08h ;Acc2 = F1h
018 : 07410; SUBI 2,10h ;Acc2 = E1h
019 : 07420; SUBI 2,20h ;Acc2 = C1h
01A : 07440; SUBI 2,40h ;Acc2 = 81h
01B : 07480; SUBI 2,80h ;Acc2 = 01h
01C : 07401; SUBI 2,01h ;Acc2 = 00h
01D : 3001D; Stop JUMP Stop ;to Stop








●検証プログラム Spu81Diag2 での検証

 次のリストに示すようにORI、ANDI、XORI、JUMPの基本なロジカル演算命令を検証します。
 検証の波形は、その1とその2の2枚になっています。

Spu81Diag2 のアッセンブルリト

000 : 03600; Start LDI 3,00h ;Acc3<-00h
001 : 0B601; ORI 3,01h ;Acc3<-01h
002 : 0B602; ORI 3,02h ;Acc3<-03h
003 : 0B604; ORI 3,04h ;Acc3<-07h
004 : 0B608; ORI 3,08h ;Acc3<-0Fh
005 : 0B610; ORI 3,10h ;Acc3<-1Fh
006 : 0B620; ORI 3,20h ;Acc3<-3Fh
007 : 0B640; ORI 3,40h ;Acc3<-7Fh
008 : 0B680; ORI 3,80h ;Acc3<-FFh
009 : 096FE; ANDI 3,FEh ;Acc3 = FEh
00A : 096FD; ANDI 3,FDh ;Acc3 = FCh
00B : 096FB; ANDI 3,FBh ;Acc3 = F8h
00C : 096F7; ANDI 3,F7h ;Acc3 = F0h
00D : 096EF; ANDI 3,EFh ;Acc3 = E0h
00E : 096DF; ANDI 3,DFh ;Acc3 = C0h
00F : 096BF; ANDI 3,BFh ;Acc3 = 80h
010 : 0967F; ANDI 3,7Fh ;Acc3 = 00h
011 : 0D601; XORI 3,01h ;Acc3<-01h
012 : 0D602; XORI 3,02h ;Acc3<-03h
013 : 0D604; XORI 3,04h ;Acc3<-07h
014 : 0D608; XORI 3,08h ;Acc3<-0Fh
015 : 0D610; XORI 3,10h ;Acc3<-1Fh
016 : 0D620; XORI 3,20h ;Acc3<-3Fh
017 : 0D640; XORI 3,40h ;Acc3<-7Fh
018 : 0D680; XORI 3,80h ;Acc3<-FFh
019 : 0D601; XORI 3,01h ;Acc3<-FEh
01A : 0D602; XORI 3,02h ;Acc3<-FCh
01B : 0D604; XORI 3,04h ;Acc3<-F8h
01C : 0D608; XORI 3,08h ;Acc3<-F0h
01D : 0D610; XORI 3,10h ;Acc3<-E0h
01E : 0D620; XORI 3,20h ;Acc3<-C0h
01F : 0D640; XORI 3,40h ;Acc3<-80h
020 : 0D680; XORI 3,80h ;Acc3<-00h
021 : 30021; Stop JUMP Stop ;to Stop







●検証プログラム Spu81Diag3 での検証

 次のリストに示すようにADD、SUB、OR、AND、XORの基本なレジスタ間演算命令を検証します。
 検証の波形は、その1とその2の2枚になっています。

Spu81Diag3 のアッセンブルリト

000 : 03000; Start LDI 0,00h ;Acc0<-00h
001 : 03201; LDI 1,01h ;Acc1<-01h
002 : 03410; LDI 2,10h ;Acc2<-10h
003 : 03655; LDI 3,55h ;Acc3<-55h
004 : 04001; ADD 0,01h ;Acc0 = 01h
005 : 04001; ADD 0,01h ;Acc0 = 02h
006 : 04002; ADD 0,02h ;Acc0 = 12h
007 : 04002; ADD 0,02h ;Acc0 = 22h
008 : 04003; ADD 0,03h ;Acc0 = 77h
009 : 04003; ADD 0,03h ;Acc0 = CCh
00A : 04002; ADD 0,02h ;Acc0 = DCh
00B : 04002; ADD 0,02h ;Acc0 = ECh
00C : 04002; ADD 0,02h ;Acc0 = FCh
00D : 04002; ADD 0,02h ;Acc0 = 0Ch
00E : 04001; ADD 0,01h ;Acc0 = 0Dh
00F : 04001; ADD 0,01h ;Acc0 = 0Eh
010 : 04001; ADD 0,01h ;Acc0 = 0Fh
011 : 04001; ADD 0,01h ;Acc0 = 10h
012 : 06001; SUB 0,01h ;Acc0 = 0Fh
013 : 06002; SUB 0,02h ;Acc0 = FFh
014 : 06003; SUB 0,03h ;Acc0 = AAh
015 : 03000; LDI 0,00h ;Acc0<-00h
016 : 0A001; OR 0,01h ;Acc0 = 01h
017 : 0A002; OR 0,02h ;Acc0 = 11h
018 : 0A003; OR 0,03h ;Acc0 = 55h
019 : 0A003; OR 0,03h ;Acc0 = 55h
01A : 030FF; LDI 0,FFh ;Acc0<-FFh
01B : 08003; AND 0,03h ;Acc0 = 55h
01C : 08003; AND 0,03h ;Acc0 = 55h
01D : 08002; AND 0,02h ;Acc0 = 10h
01E : 08001; AND 0,01h ;Acc0 = 00h
01F : 030FF; LDI 0,FFh ;Acc0<-FFh
020 : 0C003; XOR 0,03h ;Acc0 = AAh
021 : 0C003; XOR 0,03h ;Acc0 = FFh
022 : 0C002; XOR 0,02h ;Acc0 = EFh
023 : 0C001; XOR 0,01h ;Acc0 = EEh
024 : 30024; Stop JUMP Stop ;to Stop







●検証プログラム Spu81Diag4 での検証

 次のリストに示すようにBITS、 BITR、BITTのビット演算命令を検証します。
 この検証で、BITS命令で不具合が見つかりました。大幅な修正が必要になったので今回はサポートしないことにします。
 検証の波形は、その1とその2とその3の3枚になっています。

Spu81Diag4 のアッセンブルリト

000 : 03000; Start LDI 0,00h ;Acc0<-00h
001 : 16000; BITS 0,00h ;Acc0<-01h
002 : 16200; BITS 1,00h ;Acc0<-03h
003 : 16400; BITS 2,00h ;Acc0<-07h
004 : 16600; BITS 3,00h ;Acc0<-0Fh
005 : 16800; BITS 4,00h ;Acc0<-1Fh
006 : 16A00; BITS 5,00h ;Acc0<-3Fh
007 : 16C00; BITS 6,00h ;Acc0<-7Fh
008 : 16E00; BITS 7,00h ;Acc0<-FFh
009 : 17000; BITR 0,00h ;Acc0<-FEh
00A : 17200; BITR 1,00h ;Acc0<-FCh
00B : 17400; BITR 2,00h ;Acc0<-F8h
00C : 17600; BITR 3,00h ;Acc0<-F0h
00D : 17800; BITR 4,00h ;Acc0<-E0h
00E : 17A00; BITR 5,00h ;Acc0<-C0h
00F : 17C00; BITR 6,00h ;Acc0<-80h
010 : 17E00; BITR 7,00h ;Acc0<-00h
011 : 03001; LDI 0,01h ;Acc0<-01h
012 : 14000; BITT 0,00h ;ZF<-0
013 : 03002; LDI 0,02h ;Acc0<-02h
014 : 14200; BITT 1,00h ;ZF<-0
015 : 03004; LDI 0,04h ;Acc0<-04h
016 : 14400; BITT 2,00h ;ZF<-0
017 : 03008; LDI 0,08h ;Acc0<-08h
018 : 14600; BITT 3,00h ;ZF<-0
019 : 03010; LDI 0,10h ;Acc0<-10h
01A : 14800; BITT 4,00h ;ZF<-0
01B : 03020; LDI 0,20h ;Acc0<-20h
01C : 14A00; BITT 5,00h ;ZF<-0
01D : 03040; LDI 0,40h ;Acc0<-40h
01E : 14C00; BITT 6,00h ;ZF<-0
01F : 03080; LDI 0,80h ;Acc0<-80h
020 : 14E00; BITT 7,00h ;ZF<-0
021 : 032FE; LDI 1,FEh ;Acc1<-FEh
022 : 14001; BITT 0,01h ;ZF<-1
023 : 032FD; LDI 1,FDh ;Acc1<-FDh
024 : 14201; BITT 1,01h ;ZF<-1
025 : 032FB; LDI 1,FBh ;Acc1<-FBh
026 : 14401; BITT 2,01h ;ZF<-1
027 : 032F7; LDI 1,F7h ;Acc1<-F7h
028 : 14601; BITT 3,01h ;ZF<-1
029 : 032EF; LDI 1,EFh ;Acc1<-EFh
02A : 14801; BITT 4,01h ;ZF<-1
02B : 032DF; LDI 1,DFh ;Acc1<-DFh
02C : 14A01; BITT 5,01h ;ZF<-1
02D : 03240; LDI 1,40h ;Acc1<-BFh
02E : 14CBF; BITT 6,BFh ;ZF<-1
02F : 03280; LDI 1,80h ;Acc1<-7Fh
030 : 14E7F; BITT 7,7Fh ;ZF<-1
031 : 30031; Stop JUMP Stop ;to Stop










●検証プログラム Spu81Diag5 での検証

 次のリストに示すようにST、 STM、 LD、LDMのロードとストア命令でメモリアクセスも検証します。
 メモリアクセスは、ModelSimのメモリ内容表示機能も使って確認します。
 検証の波形は、その1とその2とその3の3枚になっています。

Spu81Diag5 のアッセンブルリト

000 : 03000; Start LDI 0,00h ;Acc0<-00h
001 : 10020; ST 0,20h ;RpOut20h<-Acc0=00h
002 : 110F0; STM 0,F0h ;MMemF0h<-Acc0
003 : 03001; LDI 0,01h ;Acc0<-01h
004 : 10020; ST 0,20h ;RpOut20h<-Acc0=01h
005 : 110F1; STM 0,F1h ;MMemF1h<-Acc0
006 : 03002; LDI 0,02h ;Acc0<-02h
007 : 10020; ST 0,20h ;RpOut20h<-Acc0=02h
008 : 110F2; STM 0,F2h ;MMemF2h<-Acc0
009 : 03004; LDI 0,04h ;Acc0<-04h
00A : 10020; ST 0,20h ;RpOut20h<-Acc0=04h
00B : 110F3; STM 0,F3h ;MMemF3h<-Acc0
00C : 03008; LDI 0,08h ;Acc0<-08h
00D : 10020; ST 0,20h ;RpOut20h<-Acc0=08h
00E : 110F4; STM 0,F4h ;MMemF4h<-Acc0
00F : 03010; LDI 0,10h ;Acc0<-10h
010 : 10020; ST 0,20h ;RpOut20h<-Acc0=10h
011 : 110F5; STM 0,F5h ;MMemF5h<-Acc0
012 : 03020; LDI 0,20h ;Acc0<-20h
013 : 10020; ST 0,20h ;RpOut20h<-Acc0=20h
014 : 110F6; STM 0,F6h ;MMemF6h<-Acc0
015 : 03040; LDI 0,40h ;Acc0<-40h
016 : 10020; ST 0,20h ;RpOut20h<-Acc0=40h
017 : 110F7; STM 0,F7h ;MMemF7h<-Acc0
018 : 03080; LDI 0,80h ;Acc0<-80h
019 : 10020; ST 0,20h ;RpOut20h<-Acc0=80h
01A : 110F8; STM 0,F8h ;MMemF8h<-Acc0
01B : 032FF; LDI 1,FFh ;Acc1<-FFh
01C : 012F0; LDM 1,F0h ;Acc1<-MMemF0h=00h
01D : 02001; LD 0,01h ;Acc0<-Acc1=00h
01E : 012F1; LDM 1,F1h ;Acc1<-MMemF1h=01h
01F : 02001; LD 0,01h ;Acc0<-Acc1=01h
020 : 012F2; LDM 1,F2h ;Acc1<-MMemF2h=02h
021 : 02001; LD 0,01h ;Acc0<-Acc1=02h
022 : 012F3; LDM 1,F3h ;Acc1<-MMemF3h=04h
023 : 02001; LD 0,01h ;Acc0<-Acc1=04h
024 : 012F4; LDM 1,F4h ;Acc1<-MMemF4h=08h
025 : 02001; LD 0,01h ;Acc0<-Acc1=08h
026 : 012F5; LDM 1,F5h ;Acc1<-MMemF5h=10h
027 : 02001; LD 0,01h ;Acc0<-Acc1=10h
028 : 012F6; LDM 1,F6h ;Acc1<-MMemF6h=20h
029 : 02001; LD 0,01h ;Acc0<-Acc1=20h
02A : 012F7; LDM 1,F7h ;Acc1<-MMemF7h=40h
02B : 02001; LD 0,01h ;Acc0<-Acc1=40h
02C : 012F8; LDM 1,F8h ;Acc1<-MMemF8h=80h
02D : 02001; LD 0,01h ;Acc0<-Acc1=80h
02E : 3002E; Stop JUMP Stop ;to Stop










●検証プログラム Spu81Diag6 での検証

 次のリストに示すようにNOP、 ORI、ANDI、XORI、ADDI、SUBI等の命令を使って4つのアキュームレータを検証します。
 検証の波形は、その1とその2の2枚になっています。

Spu81Diag6 のアッセンブルリト

000 : 03600; Start LDI 3,00h ;OF:0,SF:0,ZF:1; Acc3=00h
001 : 00000; NOP ;OF:0,SF:0,ZF:1;
002 : 0B601; ORI 3,01h ;OF:0,SF:0,ZF:0; Acc3=01h
003 : 0B6FE; ORI 3,FEh ;OF:0,SF:1,ZF:0; Acc3=FFh
004 : 034FF; LDI 2,FFh ;OF:0,SF:1,ZF:0; Acc2=FFh
005 : 00000; NOP ;OF:0,SF:1,ZF:0;
006 : 094FE; ANDI 2,FEh ;OF:0,SF:1,ZF:0; Acc2=FEh
007 : 09410; ANDI 2,10h ;OF:0,SF:0,ZF:0; Acc2=10h
008 : 094EF; ANDI 2,EFh ;OF:0,SF:0,ZF:1; Acc2=00h
009 : 03211; LDI 1,11h ;OF:0,SF:0,ZF:0; Acc1=11h
00A : 00000; NOP ;OF:0,SF:0,ZF:0;
00B : 0D2EE; XORI 1,EEh ;OF:0,SF:1,ZF:0; Acc1=FFh
00C : 0D255; XORI 1,55h ;OF:0,SF:1,ZF:0; Acc1=AAh
00D : 0D2AA; XORI 1,AAh ;OF:0,SF:0,ZF:1; Acc1=00h
00E : 03000; LDI 0,00h ;OF:0,SF:0,ZF:1; Acc0=00h
00F : 00000; NOP ;OF:0,SF:0,ZF:1;
010 : 05001; ADDI 0,01h ;OF:0,SF:0,ZF:0; Acc0=01h
011 : 0507E; ADDI 0,7Eh ;OF:0,SF:0,ZF:0; Acc0=7Fh
012 : 05001; ADDI 0,01h ;OF:1,SF:1,ZF:0; Acc0=80h
013 : 00000; NOP ;OF:1,SF:1,ZF:0;
014 : 05001; ADDI 0,01h ;OF:0,SF:1,ZF:0; Acc0=81h
015 : 030FE; LDI 0,FEh ;OF:0,SF:1,ZF:0; Acc0=FEh
016 : 00000; NOP ;OF:0,SF:1,ZF:0;
017 : 05001; ADDI 0,01h ;OF:0,SF:1,ZF:0; Acc0=FFh
018 : 05001; ADDI 0,01h ;OF:0,SF:0,ZF:1; Acc0=00h
019 : 0507F; ADDI 0,7Fh ;OF:0,SF:0,ZF:0; Acc0=7Fh
01A : 05001; ADDI 0,01h ;OF:1,SF:1,ZF:0; Acc0=80h
01B : 00000; NOP ;OF:1,SF:1,ZF:0;
01C : 05001; ADDI 0,01h ;OF:0,SF:1,ZF:0; Acc0=81h
01D : 03283; LDI 1,83h ;OF:0,SF:1,ZF:0; Acc1=83h
01E : 00000; NOP ;OF:0,SF:1,ZF:0;
01F : 07201; SUBI 1,01h ;OF:0,SF:1,ZF:0; Acc1=82h
020 : 07203; SUBI 1,03h ;OF:1,SF:0,ZF:0; Acc1=7Fh
021 : 0527F; ADDI 1,7Fh ;OF:1,SF:1,ZF:0; Acc1=FEh
022 : 00000; NOP ;OF:0,SF:0,ZF:1;
023 : 07201; SUBI 1,01h ;OF:0,SF:1,ZF:0; Acc1=FDh
024 : 30024; Stop JUMP Stop ;to Stop








●検証プログラム Spu81Diag7 での検証

 次のリストに示すようにJZE、JNZ、JPL等のジャンプ命令を検証します。
 検証の波形は、その1とその2の2枚になっています。

Spu81Diag7 のアッセンブルリト

000 : 03400; Start LDI 2,00h ;OF:0,SF:0,ZF:1; Acc2=00h
001 : 00000; NOP ;OF:0,SF:0,ZF:1;
002 : 33005; JZE LJ1 ;Jump On ZF=1
003 : 30003; L1 JUMP L1 ;MissOpe Trap
004 : 30004; L2 JUMP L2 ;MissOpe Trap
005 : 05401; LJ1 ADDI 2,01h ;OF:0,SF:0,ZF:0; Acc2=01h
006 : 33006; LJ2 JZE LJ2 ;Jump On ZF=1
007 : 3200A; JNZ LJ3 ;Jump On ZF=0
008 : 30008; L3 JUMP L3 ;MissOpe Trap
009 : 30009; L4 JUMP L4 ;MissOpe Trap
00A : 03400; LJ3 LDI 2,00h ;OF:0,SF:0,ZF:1; Acc2=00h
00B : 3200B; LJ4 JNZ LJ4 ;Jump On ZF=0
00C : 03001; LDI 0,01h ;OF:0,SF:0,ZF:0; Acc2=01h
00D : 34010; JPL LJ5 ;Jump On SF=0 And ZF=0
00E : 3000E; L5 JUMP L5 ;MissOpe Trap
00F : 3000F; L6 JUMP L6 ;MissOpe Trap
010 : 03400; LJ5 LDI 2,00h ;OF:0,SF:0,ZF:1; Acc2=00h
011 : 34011; LJ6 JPL LJ6 ;Jump On SF=0 And ZF=0
012 : 03480; LDI 2,80h ;OF:0,SF:1,ZF:0; Acc2=80h
013 : 34013; LJ7 JPL LJ7 ;Jump On SF=0 And ZF=0
014 : 35017; JMI LJ8 ;Jump On SF=1
015 : 30015; L7 JUMP L7 ;MissOpe Trap
016 : 30016; L8 JUMP L8 ;MissOpe Trap
017 : 03400; LJ8 LDI 2,00h ;OF:0,SF:0,ZF:0; Acc2=00h
018 : 35018; LJ9 JMI LJ9 ;Jump On SF=1
019 : 0347F; LDI 2,7Fh ;OF:0,SF:0,ZF:0; Acc2=7Fh
01A : 05401; ADDI 2,01h ;OF:1,SF:1,ZF:0; Acc2=80h
01B : 3701E; JOV LJ10 ;Jump On OF=1
01C : 3001C; L9 JUMP L9 ;MissOpe Trap
01D : 3001D; L10 JUMP L10 ;MissOpe Trap
01E : 03400; LJ10 LDI 2,00h ;OF:0,SF:0,ZF:0; Acc2=00h
01F : 3701F; LJ11 JOV LJ11 ;Jump On SF=1
020 : 30020; Stop JUMP Stop ;to Stop















ホームへ戻る