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