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/======如有问题请联系删除谢谢