您的位置:首页 > 其它

Verilog设计与验证 学习笔记4 Testbench编写

2019-02-25 19:22 162 查看

Verilog设计与验证 学习笔记4 Testbench编写

编写仿真激励的注意事项:

一. 仿真激励与被测对象的连接
二. 使用initial语句和always语句

always语句是在被动检测响应的时候使用,即在一些条件发生时才能执行,比如:

always @(posedge clk)
begin
sigA	=	sigB;
...
end

initial语句是在主动产生激励时使用,如果希望在initial里面多次执行一个语句块,可以再initial里面 嵌入循环语句,(如while,repeat,for和forever),比如:

initial
begin
forever
begin
...
end
end
三. 时钟,复位的写法
  1. 普通时钟信号
    //用initial语句产生一个周期为10的时钟

    parameter	FAST_P	=	10;
    reg	clk;
    initial
    begin
    clk	=	0;
    forever
    #	(FAST_P/2)	clk	=	~clk;
    end

    //用always语句产生一个周期为10的时钟

    parameter	FAST_P	=	10;
    reg	clk;
    initial
    clk	=	0;//初始化clk为0
    always
    #	(FAST_P/2)	clk	=	~clk;
  2. 固定数目的时钟信号
    如果需要产生固定数目的时钟脉冲,可以在initial语句中使用repeat语句实现:
    //两个高脉冲的时钟脉冲

    parameter	PulseCoun
    4000
    t	=	4,FAST_PERIOD	=	10;
    reg	clk;
    initial
    begin
    clk	=	0;
    repeat	(PulseCount)
    # 	(FAST_PERIOD/2)	clk	=	~clk;
    end
  3. 相移时钟信号

    assign # PHASE _SHIFT	sigB	=	sigA;//将信号A的波形右移PHASE_SHIFT时间,得到信号B,其中,sigA为寄存器变量,sigB为线网变量
四.几个简单的系统函数
  1. display语句,在仿真器中打印出地址和数据

    $display	("Addr	:	%b	->	DataWrite	:	&d",Mpi_addr,Data_out);
  2. 利用时序检查的系统任务来检查时序

    $setup		(Sig_D	,	posedge clk	,	1);	//如果在clk上升沿到达之前的1ns之内Sig_D发生跳变,则将给出建立时间违反警告
    $hold		(posedge	clk	,	Sig_D	,	0.1); //如果在clk上升沿到达之后的0.1ns内,Sig_D发生跳变,则将发出保持时间违反警告
  3. randow系统函数产生激励数据

    Data_out	=	{$randow}	%	256;	//产生0-255之间的数据
  4. $time 系统函数可以返回当前的仿真时间,协助仿真

五. 从文本文件中读出和写入数据
  1. 将文件 File_1 中的数据读入Data数组中

    reg	[7:0]	Data	[0:47];	//定义一个二维数组
    $readmemh	("File_1.txt"	,	Data);
  2. 向文件 File_2 中写入数据:

    integer	File_2; //定义一个整数的文件指针
    File_2	=	$fopen("File_2.txt"); //打开文件
    $fdisplay	(File_2 , "@%h\n%h" , addr , data_in);//向文件中写入内容
    $fclose	(File_2); //关闭文件

    一般步骤为:定义文件指针,利用指针,将文件打开,向指针写入内容,关闭文件指针。

六. 并行激励

fork join语法结构,在仿真的某个时刻同时启动多个任务
在仿真开始后的100ns后,如果希望同时启动和接收任务,而不是发送完毕后进行接收:

initial
begin
#100;
fork//
Send_task;
Receive_task;
join
end
七.封装功能模块
  1. 任务(Task)
    格式:

    task	任务名称;
    输入,输出声明;
    语句;
    endtask

调用task时的代码为:

任务名称 (输出,输入)
  1. 函数(function),返回一个宽度为BITWIDTH的值。
    格式:

    function	[BITWIDTH	-	1	:	0]	函数名称;
    输入声明;
    语句;
    endfunction
八. 使用VCD文件

VCD文件是一种标准格式的波形记录文件,该文件值记录发生变化的波形。

九. 使用testbench的命令行进行仿真
  1. 将工作目录切换到工程目录下,比如将Proj切换:

    cd	E:/Example-7-1/Proj
  2. 运行仿真

    do sim.do

    其中,sim.do是实现编写好的modelsim自动运行脚本,包含编译库文件,编译设计文件,载入仿真,开始运行仿真灯命令,使得整个仿真过程自动运行
    TIPs:学习脚本的写法

十. 拓展Verilog的高层建模能力

PLI(编程语言接口):有Verilog开放,专门用来和C语言的程序通信。通过 PLI,Verilog高层建模功能上的不足将会得到弥补。
参考文章:https://www.geek-share.com/detail/2673678023.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: