[數字芯片]SystemVerilog與Modelsim自動化仿真


簡單Verilog編寫數字電路的各個模塊,必須伴隨着一testbench文件用作仿真驗證。簡單的module當然可以使用簡單的Verilog編寫一個testbench進行簡單的仿真,但一旦遇到功能較為復雜時,Verilog語言的靈活性不足C/C++這類語言。SystemVerilog作為一門針對驗證的面向對象的編程語言,能夠更好的描述時序,同時具有面向對象語言的靈活性以及重復使用性,能夠為工程仿真帶來許多便利。接下來,簡單使用SystemVerilog對序列檢測的module進行仿真驗證。

一、工程框架

本工程測試一個使用狀態機檢測“1110010”序列的module,包含五個文件,具體描述如下:

├── top.sv:頂層模塊,用以連接下列各個模塊
│  
│   ├── module_bfm.sv: 模塊的bus functional model,描述用以連接的interface
│  
│   ├── tester.sv: 產生仿真的時序信號
│  
│   ├── coverage.sv: 對模塊覆蓋率的檢測
│  
│   ├── module.v: 待仿真驗證的模塊

由於module是使用Verilog編寫的,不能直接使用Interface, 而需要按照Verilog的規范進行連接,而其余SV的module直接使用BFM連接。

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的interface使用

使用Verilog是對於module端口的連接,不管使用順序還是使用名稱連接都容易出錯以及極為繁瑣。SystemVerilog的interface有點類似C/C++的類,將模塊的整個端口信號封裝,讓其在module之間共享,十分方便,該出定義一個用於連接序列檢測module的端口。同時interface還能提供initial與task,以方便時鍾以及描述一些簡單信號的產生,這里描述時鍾、復位信號以及數據信號的交互。

//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用以采樣信號,進而測試所采的信號是否包含所有狀態。我們僅進行一個簡單的功能覆蓋率的例子,步驟可以簡單分為:1、定義coverage;2、采樣

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比特的state包含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   

四、測試器Tester

這里測試器比較簡單,只是復位一下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仿真步驟可以大概分為編譯與仿真,仿真每次編譯、添加波形、仿真十分繁瑣。可以編寫do腳本進行自動化仿真,do文件如下:

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驗證 測試平台編寫指南
Ray Salemi, The UVM Primer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM