Modelsim仿真——测试文件编写

目录

  • 1、基本架构
  • 2、task简介
  • 3、触发条件控制符 @ 和 wait
  • 4、常用仿真控制语句(系统函数)
  • 5、文本输入

1、基本架构

/*================================================*\
		  Filename ﹕ 
			Author ﹕ Adolph
	  Description  ﹕ 仿真设计文件基本架构
		 Called by ﹕ 
Revision History   ﹕ 2022-4-24 
		  			  Revision 1.0
  			  Email﹕ 
			Company﹕ 
\*================================================*/
`timescale 1ns/1ns 		//仿真系统时间尺度定义——>仿真系统时间单位和时间精度

`define clk_period 20  	//时钟周期参数定义	20ns ——> 50MHz

module /*这里输入模块名称*/(); 
//激励信号定义  
	reg				Clk		; 
	reg				Rst_n	; 
	reg				in 		; 
	
//响应信号定义	  
	wire			out		; 
	
//实例化
	my_design 	my_design(
		.clk  		(Clk   	),
		.rst_n		(Rst_n 	),
		.in   		(in    	),
		.out  		(out   	)
	);	

//产生时钟							       		 
	initial Clk = 1'b0;		       		 
	always #(`clk_period / 2) Clk = ~Clk;  		 

//产生激励	 
	initial  begin	 
		Rst_n = 1'b0;	 
		in	  = 1'b0;
		#(`clk_period * 10 + 3);	 
		Rst_n = 1'b1;	 
		#(`clk_period * 10);
		in	 = 1'b1;
		repeat(10)begin
			in = ${random} % 2;
			#`clk_period;
		end 
		#(`clk_period * 10);
		$stop; //暂停仿真
	end	 

endmodule 

2、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  [07:0]     a;
    input  [07:0]     b;
    input  [31:0]     times;
    output [08:0]     c;
    begin
        repeat(times) @(posedge clk)         //等待 times 个时钟上升沿
        c=a+b;
    end
endtask

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

3、触发条件控制符 @ 和 wait

/* @为边沿触发 */
initial begin
    start = 1;
    repeat(5) @(posedge clk)	//等待5个时钟上升沿
    start = 0;
end

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

4、常用仿真控制语句(系统函数)

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

$stop           //停止运行仿真,Modelsim 中可继续仿真
$finish         //结束运行仿真,Modelsim 中不可继续仿真

$stop(n)        //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
$finish(n)      //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
/*------------------------------------------------------------------------*\
    0:不输出任何信息
    1:输出当前仿真时刻和位置
    2:输出当前仿真时刻、位置和仿真过程中用到的 memory 以及 CPU 时间的统计
	Ps:不带参数时,其打印结果请读者自行探索
\*------------------------------------------------------------------------*/

//仿真终端显示描述

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

5、文本输入

$readmemb/$readmemh("<数据文件名>",<存储器名>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);

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

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

/*------------------------------------------------------------------------*\
    //mem.dat 文件内容
    @001
    AB CD
    @003
    A1
\*------------------------------------------------------------------------*/
reg [7:0]     memory[7:0]    ;//声明 8 个 8 位存储阵列
integer       i              ;

initial begin
    $readmemh("mem.dat",memory);//读取系统文件到存储器中的给定地址
    for(i=0;i<4;i=i+1)
        $display("Memory[%d]=%h",i,memory[i]);
end

/*------------------------------------------------------------------------*\
    //仿真输出为
    Memory[0] = xx;
    Memory[1] = AB;
    Memory[2] = CD;
    Memory[3] = A1;
\*------------------------------------------------------------------------*/

参考:

	博客园,咸鱼FPGA

你可能感兴趣的:(FPGA学习,Verilog,testbench编写,Modelsim仿真)