EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
VHDL与Verilog硬件描述语言TestBench的编写 2 T9 z a, A! w0 C* B
VHDL与Verilog硬件描述语言在数字电路的设计中使用的非常普遍,无论是哪种语言,仿真都是必不可少的。而且随着设计复杂度的提高,仿真工具的重要性就越来越凸显出来。在一些小的设计中,用TestBench来进行仿真是一个很不错的选择。VHDL与Verilog语言的语法规则不同,它们的TestBench的具体写法也不同,但是应包含的基本结构大体相似,在VHDL的仿真文件中应包含以下几点:实体和结构体声明、信号声明、顶层设计实例化、提供激励;Verilog的仿真文件应包括:模块声明、信号声明、顶层设计实例化、提供激励。大致思想都是相似的。
1 L& w$ b% [0 a
+ q1 Z5 X4 |% N# r9 i 简单的说,TestBench就是一种验证手段,从软件层面对设计的硬件电路进行仿真。具体来讲,一般是在你的仿真文件里,产生激励信号,作用于被仿真的设计文件DUT(Design Under Test),产生相应的输出,然后根据输出信号检验设计的电路是否存在问题或者存在哪些问题。* X$ G( Y# R9 I0 W) v& }4 I
- l: j* Z) {7 a. a) u% i1 k3 k7 l 下面以FPGA板中驱动流水灯的一段程序为例,简单介绍一下两种语言的TestBench的编写。
. c' e5 I& O, J" G
: k- m; C1 J i9 b4 \# S4 vView Code
0 r# A7 K! j x M6 L5 |' } 上面是一段流水灯的代码,控制8位流水灯依次点亮,再依次熄灭。第一个always语句完成分频功能,第二个always语句用于计数,共16个值,第三个always语句根据计数的值选择LED灯的状态。其中clk、rst分别为时钟和复位信号,led为驱动流水灯的输出信号。接下来针对这一设计编写其TestBench文件。
& P1 ^$ h5 T' [+ h
" P# g: F$ J7 [; J: EView Code% j7 W/ z5 p7 U% `
由于只需要时钟和复位信号即可,故在其仿真文件并不复杂,建立测试模块,进行信号声明,在两个initial中分别提供clk和rst信号,最后进行例化。当然注意一点,在仿真时要把分频模块去掉,或者将分频系数改小,否则仿真时不容易观察波形。下面是在Modelsim中仿真得到的波形(分频模块改为2分频)。
& @% V; ^% K) h4 s+ I
9 l5 d4 o: W5 F. O$ F, s) Y- [3 K+ q9 X1 J' r& j6 m
' `7 g2 ^1 K+ E' _8 W! ^6 J
总结起来,Verilog的TestBench有着相对固定的写法:" k; L1 Z) M" }/ X- h! e6 l' ]
9 Z2 N% ~2 ~: v, C7 t2 ?# E6 |View Code% o, w+ F. Y2 ~* k; f
最主要的是在initial语句中进行激励的生成,这要根据具体的设计来分析。
' [. A: X, d! z$ \, y. J1 \* Z3 k' Q+ \' b
) B) N6 D2 D, B1 s5 e# f
' J5 z4 K9 a) X! O% v) t 下面对比介绍VHDL语言TestBench的写法。同样的功能,驱动流水灯,VHDL的程序如下: E7 H& o0 l- h2 D
E6 v( N: S, {5 g/ r' Y: N: D5 i& ?# E
View Code0 V+ b9 S3 ?0 I; t( S
根据语法要求,首先声明库,接着定义实体和结构体。在结构体中用三个进程(PROCESS)分别实现分频、计数、流水灯状态分配的功能,功能相当于上面Verilog程序中的三个always语句。接下来写TestBench文件:
" B6 g8 t) d$ g" R5 [2 e
5 p8 G' M; |5 E k! VView Code8 W7 I1 t' {5 I( M$ z P- R
在这个TestBench中同样只需要提供clk和rst信号,分别在两个进程实现,Modelsim中的仿真结果如下(同样在仿真的时候将分频系数改为2):+ J3 L% |5 |6 j+ m8 e
; c4 n; f9 P8 V8 r% J5 m2 ~4 b7 c9 y
& X, n+ e7 ]. p* D
总结一下,VHDL的TestBench写法也有相对固定的格式:
" p) h1 P# b" ]; w+ o
$ G8 W7 q% Q! ~) l2 x9 t4 m, J8 ZView Code
( T7 A1 {4 g7 S 相对与Verilog语言来说,VHDL的TestBench除了自身的库声明以及Entity和Architecture之外,还需要进行元件的声明,即将被测试的设计声明为一个元件,然后对其例化。在激励的产生方面与Verilog思路相同。
2 ?# k- |$ d% r3 S4 e; L- ^9 j, t! g! a% P8 h1 ?
从上面的程序可以看出,Verilog语言相对比较随意一些,从C语言编程中继承了多种操作符和结构;而VHDL的语法则比较严谨,有固定的格式。但在功能的实现上二者大同小异。比如Verilog中的always语句,在VHDL中可以找到PROCESS与之对应,当然更多的是不同。两种语言均可在不同的抽象层次对电路进行描述:系统级、算法级、寄存器传输级、逻辑门级和开关电路级,但是VHDL更擅长系统级,而Verilog更方便底层描述。在学习硬件描述语言的时候不妨对比学习一下,相信会对电路设计的理解更加深一层。 |
/ y+ B# Y( R( W- S) o' M% t1 c, k$ n4 X* s: W9 j' G: A" U5 `3 X
R2 j5 `' Z" r4 i$ E- ^- r
|