首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
基于C++TCL PLI联合仿真下的芯片验证方法研究
来源:本站整理  作者:佚名  2009-11-05 15:58:57




2 脚本层关键技术
    编写激励源数据属于验证过程的脚本层,为了高效地生成数据,使用TCL脚本语言实现。TCL与C/C++等编译性语言的最大区别是当TCL语言编写好之后不用通过软件编译就可以直接运行,运行一行就是“解释”一行,“解释”的过程通过TCL解释器完成。TCL拥有一个固有的核心命令集,同时还具有和C/C++语言类似的控制结构,如if控制、循环控制和switch控制等,并支持过程的定义和调用,对数组和字符串等简单数据结构也提供了支持,然而TCL标准库提供的命令可能不会满足需要.这时要针对某一特定应用领域对TCL语言的核心命令集合进行扩展,加入适合于自己使用的扩展命令。
    扩展TCL命令主要采用编写二进制程序包的方法,二进制程序包本身并不嵌入TCL解释器,而是一些用C/C++编写的扩展命令的集合。任何标准的TCL解释器都可以用加载的方法使用二进制程序包中的扩展命令,Modelsim仿真工具集成了TCL解释器。扩展一个TCL命令大致可以分为两步:编写扩展命令对应的C/C++过程和注册命令。TCL扩展命令的函数原型为:int Tcl_CmdProc(ClientData,Tcl_In-terp *interp,int argc,char *argv[]),参数clientData由TCL调用者传人,其值在注册扩展函数时设置;参数interp也由TCL调用者传入,是指向解释器结构的指针;参数argc和argv与标准C语言的命令行参数argc,argv的含义类似,其中argc是被调用参数的个数,argv[0]是被调用的命令本身,argv[argc]是NULL,而argv[1]到argv[argc-1]才是真正的参数。编写好的扩展命令还需要注册,如果注册成功就可以在TCL解释器中使用了,注册过程在初始化函数中进行,TCL注册函数原型为Tcl_CreateCommand(Tcl_Interp*interp,char *cmdName,Tcl_CmdProc *proc,Client-Data clientData,Tcl_CmdDeleteProc *deleteProc),cmd-Name是解释器中使用的命令名,proc为编写的扩展函数名。需要注意的是TCL初始化函数的名称必须是首字母大写的DLL文件主文件名+一个下划线+首字母大写的Init组成。


3 时序层关键技术
    编写发送器和接收器属于验证过程的时序层,时序层也包括被例化的设计模块。脚本层生成的激励数据是用TCL语言编写的,而发送器和接收器是使用硬件描述语言Verilog编写,为了实现两种语言的数据传递,需要使用PLI接口编程语言完成两者的结合,从而达到将激励数据正确传送到设计模块和参考模型以及收集设计模块输出数据的目的,完成仿真这一过程。PLI函数对应发送器和接收器中调用的任务,它使用C++语言扩展,在Verilog代码中使用,主要包括四个C++函数:calltf,cheektf,sizetf,misctf函数,一般情况下只需要编写其中的三个函数checktf,misctf和calltf函数。编写完这三个函数之后,要注册PLI函数对应的Verilog代码中使用的系统任务或函数,提供每个系统任务和函数的名字以及相应的回调函数,使用结构体s_tfeell在C++代码中来注册PLI函数。
    calltf函数在仿真运行时被调用,即仿真执行到发送器或接收器中定义好的PLI任务时,就会调用该任务对应的calltf函数;checktf函数在仿真开始运行前被仿真器调用,换句话说,在仿真时刻0,这个函数可以由仿真器的编译器调用,checktf函数的主要目的是校验一个系统/任务是否被正确使用和加载环境设置命令;misctf函数在仿真运行时的各种混杂事件情况下被调用,根据PLI函数调用变量的属性选择相应的处理策略。
    PLI函数要实现的具体功能在calltf函数中编写,在这个函数中可以通过使用tf_getp(n)和tf_putp(n,val-ue)函数读取时序层的数据和对时序层的数据赋值,其中n表示变量的位置,value表示变量要赋的值。如果时序层的数据为数组类型,使用tf_nodeinfo()函数读取和修改Verilog内存数组和变量数组中的内容。当调用tf_nodeinfo()函数来访问Verilog数组中的值时,函数将返回一个指向仿真数据结构中数组实际存储空间的指针。一旦PLI应用获得了该指针,数组中的值在仿真过程中既可以被读取也可以被修改。要访问数组,并不需要每次都调用tf_nodeinfo()函数,只需要保存好初次调用tf_nodeinfo()获得的数组指针,tf_nodeinfo()需要在系统函数/任务调用时在参数中指定一个选定的单元。

上一页  [1] [2] [3] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:125,976.60000 毫秒