命令デコーダとシーケンサの動作確認のためのテストベクタサンプル


KITE マイクロプロセッサの命令デコーダおよびシーケンサについて、それら が正しく動作しているかどうか論理シミュレーションにより確認しましょう。 例として、LD 直接命令および ST 直接命令の 2 つを取り上げます。 命令デコーダ&シーケンサの回路は基本的に以下のようなブロックとなり、 入力端子として「命令レジスタ」、「フラグレジスタ」、「クロック」、「リ セット」、「メモリアクノリッジ」の各信号があります。また、出力としては、 ALU、レジスタ、双方向バッファおよびメモリ・I/O制御等の制御信号がありま す。

テストベクタは、上記入力端子に信号を入力し、クロック毎に命令が正しく動 作するかどうかを調べる必要があります。以下のテストベクタは、一度プロセッ サに対しリセットをかけた後、ベクトルスタート、命令フェッチを行った後、 LD直接命令を実行して行きます。また、最初のLD直接命令が終了した後、続け て命令フェッチを開始し、もう一度LD直接命令を実行します。2回目のLD直接 命令ではメモリからのアクノリッジ信号が1クロック遅れて到着したと仮定し、 E2状態にウェイトが入るシミュレーションを行っています。3命令目はST直接 命令を実行します。この場合もメモリからのアクノリッジ信号が1クロック遅 れて到着したと仮定し、E3ステートにウェイトが入るシミュレーションを行っ ています。


# clock
CLK 1000

# input 
RST
ACK
IR[15:0]
F4[3:0]

# testvector
#   RST ACK IR[15:0] F4[3:0]

   0 0   0   16'h0000 4'b0000
2500 1   1   16'h0000 4'b0000 
2000 1   1   16'h0000 4'b0000 
1000 0   1   16'h0000 4'b0000 # V1
1000 0   1   16'h0000 4'b0000 # V2
1000 0   1   16'h0000 4'b0000 # F1
1000 0   1   16'h0000 4'b0000 # F2
1000 0   1   16'h0000 4'b0000 # F3
1000 0   1   16'h0000 4'b0000 # E1 LD direct
1000 0   1   16'h0000 4'b0000 # E2
1000 0   1   16'h0000 4'b0000 # E3
1000 0   1   16'h0000 4'b0000 # F1
1000 0   1   16'h0000 4'b0000 # F2
1000 0   1   16'h0000 4'b0000 # F3
1000 0   1   16'h0000 4'b0000 # E1 LD direct
1000 0   1   16'h0000 4'b0000 # E2
1000 0   0   16'h0000 4'b0000 # E2 ACK loop
1000 0   1   16'h0000 4'b0000 # E3
1000 0   1   16'h0000 4'b0000 # F1
1000 0   1   16'h1000 4'b0000 # F2
1000 0   1   16'h1000 4'b0000 # F3
1000 0   1   16'h1000 4'b0000 # E1 ST direct
1000 0   1   16'h1000 4'b0000 # E2
1000 0   1   16'h1000 4'b0000 # E3
1000 0   0   16'h1000 4'b0000 # E3 ACK loop
1000 0   1   16'h1000 4'b0000 # E4
1000 0   1   16'h1000 4'b0000 # F1
1000 0   1   16'h1000 4'b0000 # F2
1000 0   0   16'h1000 4'b0000 # F2 ACK loop
1000 0   1   16'h1000 4'b0000 # F3
1000 0   1   16'h1000 4'b0000 


ALUのシミュレーションにおけるテストベクタと異なり、クロックを入力する 必要がありますが、クロックは "# clock" により、自動的に生成されます。 "CLK" がクロックの信号名、"CLK" に続く数値が クロックの周期になります。 ここでは、"1000" ns としており、1MHz のクロックを入力している事になり ます。

クロック以外の信号については、クロックの立上りと同時に変化しないように、 この例ではクロックの立ち下がり時に変化させるようにしています。もし、ク ロックの立上りと同時にリセット等の信号を変化させた場合には、フリップフ ロップのセットアップおよびホールドタイム を保障することができないため、リセットが正常にかからなかったり、レーシングメタステーブ ルなどの原因となります。

テストベクタができましたら、"make_vector" コマンドにより、verilog HDL 記述のテストベクタへ変換します。変換後のテストベクタは以下のようになります。


integer i0;
initial
begin
    CLK = 1'b1;
    for( i0=0 ; i0<67 ; i0=i0+1 )
        CLK = #500 ~CLK;
    $finish;
end

initial
begin
    RST = # 0 0;
    RST = # 2500 1;
    RST = # 2000 1;
    RST = # 1000 0;	//  V1 
    RST = # 1000 0;	//  V2 
    RST = # 1000 0;	//  F1 
    RST = # 1000 0;	//  F2 
    RST = # 1000 0;	//  F3 
    RST = # 1000 0;	//  E1 LD direct 
    RST = # 1000 0;	//  E2 
    RST = # 1000 0;	//  E3 
    RST = # 1000 0;	//  F1 
    RST = # 1000 0;	//  F2 
    RST = # 1000 0;	//  F3 
    RST = # 1000 0;	//  E1 LD direct 
    RST = # 1000 0;	//  E2 
    RST = # 1000 0;	//  E2 ACK loop 
    RST = # 1000 0;	//  E3 
    RST = # 1000 0;	//  F1 
    RST = # 1000 0;	//  F2 
    RST = # 1000 0;	//  F3 
    RST = # 1000 0;	//  E1 ST direct 
    RST = # 1000 0;	//  E2 
    RST = # 1000 0;	//  E3 
    RST = # 1000 0;	//  E3 ACK loop 
    RST = # 1000 0;	//  E4 
    RST = # 1000 0;	//  F1 
    RST = # 1000 0;	//  F2 
    RST = # 1000 0;	//  F2 ACK loop 
    RST = # 1000 0;	//  F3 
    RST = # 1000 0;
end

initial
begin
    ACK = # 0 0;
    ACK = # 2500 1;
    ACK = # 2000 1;
    ACK = # 1000 1;	//  V1 
    ACK = # 1000 1;	//  V2 
    ACK = # 1000 1;	//  F1 
    ACK = # 1000 1;	//  F2 
    ACK = # 1000 1;	//  F3 
    ACK = # 1000 1;	//  E1 LD direct 
    ACK = # 1000 1;	//  E2 
    ACK = # 1000 1;	//  E3 
    ACK = # 1000 1;	//  F1 
    ACK = # 1000 1;	//  F2 
    ACK = # 1000 1;	//  F3 
    ACK = # 1000 1;	//  E1 LD direct 
    ACK = # 1000 1;	//  E2 
    ACK = # 1000 0;	//  E2 ACK loop 
    ACK = # 1000 1;	//  E3 
    ACK = # 1000 1;	//  F1 
    ACK = # 1000 1;	//  F2 
    ACK = # 1000 1;	//  F3 
    ACK = # 1000 1;	//  E1 ST direct 
    ACK = # 1000 1;	//  E2 
    ACK = # 1000 1;	//  E3 
    ACK = # 1000 0;	//  E3 ACK loop 
    ACK = # 1000 1;	//  E4 
    ACK = # 1000 1;	//  F1 
    ACK = # 1000 1;	//  F2 
    ACK = # 1000 0;	//  F2 ACK loop 
    ACK = # 1000 1;	//  F3 
    ACK = # 1000 1;
end

initial
begin
    IR[15:0] = # 0 16'h0000;
    IR[15:0] = # 2500 16'h0000;
    IR[15:0] = # 2000 16'h0000;
    IR[15:0] = # 1000 16'h0000;	//  V1 
    IR[15:0] = # 1000 16'h0000;	//  V2 
    IR[15:0] = # 1000 16'h0000;	//  F1 
    IR[15:0] = # 1000 16'h0000;	//  F2 
    IR[15:0] = # 1000 16'h0000;	//  F3 
    IR[15:0] = # 1000 16'h0000;	//  E1 LD direct 
    IR[15:0] = # 1000 16'h0000;	//  E2 
    IR[15:0] = # 1000 16'h0000;	//  E3 
    IR[15:0] = # 1000 16'h0000;	//  F1 
    IR[15:0] = # 1000 16'h0000;	//  F2 
    IR[15:0] = # 1000 16'h0000;	//  F3 
    IR[15:0] = # 1000 16'h0000;	//  E1 LD direct 
    IR[15:0] = # 1000 16'h0000;	//  E2 
    IR[15:0] = # 1000 16'h0000;	//  E2 ACK loop 
    IR[15:0] = # 1000 16'h0000;	//  E3 
    IR[15:0] = # 1000 16'h0000;	//  F1 
    IR[15:0] = # 1000 16'h1000;	//  F2 
    IR[15:0] = # 1000 16'h1000;	//  F3 
    IR[15:0] = # 1000 16'h1000;	//  E1 ST direct 
    IR[15:0] = # 1000 16'h1000;	//  E2 
    IR[15:0] = # 1000 16'h1000;	//  E3 
    IR[15:0] = # 1000 16'h1000;	//  E3 ACK loop 
    IR[15:0] = # 1000 16'h1000;	//  E4 
    IR[15:0] = # 1000 16'h1000;	//  F1 
    IR[15:0] = # 1000 16'h1000;	//  F2 
    IR[15:0] = # 1000 16'h1000;	//  F2 ACK loop 
    IR[15:0] = # 1000 16'h1000;	//  F3 
    IR[15:0] = # 1000 16'h1000;
end

initial
begin
    F4[3:0] = # 0 4'b0000;
    F4[3:0] = # 2500 4'b0000;
    F4[3:0] = # 2000 4'b0000;
    F4[3:0] = # 1000 4'b0000;	//  V1 
    F4[3:0] = # 1000 4'b0000;	//  V2 
    F4[3:0] = # 1000 4'b0000;	//  F1 
    F4[3:0] = # 1000 4'b0000;	//  F2 
    F4[3:0] = # 1000 4'b0000;	//  F3 
    F4[3:0] = # 1000 4'b0000;	//  E1 LD direct 
    F4[3:0] = # 1000 4'b0000;	//  E2 
    F4[3:0] = # 1000 4'b0000;	//  E3 
    F4[3:0] = # 1000 4'b0000;	//  F1 
    F4[3:0] = # 1000 4'b0000;	//  F2 
    F4[3:0] = # 1000 4'b0000;	//  F3 
    F4[3:0] = # 1000 4'b0000;	//  E1 LD direct 
    F4[3:0] = # 1000 4'b0000;	//  E2 
    F4[3:0] = # 1000 4'b0000;	//  E2 ACK loop 
    F4[3:0] = # 1000 4'b0000;	//  E3 
    F4[3:0] = # 1000 4'b0000;	//  F1 
    F4[3:0] = # 1000 4'b0000;	//  F2 
    F4[3:0] = # 1000 4'b0000;	//  F3 
    F4[3:0] = # 1000 4'b0000;	//  E1 ST direct 
    F4[3:0] = # 1000 4'b0000;	//  E2 
    F4[3:0] = # 1000 4'b0000;	//  E3 
    F4[3:0] = # 1000 4'b0000;	//  E3 ACK loop 
    F4[3:0] = # 1000 4'b0000;	//  E4 
    F4[3:0] = # 1000 4'b0000;	//  F1 
    F4[3:0] = # 1000 4'b0000;	//  F2 
    F4[3:0] = # 1000 4'b0000;	//  F2 ACK loop 
    F4[3:0] = # 1000 4'b0000;	//  F3 
    F4[3:0] = # 1000 4'b0000;
end

それでは、ALUのシミュレーションと同様な手順でシミュレーションを行って下さい。


| Back | CAD Home |

Our mail address is kite@arch.cs.kumamoto-u.ac.jp .
Last modified on