Verilog的testbench入門


基礎知識

Test bench即Verilog需要編寫的測試文件。在module設計完成、綜合之后我們需要通過測試文件完成對設計module的測試。

Test bench大致分為下面三個部分:

  • 時鍾控制 clock control

一般采用always實現

  • 實例化instantiate要測試的module

  • 對實例的輸入賦值

    與待測模塊的接口:

  • 與輸出端口相連接的變量定義為reg

  • 與輸出端口相連的定義為wire

初始化變量

Verilog中使用initialblock初始化變量。

時鍾的產生

always # 10 clk=~clk; 產生時鍾

initial repeat(13) #5 clk=~clk

控制只產生13個時鍾

同步數據

initial forever @ (posedge clk) #3 x=$random;

為了降低多個輸入同時翻轉的概率,對時序電路的輸入一般采用素數作為時間間隔

隨機數據

initial repeat(5) #7 x=$random;

a=$random%60; //產生-59到59之間的隨機數

a={$random}%60; //產生0到59之間的隨機數

產生隨機事件間隔

always begin
    t=$random
    #(t) x=$random;
    end 

數據緩存

initial buffer = 16'b1110_0001_1011_0101;//將測試數據進行初始化
always@(posedge clk)
    #1 {x,buffer}={buffer,x}//可以在控制的數據下輸入信號x

## 讀取數據文件 ##

reg [7:0] mem1[0:1024];//定義一個1KB的存儲
initial begin
    $readmemh(data1.dat,mem1)

簡單的實例

`timescale 1ns / 10ps
`include "adder.v"
module test;

    // Inputs
    reg a,b;
    wire sum,count;

    // 實例化待測試模塊
    add uut (
        .sum(sum),
        .c(count), 
        .b(b), 
        .a(a)
    );

    initial begin
        // Initialize Inputs
        a=0;
        //沒經過20個單位時間,a取反
        forever #20 a=~a;
    end

    initial begin
        // Initialize Inputs
        b=0;
        //沒經過10個單位時間,b取反
        forever #10 b=~b;
    end

    initial begin
        //監控輸出
        $monitor()$time,,,"%d+%d={%d,%d}",a,b,count,sum;
        #40 $stop;
    end
endmodule

Tip

  • $monitor 出輸出打印顯示

  • $stop 停止當前仿真

  • ¥finish 結束仿真

時鍾產生

  • 使用initial語句
reg clock;
initial begin
    clock=0;
    forever #10 clock=~clock;
end
  • 使用always語句
reg clock;
initial
    clock=0;
always
    #10 clock=~clock;


免責聲明!

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



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