概述
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/======如有问题请联系删除谢谢
最后
以上就是迷路往事为你收集整理的testbench常用语法总结的全部内容,希望文章能够帮你解决testbench常用语法总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复