03 testbench中一些常用语法

testbench中一些常用语法

时钟激励设计

/*-------------------------------------
	时钟激励产生方法一:50% 占空比时钟(forever关键字)
-------------------------------------*/
parameter ClockPeriod = 10;
initial begin
    clk = 0;
    forever
        #(ClockPeriod/2) clk = ~clk;
end

/*-------------------------------------
	时钟激励产生方法二:50% 占空比时钟(always关键字)
-------------------------------------*/
parameter ClockPeriod = 10;
initial begin
    clk = 0;
end
always #(ClockPeriod/2) clk = ~clk;

/*-------------------------------------
	时钟激励产生方法三:产生固定数量的时钟脉冲(repeat 关键字)
-------------------------------------*/
parameter ClockPeriod = 10;
initial begin
    clk = 0;
    repeat(9)
        #(ClockPeriod/2) clk = ~clk;    
end

/*-------------------------------------
	时钟激励产生方法四:产生非占空比为50%的时钟(30%)
-------------------------------------*/
parameter ClockPeriod = 10;
initial begin
    clk = 0;
    forever begin
        #(ClockPeriod/2-2) clk = 1;
        #(ClockPeriod/2+2) clk = 0;
    end    
end

复位信号设计

  1. 异步复位

    异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位

    /*----------------------------------------------------------------
    		复位信号产生方法一:异步复位信号
    ----------------------------------------------------------------*/
    initial begin
        rst_n=1;
        #100;
        rst_n=0;
        #100;
        rst_n=1;
    end
    
  2. 同步复位

    同步复位就是指复位信号只有在时钟上升沿到来时,才能有效

    /*----------------------------------------------------------------
    		复位信号产生方法二:同步复位信号
    ----------------------------------------------------------------*/
    initial begin
        rst_n=1;
        @(negedge clk)
        rst_n=0;
    	#100; //固定时间复位
        repeat(10) @(negedge clk); //固定周期数复位(10个时钟后复位)
    	@(negedge clk)
    	rst_n=1;
    end
    

同步复位和异步复位的区别在于前者的复位信号不能出现在always语句的敏感列表中

仿真控制语句及系统任务描述

/*----------------------------------------------------------------
仿真控制语句及系统任务描述
----------------------------------------------------------------*/
$stop //停止运行仿真,modelsim 中可继续仿真
$stop(n) //带参数系统任务,根据参数0,1 或2 不同,输出仿真信息
$finish //结束运行仿真,不可继续仿真
$finish(n) //带参数系统任务,根据参数0,1 或2 不同,输出仿真信息
//0:不输出任何信息
//1:输出当前仿真时刻和位置
//2:输出当前仿真时刻、位置和仿真过程中用到的memory 以及CPU 时间的统计
$random //产生随机数
$random % n //产生范围-n 到n 之间的随机数
{$random} % n //产生范围0 到n 之间的随机数

/*----------------------------------------------------------------
仿真终端显示描述
----------------------------------------------------------------*/
$monitor //仿真打印输出,打印出仿真过程中的变量,使其终端显示
        /*
        $monitor($time,,,"clk=%d reset=%d out=%d",clk,reset,out);
        */
$display //终端打印字符串,显示仿真结果等
        /*
        $display(” Simulation start ! ");
        $display(” At time %t,input is %b%b%b,output is %b",$time,a,b,en,z);
        */
$time //返回64 位整型时间
$stime //返回32 位整型时间
$realtime //实行实型模拟时间

/*----------------------------------------------------------------
文本输入方式:$readmemb/$readmemh
----------------------------------------------------------------*/
//激励具有复杂的数据结构
//verilog 提供了读入文本的系统函数
$readmemb/$readmemh("<数据文件名>",<存储器名>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
$readmemb:/*读取二进制数据,读取文件内容只能包含:空白位置,注释行,二进制数
			数据中不能包含位宽说明和格式说明,每个数字必须是二进制数字。*/
$readmemh:/*读取十六进制数据,读取文件内容只能包含:空白位置,注释行,十六进制数
			数据中不能包含位宽说明和格式说明,每个数字必须是十六进制数字。*/

		 /*当地址出现在数据文件中,格式为@hh...h,地址与数字之间不允许空白位置,
			可出现多个地址*/

eg:
module test_tb();
    reg [7:0] memory[0:5];//声明 6 个 8 位存储单元
    integer i;
    initial begin
        $readmemh("mem.dat",memory);//读取系统文件到存储器中的给定地址
        //显示此时存储器内容
        for(i=0;i<6;i=i+1)
        	$display("Memory[%d]=%h",i,memory[i]);
    end
endmodule
/*mem.dat 文件内容
    @001
    AB CD
    @003
    A1
    @004 AA
    08
    09
*/

//仿真输出为
	Memory[          0]=xx
	Memory[          1]=ab
	Memory[          2]=cd
	Memory[          3]=a1
	Memory[          4]=aa
	Memory[          5]=08

注:

  1. Testbench 中@与wait:@使用沿触发,wait使用电平触发;
  2. 封装有用且常用的testbench,testbench 中可以使用task 或function 对代码进行封装,下次利用时灵活调用即可;
  3. 如果待测试文件中存在双向信号 (inout) 需要注意,需要一个reg 变量来表示输入,一个wire 变量表示输出;
  4. 单个initial 语句不要太复杂,可分开写成多个initial 语句,便于阅读和修改;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值