| |
一、前言
借助于前文RTL设计中提到的UART代码,本章节将在后面给出对应的testbench以及说明如何在questa/modelsim、VCS+DVE、VCS+Verdi工具中使用。推荐书籍:《vcs User Guide 2016》
二、Testbench
Testbench的结构,正如上文提到的,主要由a,复位和时钟,b,激励产生电路,c,系统监视器,d,结果比较电路,e,波形产生函数,f,待验证的MODULE,g,控制仿真时间这几个部分组成。本章节提供的testbench只包含a,b,e,f,g部分,至于c,d更高级的内容,暂时无法涉及,questa/modelsim将不会使用到e部分的代码,使用questa/modelsim仿真时要屏蔽掉全部e段的内容。同样,在使用VCS+DVE进行仿真时要屏蔽VCS+VERDI的e段内容
三、工具使用
3.1modelsim仿真
对于modelsim仿真, 仿真文件包含:1,verilog源文件(前文已全部提供);2,testbench文件(后面会提供)
modelsim使用教程:https://wenku.baidu.com/view/db638e25b9d528ea81c779cc.html
有关在modelsim软件中如何使用本示例请参考以上教程。
仿真结果图:
3.2 VCS+DVE和VCS+VERDI仿真
对于VCS+DVE和VCS+VERDI, 仿真文件包含:1,verilog源文件(前文已全部提供);2,testbench文件(后面会提供),3,包含verilog、testbench文件路径的uart.f文件(必要时需自行修改),4,makefile仿真启动文件。在终端中运行make命令即可运行仿真,一定要注意文件路径问题。
makefile教程:http://blog.csdn.net/liang13664759/article/details/1771246
VCS+DVE 使用教程,https://wenku.baidu.com/view/48912cf558fb770bf68a55b4.html
DVE是VCS软件自带的波形查看器。
本章实例对应的VCS+DVE makefile启动脚本:
all:VCS DVE
VCS:
vcs
-f uart.f -full64 -debug_all -R
DVE:
dve
-vpd wave.vpd -mode64
将以上内容复制到文本文件中,并将该文本文件改名为makeflile。
uart.f内容:
/home/Lance/synopsys/UART/testbench.v
//必须放在文件中的第一行。
/home/Lance/synopsys/UART/UART_XMTR.v
/home/Lance/synopsys/UART/Control_Unit.v
/home/Lance/synopsys/UART/Datapath_Unit.v
/home/Lance/synopsys/UART/UART_RCVR.v
/home/Lance/synopsys/UART/Control_Unit2.v
/home/Lance/synopsys/UART/Datapath_Unit2.v
DVE波形查看器启动命令:
dve -vpd
wave.vpd -mode64
此外,在运行makefile启动脚本之前,还需要在testbench中添加如下代码:
initial
begin
$vcdplusfile("wave.vpd");//保存的波形文件名字
$vcdpluson(1,tb);//tb对应testbench文件的内的module名字
end
该段代码为e,波形产生函数,主要是生成DVE波形查看器使用的VPD格式的波形文件。
仿真结果图:
VCS+Verdi,Verdi是debussy的升级版,是一个独立的软件,这对软件组合使用方式与VCS+DVE差不多。
VCS+Verdi makefile启动脚本:
all:VCS VERDI
VCS:
vcs
+v2k -sverilog -debug_all -P /usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/novas.tab
/usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/pli.a +vcs+lic+wait \
-f uart.f -y ./ +libext+.v
-full64 -R
VERDI:
verdi
-f uart.f -ssf wave.fsdb &
将以上内容复制到文本文件中,并将该文本文件改名为makeflile。
注意:-P /usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/novas.tab
/usr/synopsys/Verdi/K-2015.09/share/PLI/VCS/LINUX64/pli.a主要是调用Verdi的接口函数以生成fsdb波形。
Verdi波形查看器启动命令:
verdi -f uart.f
-ssf wave.fsdb &
此外,在运行makefile启动命令前,还需要在testbench中添加如下代码:
initial
begin
$fsdbDumpfile("wave.fsdb");
$fsdbDumpvars(0,tb);
end
以生成Verdi波形查看器使用的FSDB格式的波形文件。
仿真结果图:
注意: 启动脚本相关问题,需要学习makefile有关内容,有关VCS和Verdi的详细使用教程,还请参考其它资料。
四、Testbench代码附件:
`timescale 1ns/1ns
module tb;
parameter num =
500;
reg [7 : 0] Data_Bus;
reg
Load_XMT_datareg;
reg
Byte_ready;
reg T_byte;
reg
read_not_ready_in;
reg Clock;
reg rst_b;
reg
Sample_clk;
wire serial;
wire
Error1,Error2;
wire [7:0]
RCV_datareg;
wire
read_not_ready_out;
//a,时钟和复位部分
initial
begin
rst_b
= 1;
Sample_clk = 0;
Clock
= 0;
#100;
rst_b
= 0;
#100;
rst_b
= 1;
end
always #(8*num) Clock
= ~Clock;
always #num Sample_clk = ~Sample_clk;
//b,激励产生部分
initial
begin
Data_Bus = 8'b1110_0101;
Load_XMT_datareg = 1'b1;
Byte_ready = 1'b0;
T_byte = 1'b0;
read_not_ready_in = 1'b0;
//
#(2*8*num);
Load_XMT_datareg = 1'b0;
#(2*8*num);
Byte_ready = 1'b1;
#(2*8*num);
T_byte = 1'b1;
//
#(2*8*num)
Load_XMT_datareg = 1'b1;
Byte_ready = 1'b0;
T_byte = 1'b0;
end
//c,系统监视器
//d,结果比较电路
//e,波形产生函数
//vpd
initial
begin
$vcdplusfile("wave.vpd");
$vcdpluson(1,tb);
end
//fsdb
// initial
//
begin
//
$fsdbDumpfile("wave.fsdb");
//
$fsdbDumpvars(0,tb);
// end
//g,控制仿真时间
initial
begin
$finish;
end
//f,待验证的MODULE
UART_XMTR m0(
.Serial_out(serial),
.Data_Bus(Data_Bus),
.Load_XMT_datareg(Load_XMT_datareg),
.Byte_ready(Byte_ready),
.T_byte(T_byte),
.Clock(Clock),
.rst_b(rst_b)
);
UART_RCVR m1(
.RCV_datareg(RCV_datareg),
.read_not_ready_out(read_not_ready_out),
.Error1(Error1),
.Error2(Error2),