例として、加算が正しく動作するか調べることにします。加算演算は単に被加 算数と加算数が加算された結果を調べるだけでなく、キャリーやオーバーフロー などのフラグも同時に正しい動作をしているか調べる必要があります。キャリー ひとつでも動作が間違っている場合には、この ALU を使用したマイクロプロ セッサはまともに動作しなくなります。したがって、ALU 単体で確実に動作す るようシミュレーションで動作チェックをしておかなければなりません。
では、加算ではどういうチェックをすれば良いのでしょう。加算では、被加算 数、加算数、および結果が取りうる符号の組合せから、8通りのパターンが考 えられます。以下にそのパターンを表に示します。
被加算数 | 加算数 | 結果 | キャリーフラグ | オーバーフローフラグ | 零フラグ | 符号フラグ |
---|---|---|---|---|---|---|
0001 | 0001 | 0002 | 0 | 0 | 0 | 0 |
0001 | FFFF | 0000 | 1 | 0 | 1 | 0 |
FFFF | 0001 | 0000 | 1 | 0 | 1 | 0 |
8000 | 8000 | 0000 | 1 | 1 | 1 | 0 |
7FFF | 0001 | 8000 | 0 | 1 | 0 | 1 |
0001 | FFFE | FFFF | 0 | 0 | 0 | 1 |
FFFE | 0001 | FFFF | 0 | 0 | 0 | 1 |
FFFF | FFFF | FFFE | 1 | 0 | 0 | 1 |
このようなテストパターン(通常テストベクタと言う)を作成しシミュレータ上 で入力値に対する出力値をシミュレーションし正しい結果が得られているかど うか調べます。
さて、テストベクタですが、前回演習で行ったように、Verilog というハード ウェア記述言語で記述する必要があります。しかしながら、テストベクタの入 力を簡単にするために、以下のような記述を行った後、Verilog 記述形式に自 動変換することにしましょう。
まず、上の表に上げたテストパターンを以下のように入力しセーブします。こ こではファイル名を "alu_vector.txt" としましょう。
# input A[15:0] B[15:0] CB[3:0] # testvector # A[15:0] B[15:0] CB[3:0] 100 16'h0001 16'h0001 4'b0000 # add 100 16'h0001 16'hFFFF 4'b0000 100 16'hFFFF 16'h0001 4'b0000 100 16'h8000 16'h8000 4'b0000 100 16'h7FFF 16'h0001 4'b0000 100 16'h0001 16'hFFFE 4'b0000 100 16'hFFFE 16'h0001 4'b0000 100 16'hFFFF 16'hFFFF 4'b0000
"# input" の次の行から入力に必要な信号を記述します。ここでは例として A[15:0], B[15:0], CB[3:0] としていますが、皆さんの設計データに合わせて ください。文字の大文字小文字も識別しますので、間違えないように。バス線 を表す"[]"は、回路図上では"<>"ですが、"[]"で記述してください。
"# testvector" 以降にテスト用の入力パターンを並べて行きます。最初の "100" は信号の変化時間であり、100ns 毎に信号が変化することを示します。 その、次から入力信号の値を並べますが、信号の順番は "# input"で並べた順 番になることに注意してください。パターンの与え方は、以下のようにします。
記述が終りましたらセーブした後、シェルから以下のコマンドを入力してください。
% make_vector alu_vector.txt > alu_vector.v
これにより、以下のような Verilog 記述のテストベクタ "alu_vector.v" を得 ることができます。
initial begin A[15:0]= #100 16'h0001; // add A[15:0]= #100 16'h0001; A[15:0]= #100 16'hFFFF; A[15:0]= #100 16'h8000; A[15:0]= #100 16'h7FFF; A[15:0]= #100 16'h0001; A[15:0]= #100 16'hFFFE; A[15:0]= #100 16'hFFFF; end initial begin B[15:0]= #100 16'h0001; // add B[15:0]= #100 16'hFFFF; B[15:0]= #100 16'h0001; B[15:0]= #100 16'h8000; B[15:0]= #100 16'h0001; B[15:0]= #100 16'hFFFE; B[15:0]= #100 16'h0001; B[15:0]= #100 16'hFFFF; end initial begin CB[3:0]= #100 4'b0000; // add CB[3:0]= #100 4'b0000; CB[3:0]= #100 4'b0000; CB[3:0]= #100 4'b0000; CB[3:0]= #100 4'b0000; CB[3:0]= #100 4'b0000; CB[3:0]= #100 4'b0000; CB[3:0]= #100 4'b0000; end
このファイルを、シミュレーション時の "testfixture.test" ファイルとして 使用します。
このベクタを使用したシミュレーション結果は以下のようになります。
加算以外の命令も正しく動作するかどうか、テストベ クタを各自作成し確認してください。
ALUは完成しましたか?
ALUの演習はこれで終了です。お疲れさまでした。 レポートの課題を説明します。 >
Our mail address is
kite@arch.cs.kumamoto-u.ac.jp .
Last modified on