精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog Testbench怎么寫 Verilog Testbench文件的編寫要點

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

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

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

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

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

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

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

對于DUT的inout類型變量,在testbench中需要分別使用reg、wire類型的變量進行調用。

例如,對于下面這樣一個待測試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

為其設計的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類型的變量進行賦值。

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

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

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

‘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。

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

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

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

如果需要監(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);

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

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

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

任務Task的用法

可以將一組重復性的或者相關的命令組合到一起構成一個任務。

任務通常可以在initial或者always塊中被調用。

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

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

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

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

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

外設可以通過該SPI接口訪問FPGA內部生成的寄存器。

當對FPGA上的spi模塊進行讀測試時,外設發(fā)給FPGA的讀指令為:

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

為此編寫的任務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ù)前述內容,自我總結一般簡單的testbench文件的結構形式可以是如下:

`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

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

    關注

    1626

    文章

    21665

    瀏覽量

    601803
  • 模塊
    +關注

    關注

    7

    文章

    2670

    瀏覽量

    47340
  • Verilog
    +關注

    關注

    28

    文章

    1343

    瀏覽量

    109980
  • HDL
    HDL
    +關注

    關注

    8

    文章

    327

    瀏覽量

    47336
  • DUT
    DUT
    +關注

    關注

    0

    文章

    189

    瀏覽量

    12337

原文標題:Testbench文件編寫紀要(Verilog)

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

收藏 人收藏

    評論

    相關推薦

    怎樣在Verilogtestbench測試VHDL模塊??

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

    testbench設置的問題

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

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

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

    verilog每日一練】testbench編寫基本結構

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

    怎樣testbench-xilinx

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

    編寫高效率的testbench

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

    怎樣用VHDLTESTBENCH

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

    testbench_book

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

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

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

    VHDL與Verilog硬件描述語言如何用TestBench來進行仿真

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

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

    使用Matlab和Verilog實現(xiàn)fibonacci序列包括源代碼和testbench(電源技術論壇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總結

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

    testbench是什么? testbench測試的機制是什么?

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

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

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

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

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