欢迎来到EDA中国!
当前位置:网站首页 >资源共享 > FPGA

Verilog HDL语言教程第十一章--验证

  • 415k
  • pdf
  •  
  •  
  • 下载
  • 2013-04-26
  • 软件简介
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 rt置为1,这促使或非门的输出为0 (从x值中获得)。5个时间单位后,在
S t a rt变为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
关键字 : 验证 HDL Verilog 语言 
获取帮助