テストベクタは、上記入力端子に信号を入力し、クロック毎に命令が正しく動 作するかどうかを調べる必要があります。以下のテストベクタは、一度プロセッ サに対しリセットをかけた後、ベクトルスタート、命令フェッチを行った後、 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
クロック以外の信号については、クロックの立上りと同時に変化しないように、 この例ではクロックの立ち下がり時に変化させるようにしています。もし、ク ロックの立上りと同時にリセット等の信号を変化させた場合には、フリップフ ロップのセットアップおよびホールドタイム を保障することができないため、リセットが正常にかからなかったり、レーシングやメタステーブ ルなどの原因となります。
テストベクタができましたら、"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
Our mail address is
kite@arch.cs.kumamoto-u.ac.jp .
Last modified on