テストベクタは、上記入力端子に信号を入力し、クロック毎に命令が正しく動 作するかどうかを調べる必要があります。以下のテストベクタは、一度プロセッ サに対しリセットをかけた後、ベクトルスタート、命令フェッチを行った後、 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