《数字系统设计》第七章 testbech_第1页
《数字系统设计》第七章 testbech_第2页
《数字系统设计》第七章 testbech_第3页
《数字系统设计》第七章 testbech_第4页
《数字系统设计》第七章 testbech_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章测试平台文件主讲人:徐向民教授目录VHDL仿真概述仿真测试平台文件仿真响应文件I/O的读写VHDL仿真概述VHDL仿真器如modelsim需要以下输入设计的描述(项目的VHDL程序)驱动设计的激励在VHDL本身是自激励时则无需此输入基本结构VHDL仿真概述VHDL一般仿真过程首先,编写项目元件和激励文件其次,编译项目并且综合再次,功能仿真最后,时序仿真仿真测试平台文件测试平台文件定义:可以用来验证所设计的硬件模型的正确性的VHDL模型。作用:为所测试的原件提供了激励信号,仿真结果可以以波形的方式显示或存储测试结果到文件中。激励信号可以直接集成在测试平台文件中,也可以从外部文件中加载。仿真测试平台文件编写测试平台文件的语言VHDL(VHSICHardwareDescriptionLanguage)VerilogHDLSystemVerilogSystemC……接下来将只讲解使用VHDL语言编写测试平台文件的方法仿真测试平台文件——测试平台文件的结构一个测试平台文件的基本结构如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYTEST_BENCHIS--测试平台文件的空实体(不需要定义端口)ENDTEST_BENCH;

ARCHITECTURETB_BEHAVIOROFTEST_BENCHISCOMPONENTENTITY_UNDER_TEST

–被测试元件的声明

PORT(list_of_port_their_types_and_modes);ENDCOMPONENT;

Local_signal_declarations;

--局部信号的声明BEGINInstatiation:ENTITY_UNDER_TESTportmap(port_associations);

--被测试元件的例化或映射PROCESS()--产生时钟信号

……ENDPROCESS;PROCESS()--产生激励源

……ENDPROCESS;ENDTB_BEHAVIOR;仿真测试平台文件——测试平台文件的结构测试平台文件包含的基本语句实体的定义语句不需要定义端口,只和被测试元件(DUT)通过内部信号相连接所测试元件的例化语句产生时钟信号语句产生激励源语句仿真测试平台文件——激励信号的产生产生激励信号的方式以一定的离散时间间隔产生激励信号基于实体的状态产生激励信号

下面通过实例,讲述激励信号的产生时钟信号一个周期性的激励信号可以使用一个并行的信号赋值语句来建立;例如下面的语句即是建立周期为40ns的信号。A<=not

A

after

20

ns;--产生一个周期为40ns的信号A仿真测试平台文件——激励信号的产生其对应的时钟波形如下图时钟信号是同步设计中最重要的信号之一。它既可以使用并行的信号赋值语句产生(如上面的语句),也可以使用时钟产生的进程来实现定义。当使用并行的信号赋值语句时,产生的时钟信号可以是对称的或不对称的,但是信号的初始值不能为‘u’仿真测试平台文件——激励信号的产生如果使用进程来定义信号,也可以产生各种时钟信号,包括对称和不对称的。在大部分情况下,时钟信号是一直运行的,并且是对称的。当定义不对称的时钟信号,如果使用并行信号幅值语句,则需要使用条件信号赋值语句;如果使用进程,则比较简单,使用顺序逻辑就可以。下面语句使用条件信号赋值语句,定义了一个25%占空比的时钟信号:W_CLK<='0'afterPERIOD/4

whenW_CLK='1'else

'1'after

3*PERIOD/4

whenW_CLK='0'else

'0';仿真测试平台文件——激励信号的产生上述两个对称和不对称的时钟信号,也可以使用进程来定义,如下:CLK_GEN1:

PROCESS

--产生对称的时钟信号,周期为40nsCONSTANTCLK_PERIOD:

TIME

:=

40NS;BEGIN CLK<='1';

WAIT

FORCLK_PERIOD/2; CLK<='0';

WAIT

FORCLK_PERIOD/2;END

PROCESS;CLK_GEN2:

PROCESS

--产生非对称的时钟信号,周期为40ns,占空比为25%CONSTANTCLK_PRTIOD:

TIME

:=

40NS;BEGIN CLK<='1';

WAIT

FORCLK_PERIOD/4; CLK<='0';

WAIT

FOR

3*CLK_PERIOD/4;END

PROCESS;仿真测试平台文件——激励信号的产生复位信号实现方式使用并行赋值语句在进程中设定例如下面复位信号设置:仿真开始时,复位信号为’0’;经过20ns后,复位信号变为’1’;再经过20ns后,复位信号变为’0’。RESET<='0','1'after

20ns,'0'after

40ns;仿真测试平台文件——激励信号的产生再例如另一个复位信号设置实例,代码如下:RESET<='0','1'after

100ns,'0'after

180ns,'1'after

210ns;RESET信号初始为’0’,经过100ns后,变为’1’;再经过80ns,该信号变为’0’;再经过30ns,该信号返回到’1’。其波形如下:仿真测试平台文件——激励信号的产生周期信性信号可以在进程中使用信号赋值语句实现信号的周期性信号设置。signalCLK1,LCK2:

STD_LOGIC

:='0';...TWO_PHASE:

PROCESSBEGIN CLK1<='1'after

5ns,'0'after

10ns,'1'after

20ns,'0'after

25ns; CLK2<='1'after

10ns,'0'after

20ns,'1'after

25ns,'0'after

30ns;

wait

for

35ns;END

PROCESS;上例定义了两个周期性信号,为了实现信号的周期性变化,后面使用一个WAIT语句。其波形如下:仿真测试平台文件——激励信号的产生仿真测试平台文件——激励信号的产生使用延迟DELAYD可使用预定义属性DELAYD关键词来产生信号。如果已经产生了一个时钟信号,在这个时钟信号的基础上,可以使用DELAYD来使已经产生的时钟信号延迟一定的时间,从而获得另一个时钟信号。假如我们已经使用如下的语句定义了一个时钟信号W_CLK:W_CLK<='1'after

30nswhenW_CLK='0'else'0'after

20ns;仿真测试平台文件——激励信号的产生然后可以使用如下的延迟语句获得一个新的时钟信号DLY_W_CLK,它比W_CLK延迟了10ns:DLY_W_CLK<=

W_CLK'DELAYED(10

ns);以上两个时钟信号波形如下:仿真测试平台文件——激励信号的产生一般的激励信号所定义的普通的激励信号来用作模型的输入信号;通常在进程中定义;一般使用WAIT语句来定义。例如下面的激励信号定义:SIGNALC:

STD_LOGIC

:='0';

...... STIMULI:

PROCESS

BEGIN

wait

for

80ns;仿真测试平台文件——激励信号的产生

C<='1';

wait

for

50ns; C<='0';

wait

for

60ns; C<='1';

wait

for

120ns; C<='0'

......

wait;

END

PROCESS;其波形如下:仿真测试平台文件——激励信号的产生动态激励信号动态激励信号,就是被仿真的实体(DUT)的行为模型相关,即DUT的输入激励信号受模型的行为所影响。如下信号的定义,模型的输入信号Sig_A和模型输出信号Count相关。PROCESS(Count)BEGIN

CASE

CountIS

when

2

=>

Sig_A<='1'after

10ns;

when

others

=>

Sig_A<='0'after

10ns;

END

CASE;END

PROCESS;仿真测试平台文件——激励信号的产生使用测试矢量将一组固定的输入输出矢量值存储在一个常量表或一个ascii文件中,然后将这些值应用到输入信号从而产生激励信号;矢量的值序列可以使用多维数组或使用多列记录来描述。如下面的数据表存储了输入矢量:CONSTANTNO_OF_BITS:

INTEGER

:=

4;CONSTANTNO_OF_VECTORS:

INTEGER

:=

5;TYPETABLE_TYPEIS

ARRAY

(1

TONO_OF_VECTORS)

OF

STD_LOGIC_VECTOR(1

TONO_OF_BITS);CONSTANTINPUT_VECTORS:TABLE_TYPE:=

("1001",

"1000",

"0010",

"0000",

"0110");SIGNALINPUTS:

STD_LOGIC_VECTOR(1

TO

NO_OF_BITS);SIGNALA,B,C:

STD_LOGIC;SIGNALD:

STD_LOGIC_VECTOR(0

TO

1);仿真测试平台文件——激励信号的产生假设所测试的实体(DUT)具有4个输入:A、B、C和D信号,如果以一般的时间间隔应用测试矢量,则可以使用一个GENERATE语句,例:G1:

forJin

1

toNO_OF_VECTORSgenerate

INPUTS<=

INPUT_VECTORS(J)

after(VECTOR_PERIOD*J);END

GENERATEG1;A<=INPUTS(1);B<=INPUTS(4);C<=INPUTS(1);D<=INPUTS(2

TO

3);仿真测试平台文件——激励信号的产生如果将信号应用于任意时间间隔,则需要使用并行的信号赋值语句产生多个信号的波形;使用这种方法可以将一个矢量赋值给多个信号,例如下面的代码:INPUTS<=INPUT_VECTORS(1)

after

10ns;INPUT_VECTORS(2)

after

25ns;INPUT_VECTORS(3)

after

30ns;INPUT_VECTORS(4)

after

32ns;INPUT_VECTORS(5)

after

40ns;仿真测试平台文件——测试平台文件举例下面的实例即为一个测试平台文件以及他所测试的元件测试平台文件时钟周期为20ns,在一个时钟波形产生进程中定义。激励信号波形在另一个进程中产生。实体为一个空实体,没有输入输出信号端口。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYS_MACHINE_TBISEND;

ARCHITECTUREBHVOFS_MACHINE_TBISCOMPONENTS_MACHINEPORT(CLK,RESET:INSTD_LOGIC;

STARE_INPUTS:INSTD_LOGIC_VECTOR

(0TO1);

COMB_OUTPUTS:OUTSTD_LOGIC_VECTOR

(0TO1)

);ENDCOMPONENT;

--INPUTSIGNALSIGNALCLK:

STD_LOGIC

:=

'0';

仿真测试平台文件——测试平台文件举例SIGNALRESET:

STD_LOGIC

:='0';SIGNALSTARE_INPUTS:

STD_LOGIC_VECTOR

(0TO1)

:="00";--OUTPUTSIGNALSIGNALCOMB_OUTPUTS:

STD_LOGIC_VECTOR

(0TO1);

--TIMERPERIODDEFINECONSTANTCLK_PERIOD:

TIME

:=

20

NS;BEGIN

--componentinstantiation

DUT:S_MACHINEPORTMAP(CLK=>CLK,

RESET=>RESET,

STARE_INPUTS=>STARE_INPUTS,

COMB_OUTPUTS=>COMB_OUTPUTS);

--generateclocksignal

clk_gen:PROCESS

BEGIN仿真测试平台文件——测试平台文件举例CLK<='1';WAITFORCLK_PERIOD/2;

CLK<='0';

WAITFORCLK_PERIOD/2;ENDPROCESS;

--drivesignal

TB:PROCESSBEGIN

WAITFOR20

NS;

RESET<='1';

WAITFOR20

NS;

RESET<=

'0';

WAITFOR210

NS;

STARE_INPUTS<="01";WAITFOR20

NS;

STARE_INPUTS<="10";

WAITFOR20

NS;

STARE_INPUTS<="11";WAITFOR20

NS;

STARE_INPUTS<="00";WAITFOR20

NS;

STARE_INPUTS<="11";WAITFOR20

NS;

STARE_INPUTS<="10";WAITFOR20

NS;

STARE_INPUTS<="01";WAITFOR20

NS;

STARE_INPUTS<="00";WAITFOR20

NS;WAIT;ENDPROCESS;END;仿真测试平台文件——测试平台文件举例定义所测试元件的VHDL程序,该程序是一个简单的Mealy型状态机演示程序IBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYS_MACHINEISPORT(CLK,RESET:INSTD_LOGIC;

STARE_INPUTS:INSTD_LOGIC_VECTOR(0TO1);

COMB_OUTPUTS:OUTSTD_LOGIC_VECTOR(0TO1)

);END;

ARCHITECTUREARTOFS_MACHINEISTYPESTATESIS(ST0,ST1,ST2,ST3);--defineSTATESasenumSIGNALCURRENT_STATE,NEXT_STATE:STATES;

BEGIN仿真测试平台文件——测试平台文件举例

REG:PROCESS(RESET,CLK)BEGINIFRESET='1'THEN

CURRENT_STATE<=ST0;ELSIF(CLK

='1'

AND

CLK'EVENT)THEN

CURRENT_STATE<=NEXT_STATE;ENDIF;ENDPROCESS;

COM:PROCESS(CURRENT_STATE,STARE_INPUTS)

--feedbacksignalBEGINCASECURRENT_STATEISWHENST0=>

COMB_OUTPUTS<="00";IFSTARE_INPUTS="00"THEN仿真测试平台文件——测试平台文件举例

NEXT_STATE<=ST0;ELSE

NEXT_STATE<=ST1;ENDIF;WHENST1=>

COMB_OUTPUTS<="01";IFSTARE_INPUTS="00"THEN

NEXT_STATE<=ST1;ELSE

NEXT_STATE<=ST2;ENDIF;WHENST2=>

COMB_OUTPUTS<="10";IFSTARE_INPUTS="11"

THEN仿真测试平台文件——测试平台文件举例

NEXT_STATE<=ST2;ELSENEXT_STATE<=ST3;ENDIF;WHENST3=>

COMB_OUTPUTS<="11";IFSTARE_INPUTS="11"THEN

NEXT_STATE<=ST3;ELSE

NEXT_STATE<=ST0;ENDIF;ENDCASE;ENDPROCESS;ENDART;仿真测试平台文件——测试平台文件举例使用以上测试平台文件对元件进行功能仿真,仿真结果如下图:从图中可以看出,其时序是和我们写的testbench相对应的。仿真响应控制仿真无控制,则仿真会一直持续到时间等于设定的仿真时间;如果想在某个时间终止仿真,可使用断言语句ASSERT来实现;另外,ASSERT语句可以实现对某些值或行为作出响应。仿真响应断言语句(ASSERT)最适合于执行仿真的自动响应;可以检查一个条件并报告信息;根据所选择的严重级别和仿真工具的设置,在ASSERT语句报告了信息后,仿真可以继续执行(警告级别WARNING)或者停止(错误ERROR或致命错误FAILURE),默认的严重级别为ERROR。仿真响应实例使用断言语句判断仿真的时间,如果当前时间为1000ns,则仿真完成,使用ERROR严重级别终止仿真过程。PROCESS

BEGIN

ASSERT(NOW

<=

1000ns)

REPORT

"Simulationcompletedsuccessfully"

SEVERITYERROR;END

PROCESS仿真响应断言语句判断条件时,如果条件的判断结果为FALSE,则执行后面的报告及严重级语句,否则仿真会忽略后面的报告和严重级语句并继续执行。可以使用ASSERT语句设定一个判断条件,以便对仿真的某个结果或值做出响应,例如:PROCESS(q)BEGIN

ASSERT(q/=

"1001")

REPORT

"Theshiftergetstheresutl!!"

SEVERITYERROR;END

PROCESS;仿真响应下面以一个实例来讲述使用断言语句来响应一个仿真过程下面的程序为4位计数器的行为模型,计数器的位数为4位。方向由信号DIR决定,如果DIR为高电平,则正向计数,如果DIR为低电平,则反向计数。计数结果保存在CT_RESULT信号中。LIBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;USE

IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCOUNTERIS

PORT(CLK,CLR,DIR:

IN

STD_LOGIC;

CT_RESULT:

OUT

STD_LOGIC_VECTOR(3

DOWNTO

0));ENDCOUNTER;仿真响应ARCHITECTUREBEHAVIORALOFCOUNTERIS

SIGNAL

TMP:

STD_LOGIC_VECTOR(3

DOWNTO

0);BEGIN

PROCESS(CLK,CLR)

BEGIN

IF(CLR='1')

THEN

TMP<=

"0000";

ELSIF(CLK'EVENT

ANDCLK='1')

THEN

IF(DIR='1')

THEN

TMP<=TMP+

1;

ELSE

TMP<=TMP-

1;

END

IF;

END

IF;

END

PROCESS;

CT_RESULT<=TMP;ENDBEHAVIORAL;仿真响应下面的程序为测试平台,在程序中,一个断言语句用于判断计数结果是否等于”1001”。条件判断使用了“不等于(/=)逻辑”,如果判断条件为FALSE,即等于“1001”,则报告信息,并终止仿真。IBRARY

IEEE;USE

IEEE.STD_LOGIC_1164.ALL;USE

IEEE.STD_LOGIC_UNSIGNED.ALL;USE

IEEE.NUMERIC_STD.ALL;ENTITYCOUNTER_TB_VHDISENDCOUNTER_TB_VHD;仿真响应ENTITYCOUNTER_TB_VHDISENDCOUNTER_TB_VHD;ARCHITECTUREBEHAVIOROFCOUNTER_TB_VHDIS

COMPONENT

COUNTER

PORT(CLK:

IN

STD_LOGIC;

CLR:

IN

STD_LOGIC;

DIR:

IN

STD_LOGIC;

CT_RESULT:

OUT

STD_LOGIC_VECTOR(3

DOWNTO

0)

);

END

COMPONENT;

--INPUTSIGNAL

SIGNAL

CLK:

STD_LOGIC

:='0';

SIGNAL

CLR:

STD_LOGIC

:='0';

SIGNAL

DIR:

STD_LOGIC

:='0';仿真响应--OUTPUTSIGNAL

SIGNAL

CT_RESULT:

STD_LOGIC_VECTOR(3

DOWNTO

0);

--CONSTANT

CONSTANT

CLK_PERIOD:

TIME

:=

40NS;BEGIN

DUT:COUNTERPORT

MAP(

CLK=>CLK,

CLR=>CLR,

DIR=>DIR,

CT_RESULT=>CT_RESULT);

CLK_GEN1:

PROCESS

--

BEGIN

仿真响应CLK<='1';

WAIT

FORCLK_PERIOD/2;

CLK<='0';

WAIT

FORCLK_PERIOD/2;

END

PROCESS;

TB:

PROCESS

BEGIN

--WAIT100NSFORGLOBALRESETTOFINISH

CLR<='1';

DIR<='1';

WAIT

FOR

20NS;

CLR<='0';仿真响应 WAIT

FOR

280NS;

DIR<='0';

WAIT

FOR

320NS;

WAIT;

--WILLWAITFOREVER

END

PROCESS;

PROCESS(CT_RESULT)

BEGIN

ASSERT(CT_RESULT/=

"1001")

REPORT

"Thecountergetstonine!!"

SEVERITY

ERROR;

END

PROCESS;END

;仿真响应以上测试文件在Modelsim中的仿真波形如下:当计数到”1001”,在Modelsim的信息栏输出所要报告的信息,如下:文件I/O的读写从文件加载数据或将数据存储到文件中例如用户定义的测试矢量可以保存在文件中,然后在仿真时从文件中读取这些测试矢量。另外,仿真的结果可以保存在文件中。VHDL’93的文件I/O读写主要是用于仿真,综合工具并不支持文件I/O的读写。如果想在仿真时进行文件操作,必须包括标准库STD中的TEXTIO定义的程序库,该程序库中包含了文件啊你输入输出所需要的基本子程序(函数和过程)。文件I/O的读写定义文件文件的两个类型Integer:文件中的数据是以二进制存取的,不能被人识别,只有integer型的数据能够存入这列文件。String:文件是以ascii码形式读取的,可以被人识别;integer、bit_vector(xdowntoy)、string(xdownto1)、std_logic_vector(xdowntoo)、bit等都可以被存入此类文件。定义语法FILEFILEIN:

TEXT;TYPEINTEGERFILEIS

FILE

OF

INTEGER;

FILEFILEIN:INTEGERFILE;文件I/O的读写打开文件定义文件句柄后就可以在程序中打开指定文件,同时指定打开模式。FILE_OPEN(fstatus,

filefile_handle:file_type,filename:

string,openmode);fstatus:指示当前文件状态,使用前要定义VARIABLEFSTATUS:

FILE_OPEN_STATUS;文件状态一般包含:OPEN_OK、STATUS_ERROR、NAME_ERROR、MODE_ERROR;file_handle:是上一步定义的文件句柄filein;filename:是以双引号括起的文件名,如”datain.txt”;openmode:指打开该文件的模式,文件打开模式有以下三种:read_mode、write_mode、append_mode。文件I/O的读写读写文件打开文件后就可以对文件进行读写操作,其语句格式如下:READ(file_handle,

value

:

type);WRITE(file_handle,

value

:

type);使用以上语句只能写入指定类型的数据,如integer类型的只能写入integer型数据。如果写入其他类型需要遵循以下步骤:定义line型变量:variablebuf:

line;将需要写入的数据写入line变量:write(buf,

value);从line变量把数据写入文件:writeline(file_handle,buf);文件I/O的读写关闭文件在文件读写完毕后,需使用file_close(file_handle);关闭文件。ENDFILE(file_handle);判断在文件操作中是否读取到文件的末尾。文件I/O的读写VHDL’93标准包括如下重要的文件I/O操作子程序FILE_OPEN(…)READLIEN(…)READ(…)WRITELINE(…)WRITE(…)ENDFILE(…)FILE_CLOSE(…)文件I/O的读写下面举一个例子,使用了上面介绍的各种语法LIBRARY

IEEE;USE

STD.TEXTIO.ALL;USE

IEEE.STD_LOGIC_TEXTIO.ALL;USE

IEEE.STD_LOGIC_1164.ALL;USE

IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTESTINISEND

ENTITYTESTIN;ARCHITECTURERTLOFTESTINISBEGIN

PROCESS

IS

FILE

FILE_OUT1,FILE_IN:

TEXT;

--定义text类型的文件句柄

VARIABLE

FSTATUS1,FSTATUS2:

FILE_OPEN_STATUS;

--定义文件状态指示变量文件I/O的读写 VARIABLE

COUNT:

INTEGER

:=

5;

--integer型

VARIABLE

STRINGDATA:

STRING(5

DOWNTO

1)

:=

“SCUTE”;

--string型

VARIABLE

VECTORDATA:

BIT_VECTOR(5

DOWNTO

0)

:=

“001000”;

--bit_vector型

VARIABLE

VALUE

:

STD_LOGIC_VECTOR(3

DOWNTO

0)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论