0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何搭建分层次的验证模型及实现仿真研究

电子设计 来源:现代电子技术 作者:潘闻融,周智 2020-09-27 18:02 次阅读

当今社会,芯片技术与人们的生活密切相关,在各种电子产品中都有芯片的身影,而且,它们往往是电子产品关键的核心技术。制造芯片的流程非常复杂而且资源投入巨大,保证芯片的设计质量非常重要。验证工作是芯片制造过程中及其关键的一个环节,无缺陷的芯片不是设计出来的,而是验证出来的,验证过程是否准确与完备,在一定程度上决定了一个芯片的命运。

目前在百万门级以上的ASIC,IP,SoC设计时代,验证约消耗整个设计工作的70%,需要专职的验证团队,而且验证团队人数通常是设计团队的 1.5~2倍。随着设计规模的扩大,芯片验证的重要性达到了一个新的高度,但对验证方法也提出了更多的要求,怎样搭建高效稳定的验证模型成为目前研究的热点。本文重点介绍如何搭建一种分层次的验证模型,以及如何使用这套验证模型进行仿真

1 验证架构

验证架构通常称为testbench,如图1所示,可以把验证架构分为激励源、发送器、接收器、参考模型和记分牌五个部分。激励源属于脚本层,发送器和接收器属于时序层,参考模型和记分牌属于软件层。

如何搭建分层次的验证模型及实现仿真研究

激励源 仿真的数据在激励源中生成,它是一个TCL脚本语言解释器,激励代码采用TCL解释性脚本语言编写,激励生成之后会放到发送端共享缓存区中,这个过程在设计代码开始仿真之前。

发送器 当仿真开始后发送器会根据设计条件把数据从发送端共享缓存区中取出来,传递到设计模块和参考模型中,发送器由Verilog代码编写实现,需要设计自己的PLI函数用来作为与发送端共享缓存区传递数据的接口

接收器 接收器用来采集设计模块处理后的数据,并把数据放到接收端共享缓存区中,用于记分牌读取数据,接收器由Verilog代码编写实现,需要设计自己的PLI函数用来作为和接收端共享缓存区传递数据的接口。

参考模型分析激励源的数据并产生和设计模块用来校验结果,由于验证人员和设计人员的理解思路不同,参考模型的功能和设计模块的功能也不同,但随着验证过程的推进,两者应该收敛于需求规格书,参考模型基于C++语言实现。记分牌记分牌从接收端共享缓存区取出数据和参考模型的分析结果并进行比较,把每次比较的结果记录下来,以便验证人员定位问题,记分牌基于C++语言实现。

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到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()需要在系统函数/任务调用时在参数中指定一个选定的单元。

4 软件层关键技术

编写参考模型和记分牌属于验证过程的软件层,采用C++语言编程实现。把这两个验证组件设计成两个函数,分别为Pan_rm(char *s_indata,vector<char*>vr_outdata)和 Pan_check(char*s_indata,vector<char*>vc_outdata),函数入口参数为字符指针类型的原因是 TCL脚本语言处理的全部是字符类型的变量,脚本层生成的激励数据为字符类型。

当仿真执行到Verilog代码中PLI任务的时候,PLI函数中的calltf()会调用Pan_rm函数或Pan_check函数。在发送器中,calltf()把发送端共享缓存区中的数据取出并传给。Pan_rm函数,Pan_rm函数把入口的字符类型变量转换成整型变量,然后根据需求规格做相应的处理,最后把处理结果放入共享队列;在接收器中,calltf()收集设计模块的处理结果并传给Pan_check函数,Pan_check函数取出共享队列里面对应的Pan_rm函数的处理结果并与Pan_check函数的入口数据进行比较,把比较的结果存人到接收端共享缓存区,最后打印结果到一个输出文件中以便验证人员定位问题。

5 共享缓存区

为了实现脚本层,时序层和软件层能够使用共享缓存区,要把C++扩展的TCL命令、编写的PLI函数命令以及软件层代码写在同一个C++工程文件里,定义全局变量作为共享缓存区实现三个层次的互联,最后通过VC编译代码以动态库的形式加载到仿真器里面去。

6 结 语

TCL脚本命令在仿真之前运行,一经执行所有的激励数据就会生成,在PLI函数的checktf()例程里面获取modelsim的TCL解释器,并用TCL初始化函数将其初始化,这样扩展的TCL命令就可以在Modelsim的解释器里使用了。

需要注意的是,如果不在PLI函数的checktf()例程里面获取并初始化Modelsim的TCL解释器,那么PLI函数是加载在Modelsim内核的,如果要修改PLI函数里面调用的全局变量,要在扩展的TCL命令之前加上vsim_kernel,这样才可以修改全局变量。当验证组件准备好、验证环境搭建完毕后,编写自动运行脚本执行仿真过程,按照如图2所示的操作流程自动进行验证工作:运行自动脚本,启动仿真器,加载动态库,Modelsim的 TCL解释器运行TCL脚本,开始仿真推进仿真时间,触发发送器的PLI函数发送数据,软件层分析数据得到结果,设计模块分析数据得到结果,触发接收器的 PLI函数收集数据,软件层比较数据,打印分析结果。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接收器
    +关注

    关注

    14

    文章

    2473

    浏览量

    71978
  • soc
    soc
    +关注

    关注

    38

    文章

    4174

    浏览量

    218439
  • 发送器
    +关注

    关注

    1

    文章

    259

    浏览量

    26843
收藏 人收藏

    评论

    相关推荐

    计算机网络为什么要分层次

    因为如果两台计算机能够相互通信的话,实际实现起来是非常困难操作的。我们分层的目的就是为了将困难的问题简单化,并且如果我们分层了,我们在使用的时候就可以仅仅关注我们需要关注的层次,而不用
    发表于 02-03 17:12 2353次阅读
    计算机网络为什么要<b class='flag-5'>分层次</b>

    用TINA如何搭建仿真模型

    使用TINA仿真单极运放的环路,仿真模型知道怎么搭建,现在要仿真由两级TL082搭建的两级运放
    发表于 08-15 08:10

    请问multisim中有层次块的电路怎么仿真

    用mos管搭建的电路图可以仿真,结果正确,但将其放入层次块中后无法仿真,应该是层次块有问题,想问下对于含有
    发表于 07-18 16:57

    ETest_RT的相关资料下载

    ETest_RT是一款完全自主知识产权的半实物仿真测试平台(HIL)集成开发环境。该开发环境采用标准化的硬件模块和分层结构化的软件平台,实现了半实物仿真测试与
    发表于 12-14 07:49

    K210是否可以将模型分层实现

    请问各位 是否可以将模型分层实现实现的思路大概如何。是先训练好模型分层转换为kmodel,依
    发表于 09-15 06:17

    SoC验证环境搭建方法的研究

    本文从SoC (System on a Chip)验证环境外在的框架结构、内在的验证数据的组织与管理和体现其工作原理的系统脚本的设计思想三方面出发,讨论SoC 验证环境的搭建方法,并
    发表于 12-14 09:52 22次下载

    网络设备在层次模型中所处的位置

    网络设备在层次模型中所处的位置 在分层模型中,对等是一个很重要的概念,因
    发表于 06-09 19:27 1066次阅读
    网络设备在<b class='flag-5'>层次</b><b class='flag-5'>模型</b>中所处的位置

    监控系统设备构成的分层次结构详析

    监控系统设备构成的分层次结构详析 在这介召一下监控系统中采用的设备构成的分层次结构,在计算机网络中运用的拓扑结构同样在监控系统中得到广泛的运用,而拓
    发表于 12-18 09:56 1752次阅读

    攻击模型BBFPAN分层的新方法

    针对以模糊 Petri网 为理论基础的网络攻击模型BBFPAN 自学习能力差的缺点,提出了一种新的适用于对攻击模型BBFPAN 进行层次式划分的分层算法,为将神经网络理论引入攻击
    发表于 06-07 18:27 18次下载
    攻击<b class='flag-5'>模型</b>BBFPAN<b class='flag-5'>分层</b>的新方法

    开关磁阻电机MATLAB仿真模型研究

    开关磁阻电机MATLAB仿真模型研究
    发表于 01-21 12:12 8次下载

    传动系统模型在环虚拟车辆仿真研究

    模块都根据实车数据进行了参数化。对DCT离合器控制和挡位切换逻辑策略进行了研究,提出了一种基于FMI标准的协同仿真方法,并讨论了协同仿真模型各模块的步长设置。对比了模拟NEDC驾驶循环
    发表于 03-01 10:55 0次下载
    传动系统<b class='flag-5'>模型</b>在环虚拟车辆<b class='flag-5'>仿真</b><b class='flag-5'>研究</b>

    利用APB_I2C模块搭建层次验证平台

      近期疫情严重,身为社畜的我只能在家中继续钻研技术了。之前写过一篇关于搭建FIFO验证平台的博文,利用SV的OOP特性对FIFO进行初步验证,但有很多不足之处,比如结构不够规范、验证
    的头像 发表于 08-10 11:14 2932次阅读

    在simulink中搭建逆变器仿真模型

    逆变器仿真。 在simulink中搭建了逆变器仿真模型,采用电压电流双闭环控制,采用LC滤波器,输出电压完美的跟随给定,且THD仅1%。 整个仿真
    发表于 02-28 15:32 12次下载
    在simulink中<b class='flag-5'>搭建</b>逆变器<b class='flag-5'>仿真</b><b class='flag-5'>模型</b>

    永磁同步电机的矢量控制策略(八)之仿真模型搭建与源代码

    的数学模型 永磁同步电机的矢量控制策略(二)一一一数学模型 8.1SVPWM的仿真模型搭建 按照SVPWM的
    发表于 03-13 11:25 2次下载
    永磁同步电机的矢量控制策略(八)之<b class='flag-5'>仿真</b><b class='flag-5'>模型</b><b class='flag-5'>搭建</b>与源代码

    如何使用Verilog语言进行仿真验证

    仿真验证主要作用是搭建一个测试平台,测试和验证程序设计的正确性,验证设计是否实现了我们所预期的功
    的头像 发表于 10-02 16:29 1837次阅读
    如何使用Verilog语言进行<b class='flag-5'>仿真</b><b class='flag-5'>验证</b>