没有合适的资源?快使用搜索试试~ 我知道了~
编写verilog测试验证程序 如何编写测试验证程序(test bench)
5星 · 超过95%的资源 需积分: 47 143 下载量 47 浏览量
2011-08-15
16:18:04
上传
评论 4
收藏 472KB PDF 举报
温馨提示
试读
18页
编写verilog测试验证程序 如何编写测试验证程序(test bench)
资源推荐
资源详情
资源评论
下载
第11章 验 证
本章介绍了如何编写测试验证程序 (test bench)。测试验证程序用于测试和验证设计的正
确性。Verilog HDL提供强有力的结构来说明测试验证程序。
11.1 编写测试验证程序
测试验证程序有三个主要目的:
1) 产生模拟激励(波形)。
2) 将输入激励加入到测试模块并收集其输出响应;
3) 将响应输出与期望值进行比较。
Verilog HDL提供了大量的方法以编写测试验证程序。在本章中,我们将对其中的某些方
法进行探讨。典型的测试验证程序形式如下:
module T e s t _ B e n c h ;
/ /通常测试验证程序没有输入和输出端口。
L o c a l _ r e g _ a n d _ n e t _ d e c l a r a t i o n s
G e n e r a t e _ w a v e f o r m s _ u s i n g _ i n i t i a l _ & _ a l w a y s _ s t a t e m e n t s
I n s t a n t i a t e _ m o d u l e _ u n d e r _ t e s t
M o n i t o r _ o u t p u t _ a n d _ c o m p a r e _ w i t h _ e x p e c t e d _ v a l u e s
e n d m o d u l e
测试中,通过在测试验证程序中进行实例化,激励自动加载于测试模块。
11.2 波形产生
有两种产生激励值的主要方法:
1) 产生波形,并在确定的离散时间间隔加载激励。
2) 根据模块状态产生激励,即根据模块的输出响应产生激励。
通常需要两类波形。一类是具有重复模式的波形,例如时钟波形,另一类是一组指定的
值确定的波形。
11.2.1 值序列
产生值序列的最佳方法是使用 i n i t i a l语句。例如:
i n i t i a l
b e g i n
R e s e t = 0;
#100 R e s e t = 1;
#80 Reset = 0;
#30 Reset = 1;
e n d
产生的波形如图11 - 1所示。I n i t i a l 语句中的赋值语句用时延控制产生波形。此外,语句内
时延也能够按如下实例所示产生波形。
i n i t i a l
b e g i n
R e s e t = 0;
R e s e t = #100 1;
R e s e t = #80 0;
R e s e t = #30 1;
e n d
图11-1 使用initial语句产生的波形
因为使用的是阻塞性过程赋值,上面语句中的时延是相对时延。如果使用绝对时延,可
用带有语句内时延的非阻塞性过程性赋值,例如,
i n i t i a l
b e g i n
R e s e t <= 0;
R e s e t <= #100 1;
R e s e t <= #180 0;
R e s e t <= #210 1;
e n d
这三个i n i t i a l语句产生的波形与图11 - 1 中所示的波形一致。
为重复产生一个值序列,可以使用 a l w a y s语句替代i n i t i a l语句,这是因为i n i t i a l 语句只执行
一次而a l w a y s语句会重复执行。下例的 a l w a y s语句所产生的波形如图 11 - 2 所示。
p a r a m e t e r REPEAT_DELAY = 35;
i n t e g e r C o i n V a l u e ;
a l w a y s
b e g i n
CoinValue = 0;
#7 C o i n V a l u e = 25;
#2 C o i n V a l u e = 5;
#8 C o i n V a l u e = 10;
#6 C o i n V a l u e = 5;
#R E P E A T _ D E L A Y ;
e n d
图11-2 使用always语句产生的重复序列
11.2.2 重复模式
重复模式的生成通过使用如下形式的连续赋值形式加以简化:
第11章 验 证 119
下载
一个周期
a s s i g n # (P E R I O D /2) Clock = ~ C l o c k;
但是这种做法并不完全正确。问题在于 C l o c k是一个线网(只有线网能够在连续赋值中被赋
值),它的初始值是z,并且,z等于x,~ x等于x。因此C l o c k 的值永远固定为值x。
现在需要一种初始化C l o c k的方法。可以用i n i t i a l语句实现。
i n i t i a l
C l o c k = 0;
但是现在C l o c k 必须是寄存器数据类型 (因为只有寄存器数据类型能够在 i n i t i a l语句中被赋
值),因此连续赋值语句需要被变换为 a l w a y s语句。下面是一个完整的时钟产生器模块。
m o d u l e Gen_Clk_A (C l k _ A) ;
o u t p u t C l k _ A;
r e g C l k _ A ;
p a r a m e t e r tPERIOD = 10;
i n i t i a l
C l k _ A = 0;
always
# (t P E R I O D/2) Clk_A = ~ C l k _ A;
e n d m o d u l e
图11 - 3 显示了该模块产生的时钟波形。
图11-3 周期性的时钟波形
下面给出了产生周期性时钟波形的另一种可选方式。
m o d u l e Gen_Clk_B (C l k _ B) ;
o u t p u t C l k _ B ;
r e g S t a r t;
i n i t i a l
b e g i n
S t a r t = 1;
#5 S t a r t = 0;
e n d
n o r #2 (Clk_B, Start, C l k _ B) ;
e n d m o d u l e
/ /产生一个高、低电平宽度均为2的时钟。
i n i t i a l 语句将S t a r t 置为1,这促使或非门的输出为 0 ( 从x值中获得)。5个时间单位后,在
S t a r t 变为0时,或非门反转产生带有周期为 4个时间单位的时钟波形。产生的波形如图 11 - 4 所
示。
如果要产生高低电平持续时间不同的时钟波形,可用 a l w a y s 语句建立模型,如下所示:
m o d u l e Gen_Clk_C (C l k _ C) ;
p a r a m e t e r tON = 5, t O F F = 10;
o u t p u t C l k _ C ;
120 Verilog HDL 硬件描述语言
下载
第11章 验 证 121
下载
r e g C l k _ C ;
a l w a y s
b e g i n
# tON Clk_C = 0;
# tOFF Clk_C = 1;
e n d
e n d m o d u l e
图11-4 受控时钟
因为值0和1被显式地赋值,在这种情况下不必使用 i n i t i a l 语句。图 11 - 5显示了这一模块生
成的波形。
为在初始时延后产生高低电平持续时间不同的时钟,可以在 i n i t i a l语句中使用f o r e v e r循环
语句。
图11-5 高低电平持续时间不同的时钟
m o d u l e Gen_Clk_D (Clk_D);
o u t p u t C l k _ D ;
r e g C l k _ D ;
p a r a m e t e r START_DELAY = 5, LOW_TIME = 2, HIGH_TIME = 3;
i n i t i a l
b e g i n
Clk_D = 0;
# S T A R T _ D E L A Y ;
f o r e v e r
b e g i n
# LOW_TIME ;
Clk_D = 1;
# H I G H _ T I M E;
Clk_D = 0;
e n d
e n d
e n d m o d u l e
上面模块所产生的波形如图 11 - 6所示。
为产生确定数目的时钟脉冲,可以使用 r e p e a t循环语句。下面带参数的时钟模块产生一定
数目的时钟脉冲数列,时钟脉冲的高低电平持续时间也是用参数表示的。
剩余17页未读,继续阅读
BACKKOM_D
- 粉丝: 40
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页