; A5 H( ?3 }/ O1 m5 i8 j3 r R1 S 5 X& Y. n: T$ j: o2 N) L 在对复杂数字系统进行仿真测试时,设计者常常面对测试向量数量庞大而难以实现的问题。以数字图像处理系统的仿真测试为例,如果采用完备性测试方法.那么所需测试向量的数量将非常巨大,甚至无法实现:而采用测试向量波形图或者用HDL语言描述等常用方法.不仅仿真测试工作的效率低下,而且工作量巨大。在数字图像处理系统中,一帧320x240的数字图像所产生的测试向量数量达到320x240x2=153 600个。无论采用完备性测试方法还是向量波形图或者.HDL语言描述的方法,由于测试向量的数量极其巨大,采用这些方法都难以进行仿真测试。" G s# X0 ~1 Y
8 h& Q, M9 L- b" ? `; o2 R' b5 H
3 B G( x/ i' M( D2 S* k6 z
# H* i7 N3 R. @& ~; z 针对这个难题,笔者提出一种进行仿真测试的新方法.该方法应用TEXTI0和:MATLAB来辅助仿真测试过程.使测试向量数量巨大、难以处理的难题得到很好的解决。以电视视频系统中实时多目标捕获单元的仿真测试为例.对这种新方法进行全面的讨论。& g; w) O: z, b* m1 M$ l
$ K9 O' M* E6 l7 y( V 8 S" {+ z+ v* R2 ?
) x5 f% H, ]) X- v7 y* P
2 基于TEXTIO的VlII)L仿真 % k/ \1 V# H* ]0 C' F {( i9 a& A( i. d
o8 [3 `1 p. n+ O a% t
6 l' a5 {3 ^- D3 v {7 l% W z
2.1 TEXTIO的功能 0 Y9 n5 X' p! q- G8 t' s1 _( H3 ^) c8 P3 q7 T
- |- U6 n: ^3 i6 l" J5 ?0 f+ y, G2 X& K, b# O
TEXXTl0是VHDL标准库STD中的程序包(Package),它提供了VHDL与磁盘文件直接访问的桥梁。TEXTIO定义了3种类型:LINE类型、TEXT类型及SIDE类型。TEXTI0在程序包中定义了一些访问文件的过程(Procedure)。 4 v. D, Z: T' x5 }" p0 c* C. X: i2 N + Y1 {4 h& p+ H; V " b p! W# o+ _3 a+ F
4 `# A* i2 W7 E. A TEXTIO提供的基本过程有:, F8 W( U, k# f3 P3 m0 k
3 y; k5 Q" ~. u' {* S: }7 Z / H4 M8 x; ~6 k4 ]3 l% W; V 5 i4 e' n7 D* i (1)procedure READLNE(文件变量,行变量),用于从指定文件读取一行数据到行变量中;; j* y; z4 y2 G. ^4 |+ K+ Y" v
$ b- v+ \/ q7 q& }$ ]) F* F1 }9 ~
(2)procedure WRITELNE(文件变量,行变量),用于向指定文件写入行变量所包含的数据; 7 S' Y: }; b1 Z9 x( X [* q$ S- ]( X4 M' `+ s- V
(3)procedure READ(行变量,数据类型),用于从行变量中读取相应数据类型的数据.根据参数的数据类型及参数个数的不同.有多种重载方式,TEX-TIO提供了bit、bit、bit_vector、BOOLEAN、character、in-teger、real、string、time数据类型的重载; * J$ ^' f. a6 q6 A$ D: W0 h & }( u0 s# A0 [; p (4)mcedure WRITE(行变量,数据变量,写入方式,位宽),该过程将数据写入行变量。其中,写入方式表示写在行变量的左边还是右边,其值只能为left或right,位宽表示写入数据时占的位宽。例如write(Oufljne,OutData,left,2/表示将变量OutData写入LINE 变量OutLine的左边,占2个字节。 4 x+ [8 b( T/ S$ l6 j# D ; F2 [3 k6 d4 g3 b : Q( o/ I1 x. f2 Y9 D
1 S9 n7 E: y5 s' {8 |6 s8 R 2.2 仿真测试方案' s3 u5 o8 ]# h0 j0 }7 s
9 O* f% u) \ X: K
1 f% Q$ `- x3 y* ]1 ]" @
# @! \0 q' K4 m2 C; C9 g& V 使用TEXTO和MNTLAB辅助TestBench进行复杂数字系统仿真的方案框图如图1所示。( c3 ]% ?8 b+ K% ~) w/ A& s
: w& i* D- Q8 {. c. _) i8 h: K , |3 r" r2 ?0 t; Y# s
& a' M# m! S! K! l2 ~0 _ . L6 F x( I& c' N7 N$ R6 H
7 S' P5 i$ p* P$ m5 _! k+ {' k, i
7 F, c. N2 M7 } a) F3 n
$ o( U$ C7 y$ Z# @. S
2.3 仿真测试步骤8 V- M! q: n3 L9 y6 r9 t
- T3 j6 n4 k! t0 U1 H; {0 o! s # h4 e5 e$ ~5 `. H+ E
- m9 e. S1 [7 z7 a. `. e
2.3.1 使用MATLAB生成测试激励文件 % c5 V2 J% }+ `/ @ ! Z$ i' `! E6 x , X8 l+ t7 j0 x4 y' i: } ! J& k } M+ O: r# K, [ MATLAB是矩阵实验室(Matrix Laboratory)的缩写,是1984年MathWorks公司推出的软件。经过20多年的发展,MATLAB已成为通用科技计算、图视交互系统和程序语言,广泛应用于研究和解决各种具体工程问题。 0 D" I) \6 M; l3 B3 a0 e 1 M- U% o' a3 K- {* F: e" R/ P * ?% o4 h- |- O0 r3 f& g2 X) }! o& C( R# b0 d) U
在复杂数字系统仿真中,用户可以利用MAT-LAB的强大处理功能生成测试激励文件。测试激励文件的数据格式由设计者自行定义。测试激励文件应包含输入信号的测试激励数据.也可以包含输出信号的期望输出数据.这些内容常常以.ASCII码表示。& H, a0 s8 @# x( q% o5 m
: i, N% V7 V0 N" N {
- O' y" |! i9 P& l
# r4 y6 M, v- ^" U; c( V 2.3.2 编写TestBench 4 s0 r$ F, Q: S8 f) R8 s% s4 U6 [# N1 f1 W, r
$ r+ G/ M8 v$ ^# }/ H: j
; H) Z! q/ X4 c% T' B5 h$ F. V TestBench是测试平台程序。TEXTI0的使用是通过TestBench来进行的,TestBench利用TEXTIO读取测试激励文件或写入仿真结果输出。进行复杂数字系统仿真时,用户根据测试的目的和要求设计TestBench。 . ?: L2 I& X7 |9 d3 \/ U6 D: `- x" w/ r5 n2 j% R1 {
7 O8 R5 W7 @6 U. p4 z z
" E& L3 e' r7 L1 x
2.3.3 在Modelsim中进行仿真 ' ~. d. e* C6 ^ 8 r, a2 X1 W% \2 C+ S9 w V : b9 ^+ E* k# p+ J1 e$ t9 [
$ U2 ]3 d% S) P, u/ y7 s9 e
Modelsim是Model Technology(Mentor Graphics的子公司)的HDL(Hardware Description Language)仿真软件。可以实现VHDL、Verilog及VHDL一Ver-ilog混合设计的仿真。Modelsim为’TestBench提供一种良好的HDL仿真环境。 : Y2 } \) M$ w4 E( R' W' c( s& d! F1 J$ O: O2 |% d: p
) `! ]; N' w3 B) Q ! ^+ g7 C( j: f- N' m) \3 J. M7 S 3 仿真测试实例2 B+ A: v8 U" u; _% m0 }
$ o" m7 Q0 L* e* D2 v : u! Q3 L; S; U9 g
9 Z: e0 S2 |1 ]2 z# n
3.1 电视图像实时目标捕获单元功能0 O' k% F* S+ \: Q
8 L6 j# l3 h7 d! I6 t p
. x' {! G# Q, s5 |; }- h. `- Y8 `2 ^6 s, B- X1 g! C3 Y3 g! ?& e
电视图像实时目标捕获单元(以下简称待测单元)具有对电视图像中的目标图像进行实时捕获的功能。本例将用TEXllO和MATLAB辅助Test-Bench对待测单元进行仿真测试。 & l% w1 j6 m* G5 ^# s* H, _% x7 t* X4 @# H) |8 s/ S" L! P# W
: c( h- ?' v: T' g& T
: E9 l, h/ _" J5 O' v2 j {& ~* ?. t
3.2 需要产生的测试信号及波形 9 O! _6 H5 ~# }9 B0 F4 W( e& B" k4 V i' A0 @$ L! G6 |/ N
/ ^' k) I" C& ^" l; Q
- k( b( |" `* s K' `7 J
待测单元输入信号的时序如图2所示。其中,clk、vsy、hsy和ccd分别代表像素时钟、数字化后的场同步、行同步和二值图像信号。 2 T9 o( a% h, j % M6 { }; M X9 i. W# I 8 r7 D( B9 _: O/ t! k, d6 L1 b) |6 N% ]' h. w) u
7 D& V; ~+ `5 t1 d, W4 g. [8 D' o a2 C
用户设计的测试激励信号即测试激励文件中输入信号的激励数据,应符合图2所示时序的要求。, E8 ~+ A+ @. @" {( D
, C8 N& k8 T$ |. g8 {* v8 _+ o5 o$ s $ h8 E: G# |0 d" o
" R9 @$ i3 b+ C& F$ J) s6 ?' z 3.3 测试信号的产生* ~2 I6 @! V9 V1 P
; X5 j# H2 A. A* Z* X & ~- _4 J) T& i* c" ~6 M) a* \6 w! p
在MATLAB的开发环境中.通过编程可以生成测试激励文件。7 C" `+ A2 i y, L9 X- |( }
4 q# l2 g: U( ~1 V3 F. f
( C$ [* q( e; c u c) g; ^# q9 W& {
: k2 A @) d: q/ r 以下是生成测试激励程序的核心代码:' q5 {+ D2 T) d
/ v0 v3 L" _, h# w image=imread(‘pic.bmp’);%读取图像文件 # C, I% L9 Y! F u - b; M1 M; T) a [YN,XN]=size(image); %得到图像大小 : ` G. a2 y& o' `8 x3 h2 Q; }& r1 I Y
FZ=20; %晶体振荡器频率(MHz) 7 j8 ~1 v' K( I# f6 N8 T. F ' a8 q# L1 `/ j: D8 t' } %定义常数 %对应于图2所示的时序" V: b9 `0 b- z# ?: _" q
8 Z5 A1 q% [, Y6 v' m% p POSTIME=52.2; %行正程时间(μ8) 3 P# d, x% M. b$ R7 h$ [( F6 c t0 O& x$ s, s
NEGTIME=11.8; %行逆程时间(μs)' h, h; d0 H5 U3 w+ V H8 a( {3 U! V
) N7 O3 k2 w" y* [5 K1 Z
HORTIME=64;%行正逆程总时间& n7 T6 E% ]5 @. g3 x
7 P0 r' f; ]% ~8 N2 P
VSYTIME=1615; %场信号时间(μB)2 N( w8 D* f& f. U
# C) F0 s$ g+ E; G) j9 w
PPDOT=POSTIME*FZ/XN; %行正程时间*晶体振 ' S5 E# N/ c5 l* _; M2 B : B' N5 |0 U2 B$ p& m: g' c" d% Y 荡器频率,图像X方向分辨率 # Q/ n5 E5 X/ R9 \8 v; p + _' l' h/ q! r# H0 m7 E" b9 C6 x ……: O4 a. |* O& c6 L4 _2 ?
) T: g7 x' ]' g# R. \
' r& M+ u0 }4 p1 f / q* Z4 A) Y, t. D9 A fid=fopen(‘TestVectors.inp’,‘W’) ;%指定测试激励文件的文件名称- ~) U- Y( _/ T
, @5 E0 E4 [8 s" G% u
for j=1:1:YN; 9 A% ~( V8 y9 Q% }7 Y# \# p! q 8 h8 P) z$ c) C& y( t yy_j;xx=0;1 e" d2 D/ _& X5 x7 R
J I9 Q" J. @ b& y+ O$ F
for i=l:1:HORTIME*FZ; ; E4 E5 o7 n5 v' T ( F d% w; m# p T& _0 C, ]. e+ N %产生行同步激励5 C G& q+ a5 X8 X- ^$ }6 o
# e [1 I1 O& j" C; o if(i<(HFNTIME+HDLTIME)*FZ)(i>(HFNTIME+HDLTIME+HSYTIME)*FZ) & |9 m& d& l8 @$ T/ A( T / h6 W. z- e& G# ]# j! V2 r* @ hsy=l;: y- J6 Y% @% n
) }" b( K3 h: f, H& c( @/ S- @ else6 z7 w3 ?. I0 e. i" B& h
5 X2 }& Q. M7 S# V
hsy=0;9 P5 H7 h: H0 q. T) b
. `9 m$ V( d4 o9 M# d" E: U end; & Q) a: y5 W7 x! J3 L; I' P7 ^. W3 w3 C( n$ S+ S4 g
%产生像素时钟激励 , Y2 ?7 H' Y/ F; P; B0 b' E , [5 e1 f, a' ?. @9 V8 f6 D if clk==1 ( [. S4 a. V5 L , ]0 X# |. k h. `+ V clk=0; / s4 ?3 O7 Z# ]0 D6 Q7 e I/ x1 q# i( R: m! ?/ h% a: p
else 7 }: j2 w3 m1 z. S ! r8 z G! m- q: ?- z clk=l; 3 o6 i4 d2 x5 a3 L5 P( d 4 Z, I9 B+ U7 K end; ' E2 Y! H1 G! N0 s! h# i) ^# N% m7 `" k( y: f1 f" l
%产生CCD激励 % F3 ^0 g1 x! x! h : h; b, R2 |" c" V. `( C if i>NEGTIME*FZ - z. @- ]4 n( Z/ k/ s5 g0 ` 0 {6 n3 C4 U/ T3 l/ @$ Q6 q; h& x xx=round((i-NEGTIME*FZ)/PPDOT+0.45): ( H' [2 u; g2 b5 b# P1 L( G# @! W$ k1 T6 u4 H% A
ccd=round(image(yy,xx));5 m3 N" y( d& S2 K
1 E1 r5 H/ G3 D# C3 {) L) l8 s' Q9 y( e else1 h# J7 c$ V: Y- p3 D& j3 v
: G/ e0 r0 W. u6 X' v1 M. U! ?1 J) O; a
ccd=0;0 W" w4 g; O9 x. |% b/ W5 c
. y; l# H" {0 O: M
end; 6 K2 T* X3 I* b+ f9 c5 E& V 0 x2 o' T" m: c9 D %将激励写入测试激励文件 $ u6 W, q) h% t! q- }1 B - \# D# v7 b9 z; R% X) j; g { fprintf md.‘%d%d%d%d%d%d、Il’,clk,ccd,hsy,vsy);1 v- |& P1 l5 d! Z: _
6 a0 C" x6 P4 n5 U& C end; 5 ]$ D( u4 u% _$ I4 f ) B, p* J" `6 A- D2 b end;. q/ p; Y2 j( p, Y
3 L3 T4 K- V- T m1 g# [ 1 0 1 1—clk=l ccd=0 hsy=l vsy=1 3 J; m x; [( O. ]9 p8 L( ~+ @5 h3 K% N* I3 T
… 4 b+ z. v; Z) w7 N( [1 E, u& z2 l: V% `( c$ o' e( x' n1 u
/ z, L- h) M% B5 e+ Q: T' I' ? x! p# p
0 0 0 1——clk=O ccd=0 hsy=0 vsy=1 % x5 w; Y" o$ _6 i; S : Z9 j1 d3 [, f9 m, G …6 @! P6 K2 ?% i# J/ F+ K5 f
- E7 A W) Y' y; q " \5 W; j, R2 G, l: d6 |
3 A$ z) C: Y) g Z5 E' a 进行仿真时。TestBeneh应用TEXTIO通过逐行读取测试激励文件得到待测单元输入信号的激励。' h2 E H6 T- I r; g2 v( ]- I) x
7 P( a6 F3 _# s# a, a$ ]
1 g0 O, U5 |* o' z. B( ~/ V % X. {, K' b/ u" V: n1 E" u5 ?7 E 3.4 编写TestBench 2 ~! W8 A! L) @9 z5 g& F* Q- x! X 4 _5 R9 B5 i+ \- f1 @0 \ * {8 P$ j$ `0 `( w* s
* ^/ v" i) `8 B9 A# k TestBench调用TEXTIO读取测试激励文件得到激励,然后将这些激励分别驱动到待测单元的输入端口。同时,TestBench读取待测单元的输出结果,调用TEXTIO将仿真输出结果写入文件名称为Re-sult.out的仿真结果输出文件。 & K7 W% i. B) V2 i$ j : M. e1 m8 L* R+ Y! ? / c2 I2 V, H" _" K) \2 |2 M
5 i+ |. C8 n8 B; y) ]4 b, `6 H- Q
以下是TestBeneh的核心代码:; c3 p! E+ J3 `) q7 |, s" v% n; t
: ~3 e' H, l8 [
testprocess:process 2 w8 U, G" _7 T ; z3 u7 h* j8 [1 u9 ] file vector_file:text open read_mode is“TestVectors. 8 P2 n; {% ^; [2 O# M3 P: s+ p- |( ]/ [/ A8 m
inp”:一指定测试激励文件0 [& j% _/ N) {& I0 v; g
5 o1 k l" i% j! [3 n% Y file output_file:text open write_mode is“Reset.out”: + ]+ c# y/ w4 n9 w+ L; e , {! e3 W! E% @0 R$ E 一指定仿真结果输出文件 ) u) x- {! g [, d5 E, T8 |3 S
variable invecs,outvecs:line; 1 K. T9 S0 ]# p8 K4 y # c5 }$ t k; l- d variable good:boolean;$ m: Y$ d F& f4 d- z) e1 G
1 u& X, E T! D variable eh:eharacter;! c( ], I5 c; v" V' V; z0 l
D- b0 s$ |/ X4 s( a+ o: j
…… R |5 H6 W8 O; N3 y
* R* z: q! q# U * f1 Q( ]1 d: U2 }2 u' M, k* F+ Q" C
while not endfile(veetor_file)loop+ q+ _" S/ Z8 W
$ |$ n! ?& x. g3 p8 b
readline(veetor_file.invecs);一读出测试激励文件一行内容.得到激励3 D2 U3 \# h* h: C' g `. F
5 b/ }! ~2 n% R read(invees,vclk,good); 一一读取一个值给信号vclk/ t5 d0 Z6 w2 A' C6 a8 e! A6 C
/ c% J( u. L5 Y) s3 a9 ?2 b* }" z, e read(invees,ch); 一一读取空格& Z; y5 ~5 [: `0 K% L0 x+ w
9 o) J7 J6 ~9 U. o …… ! t$ `7 D; [2 y! I. h" b( ~ 6 y( ?$ m5 F' u8 H1 T 1 f% L4 }: l1 h/ ~& P5 u 8 q# ?/ a4 A( j read(invees,wBy,good); 一读取一个值给信号vvsy 1 p# K! U/ K; ~+ K- ~, B 6 N8 G# L- I& z$ w' F read(invecs,ch); 一读取空格6 Q* x8 | v, e2 w
: \% ]3 @0 ?* R" m F: M+ C1 F1 l 在Modelsim提供的HDL仿真环境中,运行TestBeneh进行仿真测试,得到测试向量波形(如图3所示)、仿真波形(如图4所示)和仿真输出结果文件ResuIt.out。对仿真输出结果进行分析表明,仿真输出的目标位置与输入电视图像中的目标位置完全一致。0 a, t+ _3 I7 D5 ~2 h7 h
% B6 N3 l! h1 k; ^ 0 X- _9 g- o [; K% t" H9 E$ }0 W
* o/ Q* ^3 |( r" f3 N, {$ L- `
+ t/ d: u& M! D. s8 W
5 O3 e$ _( |! _$ a8 p" m
2 e. k$ Q9 R* |, A/ j$ L! ~# I+ G9 F; W
7 M) {+ Q) r0 k# d3 w# e' B* k/ C
6 Y5 g2 Z, C! ]% F
本例的结果分析是通过人工对比进行的。还可以将仿真预期输出结果保存在测试激励文件或其他文件中.TestBench调用TEXTIO读取仿真预期输出结果.并和仿真实际输出结果进行对比,然后自动判断结果是否正确。在某些场合下,例如对VHDL编写的处理器进行仿真调试时,用户可以将包括指令类型、源地址、目标地址在内的指令保存成文本文件。TestBench调用TEXTIO读取这些指令。同时.TestBeneh调用TEXTIO将结果及中间变量保存成文本文件,以便设计者事后分析和查找问题的原因。* M) K2 A2 `: m' w- v. R8 L: D