testbench常用语法总结

1.testbench总体代码结构

`timescale 1ns/1ps  	//时间精度
`define clk_perilod 20	//时钟周期可变

module test_file_tb;

//==================<端口>==================================================
reg                         clk                 ; //时钟,50Mhz
reg                         rst_n               ; //复位,低电平有效
reg  [XX:0]                 in                  ; //
wire [XX:0]                 out                 ; //

//--------------------------------------------------------------------------
//--    模块例化
//--------------------------------------------------------------------------
my_design u_my_design
(
    .clk                    (clk                ),
    .rst_n                  (rst_n              ),
    .in                     (in                 ),
    .out                    (out                )
);

//----------------------------------------------------------------------
//--    时钟信号和复位信号
//----------------------------------------------------------------------
initial begin
    clk = 0;
    forever
        #(`Clock/2) clk = ~clk;
end

initial begin
    rst_n = 0; #(`Clock*20+1);
    rst_n = 1;
end

//----------------------------------------------------------------------
//--    设计输入信号
//----------------------------------------------------------------------
initial begin
    in = 0;
    #(`Clock*20+2); //初始化完成

    $stop;
end

endmodule在这里插入代码片

2.时钟激励的编写

`timescale 1ns/1ps  //时间精度
`define    Clock 20 //时钟周期

//==========================================================================
//==    方法一,50%占空比
//==========================================================================
initial begin
    clk = 0;
    forever
        #(`Clock/2) clk = ~clk;
end

//==========================================================================
//==    方法二,50%占空比
//==========================================================================
initial begin
    clk = 0;
    always
        #(`Clock/2) clk = ~clk;
end

//==========================================================================
//==    方法三,产生固定输入的时钟脉冲
//==========================================================================
initial begin
    clk = 0;
    repeat(6)
        #(`Clock/2) clk = ~clk;
end

//==========================================================================
//==    方法四,非50%占空比
//==========================================================================
initial begin
    clk = 0;
    forever begin
        #((`Clock/2)-2) clk = 0;
        #((`Clock/2)+2) clk = 1;
    end
end

3.复位信号

`timescale 1ns/1ps  //时间精度
`define    Clock 20 //时钟周期

//==========================================================================
//==    方法一,异步复位
//==========================================================================
initial begin
    rst_n = 0; #(`Clock*20+1);
    rst_n = 1;
end

//==========================================================================
//==    方法二,同步复位
//==========================================================================
initial begin
    rst_n = 0; #(`Clock*20);
    rst_n = 1;
end

4.task使用

//==========================================================================
//==    输入信号任务封装
//==========================================================================
task i_data;
    input [7:0] dut_data;
    begin
        @(posedge data_en); send_data=0;
        @(posedge data_en); send_data=dut_data[0];
        @(posedge data_en); send_data=dut_data[1];
        @(posedge data_en); send_data=dut_data[2];
        @(posedge data_en); send_data=dut_data[3];
        @(posedge data_en); send_data=dut_data[4];
        @(posedge data_en); send_data=dut_data[5];
        @(posedge data_en); send_data=dut_data[6];
        @(posedge data_en); send_data=dut_data[7];
        @(posedge data_en); send_data=1;
        #100;
    end
endtask

//调用方法:i_data(8'hXX);

//==========================================================================
//==    多输入信号任务封装
//==========================================================================
task more_input;
    input  [ 7:0]     a;
    input  [ 7:0]     b;
    input  [31:0]     times;
    output [ 8:0]     c;
    begin
        repeat(times) @(posedge clk)         //等待 times 个时钟上升沿
        c=a+b;
    end
endtask

//调用方法:more_input(x,y,t,z); //按声明顺序

5.repeat ,wait函数

//==========================================
//==    repeat重复执行
//==========================================
initial begin
    start = 1;
    repeat(5) @(posedge clk)    //等待5个时钟上升沿
    start = 0;
end

initial begin
	repeat(10)begin
		...//执行10次
	end 
end

//===========================================
//==    wait为电平触发
//==========================================
initial begin
    start = 1;
    wait(en);                     //等待en==1
    start = 0;
end

6.随机数产生

$random         //产生随机数
$random % n     //产生范围 {-n,n} 的随机数
{$random} % n   //产生范围 { 0,n} 的随机数

7.文本输入输出

reg [a:0] data_mem [0:b];  //定义位宽为(a+1)深度为(b+1)的存储器
$readmemb/$readmemh("<读入文件名>",<存储器名>);
$readmemb/$readmemh("<读入文件名>",<存储器名>,<起始地址>);
$readmemb/$readmemh("<读入文件名>",<存储器名>,<起始地址>,<结束地址>);

$readmemb
/*------------------------------------------------------------------------*\
  读取二进制数据,读取文件内容只能包含:空白位置,注释行,二进制数
  数据中不能包含位宽说明和格式说明,每个数字必须是二进制数字。
\*------------------------------------------------------------------------*/

$readmemh
/*------------------------------------------------------------------------*\
  读取十六进制数据,读取文件内容只能包含:空白位置,注释行,十六进制数
  数据中不能包含位宽说明和格式说明,每个数字必须是十六进制数字.
\*------------------------------------------------------------------------*/
//==========================================================================
//==    输出txt文件
//==========================================================================
integer fp_write;                                  //定义
	initial  begin
		begin
			fp_write = $fopen("output.txt");  //打开输出文件
			begin
				$fwrite(fp_write, "\n%h", output_data); //写入数据16进制
				#(`clk_period);
			end
		end
		$fclose(fp_write);   //关闭文件,不可少
end

8.打印信息

$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     //实行实时模拟时间

================================================部分转载自https://www.cnblogs.com/xianyufpga/======如有问题请联系删除谢谢

  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值