0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Verilog Testbench怎么寫 Verilog Testbench文件的編寫要點(diǎn)

FPGA之家 ? 來源:FPGA之家 ? 2023-08-01 12:44 ? 次閱讀

之前在使用VerilogFPGA項目中、以及其他一些不同的場合下,零散的寫過一些練手性質(zhì)的testbench文件,開始幾次寫的時候,每次都會因為一些基本的東西沒記住、寫的很不熟練,后面寫的時候稍微熟練了一點(diǎn)、但是整體編寫下來比較零碎不成體系,所以在這里簡要記錄一下一般情況下、針對小型的verilog模塊進(jìn)行測試時所需要使用到的testbench文件的編寫要點(diǎn)。

本文主要參考了在網(wǎng)上找到的Lattice公司的“A Verilog HDL Test Bench Primer”手冊中的有關(guān)內(nèi)容。謝謝!

模塊實例化、reg&wire聲明、initial和always塊的使用

需要測試的模塊(Verilog-module)被稱為DUT(Design Under Test),在testbench中需要對一個或者多個DUT進(jìn)行實例化。

Testbench中的頂層module不需要定義輸入和輸出。

Testbench中連接到DUT instance的輸入的為reg類型、連接到DUT instance的輸出的為wire類型。

對于DUT的inout類型變量,在testbench中需要分別使用reg、wire類型的變量進(jìn)行調(diào)用。

例如,對于下面這樣一個待測試module:

module bidir_infer (DATA, READ_WRITE);
input READ_WRITE ;
inout [1:0] DATA ;
reg [1:0] LATCH_OUT ;

always @ (READ_WRITE or DATA) begin
    if (READ_WRITE == 1)
        LATCH_OUT <= DATA;
end

assign DATA = (READ_WRITE == 1) ? 2'bZ : LATCH_OUT;

endmodule

為其設(shè)計的testbench文件可以是:

module test_bidir_ver;
reg read_writet;
reg [1:0] data_in;
wire [1:0] datat, data_out;
bidir_infer uut (datat, read_writet);

assign datat = (read_writet == 1) ? data_in : 2'bZ;
assign data_out = (read_writet == 0) ? datat : 2'bZ;

initial begin
read_writet = 1;
data_in = 11;
#50 read_writet = 0;
end

endmodule

和普通的Verilog模塊中一樣、使用assign對wire類型的變量進(jìn)行賦值。

需要留意的一點(diǎn)是:對于沒有在代碼中賦初始值的變量,wire類型變量被初始化為Z、reg類型變量被初始化為X。

always和initial是兩種對reg變量進(jìn)行操作的串行控制塊。每個initial和always塊都會在仿真開始時同時開始運(yùn)行。

常見的,可以利用它們生成模塊所需的時鐘和復(fù)位信號,如下:

‘timescale 1 ns / 100 ps

reg clk_50, rst_l;

initial
begin
$display($time, " << Starting the Simulation >>");
clk_50 = 1’b0; // at time 0
rst_l = 0; // reset is active
#20 rst_l = 1’b1; // at time 20 release reset
end

always
#10 clk_50 = ~clk_50; // every ten nanoseconds invert

首行定義了時間單位/時間精度。時間單位為1ns,這樣生成的clk_50時鐘周期就是20ns、也就是頻率為50MHz。

復(fù)位信號rst_l在初始為0復(fù)位態(tài)、在20ns之后為1解除復(fù)位。

仿真中的停止、變量監(jiān)視和輸出

有兩種仿真控制函數(shù):$finish和$stop。其中,$finish任務(wù)用于終止仿真并跳出仿真器;$stop任務(wù)則用于中止仿真。在Modelsim中,$stop任務(wù)則是返回到交互模式。

如果需要監(jiān)視仿真中某個變量的變化情況,可以使用$monitor函數(shù):

$monitor($time, " clk_50=%b, rst_l=%b, enable_l=%b, load_l=%b, count_in=%h, cnt_out=%h, oe_l=%b, count_tri=%h", clk_50, rst_l, enable_l, load_l, count_in, cnt_out, oe_l, count_tri);

每當(dāng)變量列表中的任一變量發(fā)生變化,就會產(chǎn)生輸出。

如果需要在仿真控制臺屏幕打印輸出,可以使用$display函數(shù):

$display($time, "<< count = %d - Turning OFF count enable >>",cnt_out);

任務(wù)Task的用法

可以將一組重復(fù)性的或者相關(guān)的命令組合到一起構(gòu)成一個任務(wù)。

任務(wù)通常可以在initial或者always塊中被調(diào)用。

一個任務(wù)可以擁有輸入、輸出、以及inouts,也可以包含計時或延時元素。

以一個在FPGA上實現(xiàn)的簡單SPI接口為例。外部設(shè)備為主、FPGA為從,命令一共32bit,構(gòu)成為“1位讀寫命令字(1讀0寫)+14位地址+1位NO CARE+16位數(shù)據(jù)”,片選信號拉低之后通信開始,時序如下圖:

a96c99fc-3006-11ee-9e74-dac502259ad0.png

數(shù)據(jù)流由外設(shè)到FPGA時(FPGA為接收),外設(shè)在SCLK的下降沿更新MOSI;FPGA在SCLK的上升沿將MOSI上的值抓取到移位寄存器。

當(dāng)FPGA為發(fā)送方時,F(xiàn)PGA在SCLK的下降沿更新MISO線上的輸出,外設(shè)在SCLK的上升沿將MISO上的值抓取過來。

外設(shè)可以通過該SPI接口訪問FPGA內(nèi)部生成的寄存器。

當(dāng)對FPGA上的spi模塊進(jìn)行讀測試時,外設(shè)發(fā)給FPGA的讀指令為:

{1'b1,address,1'b0,data(讀取到的16bit數(shù)據(jù))}

為此編寫的任務(wù)spi_read可以是:

task spi_read;
input[13:0]    address;
output[15:0]    data;
reg [31:0] output_register;
reg [15:0]input_register;
integer i;
    begin
       $display("time:%t----------------task spi_read",$time );
            #100;
            spi_clk = 1'b0;
            spi_csn = 1'b1;
            spi_mosi =1'b0;
            output_register = {1'b1,address,1'b0,16'd0};
            
            $display("time:%t,testbench read output_register: %h,",$time,output_register );
            $display("time:%t,testbench read address: %h",$time,address );
            
            spi_csn = 1'b1;
            for(i = 0 ; i < 16 ; i=i+1)
                begin
                    spi_csn = 1'b0;
                    spi_clk = 1'b0;
                    spi_mosi = output_register[31-i];
                    #100;
                    spi_clk = 1'b1;
                    #100;
                end
                
            for(i = 0 ; i < 16 ; i=i+1)
                begin
                    spi_csn = 1'b0;
                    spi_clk = 1'b0;
                    #100;
                    spi_clk = 1'b1;
                    input_register[15-i] = spi_miso;
                    #100;
                end
            spi_csn = 1'b1;
            
            
            data = input_register;
            $display("time:%t,testbench spi_read read data: %h,",$time,input_register );
            
            $display("time:%t----------------",$time );
            #100;
    end

endtask

(其中仿真的時間單位為1ns,spi時鐘頻率為10MHz)

示例及匯總

根據(jù)前述內(nèi)容,自我總結(jié)一般簡單的testbench文件的結(jié)構(gòu)形式可以是如下:

`timescale 1 ns / 1 ns

module testbench_module_top;
reg 
reg
……
wire
wire
……

//reset and clock definition
initial begin …end
initial begin …end

//actual testing flows
initial 
begin 
//variables initialization
a = 
b = 
…

task_1(var_1… var_N)
…
task_N(var_1… var_N)
$stop;
…end


//dut module instance
module_top U1
(
.var1(),
.var2(),
…
.varN()
)

//necessary control logic for testbench module test flow
always@(...)

//tasks definition
task task_1;
input …;
output …;
……
//action flow
……
endtask

……

task task_N;
……
endtask

endmodule

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21736

    瀏覽量

    603419
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2707

    瀏覽量

    47476
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110101
  • HDL
    HDL
    +關(guān)注

    關(guān)注

    8

    文章

    327

    瀏覽量

    47390
  • DUT
    DUT
    +關(guān)注

    關(guān)注

    0

    文章

    189

    瀏覽量

    12386

原文標(biāo)題:Testbench文件編寫紀(jì)要(Verilog)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    怎樣在Verilogtestbench測試VHDL模塊??

    怎樣在Verilogtestbench測試VHDL模塊??一個vhdl的工程模塊,怎么用verilog
    發(fā)表于 08-01 22:54

    testbench設(shè)置的問題

    本帖最后由 平漂流 于 2017-5-21 11:09 編輯 如圖,看Verilog仿真視頻教程里面,在testbench設(shè)置時候,直接復(fù)制“blocking_vlg_tst”到top
    發(fā)表于 05-21 11:04

    請問如何使用ISE verilogtestbench代碼測量程序的準(zhǔn)確功率?

    嗨,大家好,現(xiàn)在我正在努力測量程序的功能,我已經(jīng)有了verilog代碼和testbench,有誰知道如何從中獲取功率值?或任何相關(guān)信息? :)
    發(fā)表于 04-24 09:45

    verilog每日一練】testbench編寫基本結(jié)構(gòu)

    根據(jù)如下模塊,編寫對應(yīng)的testbench文件
    發(fā)表于 09-08 10:35

    怎樣testbench-xilinx

    怎樣testbench-xilinx  在ISE 環(huán)境中, 當(dāng)前資源操作窗顯示了資源管理窗口中選中的資源文件能進(jìn)行的相關(guān)操作。在資源管理窗口選中了 testbench
    發(fā)表于 02-09 13:46 ?64次下載

    編寫高效率的testbench

    編寫高效率的testbench,學(xué)習(xí)編寫測試文件的小伙伴們。
    發(fā)表于 05-11 16:40 ?16次下載

    怎樣用VHDLTESTBENCH

    一篇文章叫你學(xué)會用VHDLTESTBENCH
    發(fā)表于 11-23 11:52 ?11次下載

    testbench_book

    verilog Testbench
    發(fā)表于 12-13 22:20 ?3次下載

    如何使用VHDL實現(xiàn)testbench編寫

    大多數(shù)硬件設(shè)計人員對 verilogtestbench 比較熟悉,那是因為 verilog 被設(shè)計出來的目的就是為了用于測試使用,也正是因為這樣 verilog 的語法規(guī)則才被設(shè)
    發(fā)表于 12-14 08:00 ?17次下載

    VHDL與Verilog硬件描述語言如何用TestBench來進(jìn)行仿真

    TestBench來進(jìn)行仿真是一個很不錯的選擇。 VHDL與Verilog語言的語法規(guī)則不同,它們的TestBench的具體寫法也不同,但是應(yīng)包含的基本結(jié)構(gòu)大體相似,在VHDL的仿真文件
    的頭像 發(fā)表于 08-04 14:16 ?3824次閱讀

    使用Matlab和Verilog實現(xiàn)fibonacci序列包括源代碼和testbench

    使用Matlab和Verilog實現(xiàn)fibonacci序列包括源代碼和testbench(電源技術(shù)論壇app)-使用Matlab和Verilog實現(xiàn)fibonacci序列,包括源代碼和test
    發(fā)表于 09-16 14:41 ?13次下載
    使用Matlab和<b class='flag-5'>Verilog</b>實現(xiàn)fibonacci序列包括源代碼和<b class='flag-5'>testbench</b>

    Verilog testbench總結(jié)

    對于testbench而言,端口應(yīng)當(dāng)和被測試的module一一對應(yīng)。端口分為input,output和inout類型產(chǎn)生激勵信號的時候,input對應(yīng)的端口應(yīng)當(dāng)申明為reg, output對應(yīng)的端口申明為wire,inout端口比較特殊,下面專門講解。
    發(fā)表于 07-07 15:23 ?4660次閱讀

    testbench是什么? testbench測試的機(jī)制是什么?

    廢話不多說直接上干貨,testbench就是對的FPGA文件進(jìn)行測試的文件,可以是verilog也可以是VHDL。
    的頭像 發(fā)表于 06-28 16:44 ?4840次閱讀
    <b class='flag-5'>testbench</b>是什么? <b class='flag-5'>testbench</b>測試的機(jī)制是什么?

    VHDL與Verilog硬件描述語言TestBench編寫

    TestBench來進(jìn)行仿真是一個很不錯的選擇。VHDL與Verilog語言的語法規(guī)則不同,它們的TestBench的具體寫法也不同,但是應(yīng)包含的基本結(jié)構(gòu)大體相似,在VHDL的仿真文件
    的頭像 發(fā)表于 09-09 10:16 ?1746次閱讀
    VHDL與<b class='flag-5'>Verilog</b>硬件描述語言<b class='flag-5'>TestBench</b>的<b class='flag-5'>編寫</b>

    FPGA入門必備:Testbench仿真文件編寫實例詳解

    編寫完HDL代碼后,往往需要通過仿真軟件Modelsim或者Vivadao自帶的仿真功能對HDL代碼功能進(jìn)行驗證,此時我們需要編寫Testbench文件對HDL功能進(jìn)行測試驗證。
    發(fā)表于 04-29 10:43 ?2054次閱讀