[デジタルチップ] SystemVerilogのシミュレーションと自動化ModelSimの

簡単なデジタル回路で書かれたVerilogのモジュールは、シミュレーションとテストベンチファイルを添付しなければなりません。もちろん、単純なモジュールは、単純なVerilogのテストベンチ・シミュレーション・シンプルを書き込むために使用することができますが、機能はより複雑な経験になると、柔軟性のVerilog言語は確かに少ないC / C ++などの言語よりもあります。オブジェクト指向の検証のためのプログラミング言語のSystemVerilog、より良いタイミングを記述するだけでなく、オブジェクト指向言語と再利用の柔軟性を持ってするように、エンジニアリングシミュレーションのための利便性の多くをもたらすことができます。次に、シミュレーションのための簡単なシーケンスのSystemVerilog検出モジュールを使用しました。

まず、プロジェクトのフレームワーク

プロジェクトのテストモジュールは、ステートマシンのシーケンス「1110010」を検出には、次のように説明した5つのファイルを、含まれています。

├──top.sv:以下のモジュールの各々を接続するための上部モジュール
│  
│├──module_bfm.sv:バスファンクションモデルモジュールインタフェースは、接続のために記載されている
│  
発生タイミングシミュレーション:│├──tester.svを信号
│  
│├──coverage.sv:検出モジュールカバレッジ
│  
│├──module.v:なるようにシミュレーションモジュール

モジュールがVerilogで書かれているので、インタフェースは、直接使用されず、SVモジュールの残りの部分は、直接接続されたBFMながら必要性は、Verilogの仕様に接続されます。

module top();
    seq_fsm_bfm bfm();
    coverage converage_i(bfm);
    tester tester_i(bfm);
    seq_fsm seq_fsm_i(
        .in(bfm.in),
        .out(bfm.out),
        .state(bfm.state),
        .clk(bfm.clk),
        .reset(bfm.rst_n)
    );
endmodule

二、使用するのSystemVerilogのインターフェース

使用したVerilogモジュールは、ポートに接続されているにかかわらず、使用の順序または名前を使用するのは非常に退屈でエラーが発生しやすい接続されています。SystemVerilogのインターフェースは、共有モジュールとの間に配列中の検出モジュールに接続するためのポートを規定する、非常に容易であるように、C / C ++クラス、パッケージ全体のモジュールポート信号に幾分類似しています。また、初期およびタスクインターフェースを提供しながら、クロック信号と簡単な説明、本明細書に記載のインタラクティブクロック、リセット信号及びデータ信号を生成する容易にします。

//Bus Functional Model
interface seq_fsm_bfm();
    logic clk;
    logic in;
    logic out;
    logic[0:2] state;
    logic rst_n;
    initial begin
         clk=0;
         forever  #10 clk = ~clk;
    end
    task reset();
        rst_n = 0;
        @(posedge clk);
        @(posedge clk);
        rst_n = 1;
    endtask
    task send_data(bit in_data);
        @(posedge clk) in = in_data; 
    endtask
endinterface //seq_fsm_interface

第三に、機能カバレッジ

coverpointを定義するサンプリング実際の信号のための機能的カバレッジ、さらにテスト信号は、すべての回復可能な状態を含んでいます。2、サンプリング; 1、カバレッジの定義:機能的カバレッジの単純な例として、我々は、工程が簡単に分けることができます。

module coverage(seq_fsm_bfm bfm);

logic in;
logic out;
logic[2:0] state;

covergroup  cg_cov;
    coverpoint in;
    coverpoint out;
    coverpoint state;
endgroup

cg_cov oc;
initial begin
    oc = new();
    forever begin
        @(posedge bfm.clk);
        in  = bfm.in;
        out = bfm.out;
        state = bfm.state;
        oc.sample(); 
    end
end
endmodule

coverpointデフォルトはすべての状態、すなわち、状態3又はそれ以上のビットが8つの状態を含み、「000」、「001」、「010」を含む......、のためのより多くの状態の一部、使用負またはリスト。次のように結果のカバレッジレポートを使用します:

# COVERGROUP COVERAGE:
# ----------------------------------------------------------------------------------------------------
# Covergroup                                             Metric      Goal/ Status                    
#                                                                 At Least                           
# ----------------------------------------------------------------------------------------------------
#  TYPE /top/converage_i/cg_cov                          100.0%        100 Covered                   
#     Coverpoint cg_cov::in                              100.0%        100 Covered                   
#     Coverpoint cg_cov::out                             100.0%        100 Covered                   
#     Coverpoint cg_cov::state                           100.0%        100 Covered                   
#  Covergroup instance \/top/converage_i/oc              100.0%        100 Covered                   
#     Coverpoint in                                      100.0%        100 Covered                   
#         covered/total bins:                                 2          2                           
#         missing/total bins:                                 0          2                           
#         bin auto['b0]                                     498          1 Covered                   
#         bin auto['b1]                                     502          1 Covered                   
#     Coverpoint out                                     100.0%        100 Covered                   
#         covered/total bins:                                 2          2                           
#         missing/total bins:                                 0          2                           
#         bin auto['b0]                                     994          1 Covered                   
#         bin auto['b1]                                       4          1 Covered                   
#     Coverpoint state                                   100.0%        100 Covered                   
#         covered/total bins:                                 8          8                           
#         missing/total bins:                                 0          8                           
#         bin auto['b000]                                   394          1 Covered                   
#         bin auto['b001]                                   222          1 Covered                   
#         bin auto['b010]                                   127          1 Covered                   
#         bin auto['b011]                                   142          1 Covered                   
#         bin auto['b100]                                    64          1 Covered                   
#         bin auto['b101]                                    31          1 Covered                   
#         bin auto['b110]                                    14          1 Covered                   
#         bin auto['b111]                                     4          1 Covered   

第四に、テスターテスター

ここで、テスターは、比較的単純であるが、リセットBFM 01でランダム信号を生成します。

module tester(seq_fsm_bfm bfm);
    initial begin
        bit in_data;
        bfm.reset();
        repeat(1000) begin
           // $display("@%0t\n",$time);
            in_data = ($random) %2;
            bfm.send_data(in_data);
        end
    $stop;
    end
endmodule

五、ModelSimでのシミュレーションの自動化

ModelSimのシミュレーションステップはおおよそコンパイルおよびシミュレーション、シミュレーションの各時間コンパイラに分割することができ、波形シミュレーションは非常に面倒である加えます。あなたは、次の書類を行い、シミュレーションを行う自動化するスクリプトを書くことができます。

if [file exists "work"] {vdel -all}
vlib work

vlog top.sv tester.sv seq_fsm_bfm.sv coverage.sv seq_fsm.v #编译文件,注意路径,这里与do文件同目录

vopt top -o top_optimized +acc +cover=sbfec+seq_fsm(rtl).  #指定顶层文件,优化
vsim top_optimized -coverage                               #开始仿真

set NoQuitOnFinish 1
onbreak {resume}
log /* -r

add wave seq_fsm_i/*                                       #添加波形
run -all
vcover report seq_fsm.ucdb -cvg -details                   #报告覆盖率

良いrun.doファイルを書き込み、Linuxで直接実行

vsim -do run.do

参考:
クリス・スピア、ガイドラインの作成のSystemVerilog検証テストベンチ
レイSalemiの、UVM入門

おすすめ

転載: www.cnblogs.com/dzqiu/p/12445191.html