moerjielovecookie

Sawen_Blog

一个普通工科牲的博客网站
x
github
follow
email

Testbenchシミュレーションスクリプト作成ガイド

Note

Quartus の VWF シミュレーションは非常に短い時間しかシミュレーションできず、Vivado シミュレーションの際にも励起信号を追加する必要があるため、テストベンチファイルを作成して励起シミュレーションを行う必要があります。

テストベンチファイル構造#

テストベンチを作成する目的は、モジュールの機能や性能が設計の期待に合致しているかをテストすることです。設計の機能を検証するためのステップは以下の通りです:

  1. 適切な励起波形を生成する:この励起は通常、測定対象の HDL モジュールが生成する可能性のあるすべての入力状態をカバーする必要があります;
  2. 生成した励起信号を DUT に追加し、その応答を観察する:すなわち DUT モジュールをインスタンス化したテストベンチ内でシミュレーションテストを実行します;
  3. 出力の応答を期待値と比較します。
    テストベンチの構造は一般的に以下のようになります:
    ``
module Test_bench_name();
// 01:信号または変数の宣言定義
// --論理設計における入力は reg 型に対応
// --論理設計における出力は wire 型に対応
// 02:ini[ti](https://bbs.elecfans.com/group_715)al または always 文を使用して励起を生成
// 03:テスト対象の DUT モジュールをインスタンス化
// 04:出力応答を監視および比較
endmodule

コード例#

クロック励起入力例#

/*----------------------------------------------------------------
クロック励起生成方法一:50% デューティサイクルのクロック
----------------------------------------------------------------*/
parameter ClockPeriod=10; // パラメータ化されたクロック周期
initial
  begin
    clk_i=0;
    forever#(ClockPeriod/2) clk_i = ~clk_i;
end


/*----------------------------------------------------------------
クロック励起生成方法二:50% デューティサイクルのクロック
----------------------------------------------------------------*/
initial
begin
  clk_i=0;
end
always #(ClockPeriod/2) clk_i=~clk_i;


/*----------------------------------------------------------------
クロック励起生成方法三:固定数のクロックパルスを生成
----------------------------------------------------------------*/
parameter ClockPeriod=10; // パラメータ化されたクロック周期
initial
begin
  clk_i=0;
  repeat(6)
  #(ClockPeriod/2) clk_i=~clk_i;
end


/*----------------------------------------------------------------
クロック励起生成方法四:非デューティサイクルが 50% のクロックを生成
----------------------------------------------------------------*/
parameter ClockPeriod=10; // パラメータ化されたクロック周期
initial
begin
clk_i=0;
forever
  begin
    #((ClockPeriod/2)-2) clk_i=0;
    #((ClockPeriod/2)+2) clk_i=1;
    end
end

リセット励起入力例#

/*---------------------------------------------------------------- 
リセット信号生成方法一:非同期リセット
----------------------------------------------------------------*/
initial
begin
  [rs](https://www.elecfans.com/tags/rs/)t_n_i=1;
  #100; rst_n_i=0;
  #100; rst_n_i=1; 
end
/*---------------------------------------------------------------- 
リセット信号生成方法二:同期リセット
----------------------------------------------------------------*/
initial
begin
  rst_n_i=1; clk_i = 0;
  @(negedge clk_i)
  rst_n_i=0;
  #100; // 固定時間リセット
  repeat(10) @(negedge clk_i); // 固定周期数リセット
  @(negedge clk_i)
  rst_n_i=1; 
end
always #5 clk_i=~clk_i;


/*---------------------------------------------------------------- 
リセット信号生成方法三:リセットタスクの封装
----------------------------------------------------------------*/
task reset;
input [31:0] reset_time; // リセット時間は調整可能、リセット時間を入力
  RST_ING=0; // リセット方式は調整可能、低電圧または高電圧
  begin
    rst_n=RST_ING; // リセット中
    #reset_time; // リセット時間
    rst_n_i=~RST_ING; // リセットを解除、リセット終了
  end
endtask

シミュレーション制御文とシステムタスクの説明#

``

/*---------------------------------------------------------------- 
シミュレーション制御文およびシステムタスクの説明
----------------------------------------------------------------*/
$stop  // シミュレーションを停止、modelsim でシミュレーションを続行可能
$stop(n) // パラメータ付きシステムタスク、パラメータ 0,1 または 2 に応じてシミュレーション情報を出力
$finish // シミュレーションを終了、シミュレーションを続行不可
$finish(n) // パラメータ付きシステムタスク、パラメータ 0,1 または 2 に応じてシミュレーション情報を出力
//0: 何の情報も出力しない
//1: 現在のシミュレーション時刻と位置を出力
//2: 現在のシミュレーション時刻、位置、およびシミュレーション中に使用されたメモリと CPU 時間の統計を出力
$random // ランダム数を生成
$random % n // -n から n の範囲のランダム数を生成
{$random} % n // 0 から n の範囲のランダム数を生成
/*----------------------------------------------------------------

テキスト読み込み#

/*---------------------------------------------------------------- 
テキスト入力方法:$readmemb/$readmemh
----------------------------------------------------------------*/
$readmemb/$readmemh("<データファイル名>",<メモリ名>);
$readmemb/$readmemh("<データファイル名>",<メモリ名>,<開始アドレス>);
$readmemb/$readmemh("<データファイル名>",<メモリ名>,<開始アドレス>,<終了アドレス>);
$readmemb:/* バイナリデータを読み込み、ファイル内容は空白位置、コメント行、バイナリ数のみを含むことができる
データにはビット幅の説明や形式の説明を含めることはできず、各数字はバイナリ数字でなければならない。*/
$readmemh:/* 16進数データを読み込み、ファイル内容は空白位置、コメント行、16進数のみを含むことができる
データにはビット幅の説明や形式の説明を含めることはできず、各数字は16進数でなければならない。*/
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。