原创 Virtual JTAG仿真要点

2008-7-16 22:56 5806 8 6 分类: FPGA/CPLD

半年前应jack0321朋友的要求 riple 就想着要写这个题目,四个月前终于有机会做了仿真,还写了个自动生成测试向量的脚本,后来忙着其他事情,就拖到了现在。 riple


 


VJI的部分功能是通过自定义逻辑来实现的。对VJI仿真的目的就是验证这部分逻辑以及这部分逻辑与用户设计之间配合的正确性。 riple


仿真是上板实测前最重要的一步,仿真都通不过,电路板上能跑通那才叫怪呢。VJI的仿真也不例外,如果不通过仿真验证VJI接口的正确性,而通过实测,甚至是SignalTap II调试的话,麻烦可就大了。在 riple 最初使用VJI时,就是通过实测和SignalTap II来调试VJI的,好在那时用的比较简单,没费太大力气。 riple


Virtual JTAG是支持仿真的。不过,就像Altera所有硬核模块一样,对VJI的仿真是通过行为级模型实现的。与其他硬核模块不同的是,VJI除了和用户逻辑有接口之外,还有一个隐藏起来的“虚拟”接口——JTAG接口。对这个接口的模拟可不太容易做:在真实电路中,这个接口是连接到调试宿主机(PC机)上的,而且它的行为是通过Tcl程序,受到用户的“动态控制”的。 riple


“动态控制”在Modelsim这种编译执行的仿真器中是无法实现的,我目前也不知道哪款仿真工具能够支持这样的用户交互。为了绕开这个难点,VJI的仿真模型采用了“静态控制”的方法。所谓“静态控制”,就是把对VJI的操作,通过参数配置的方式传递给VJI的行为模型,由于参数配置是在编译前指定好的,在仿真过程中不会也不能发生变化,所以是静态的。如果需要更改对VJI的控制,就要重新配置参数,重新编译后才能生效。这样做虽然与真实操作有些差异,但是也足够验证VJI与用户逻辑配合动作的正确性了。 riple


 


费了上面这么些话,才说到重点上。 riple


VJI的行为模型提供了三个参数接口: riple


sld_virtual_jtag_component.sld_sim_action
sld_virtual_jtag_component.sld_sim_n_scan
sld_virtual_jtag_component.sld_sim_total_length


这三个参数分别代表“扫描链操作序列”、“扫描链操作次数”和“扫描链操作总长度”。 riple


其中sld_sim_action比较复杂,由一系列的扫描链操作组成,每一次扫描链操作由4个操作参数组成:time type value length。这四个参数设定了具体一次扫描链操作的相对时间、操作类型(IR/DR)、串行移入数值、串行移入数值的位数(长度)。两个参数之间用逗号分隔,每组参数用括号保持在一起,两组参数之间用逗号隔开。就像下面这个样子: riple


((time,type,value,length),(time,type,value,length),(time,type,value,length))


其余两个参数sld_sim_n_scan和sld_sim_total_length是这一系列扫描链操作的统计信息,可以由第一个参数推算得到。“扫描链操作次数”无需解释,“扫描链操作总长度”是第一个参数中所有length值之和。这两个参数都不区分IR或DR。 riple


 


这些参数就是一组参数化的测试激励。在仿真开始后,这一系列测试激励绕过了VJI的“虚拟”JTAG接口,直接施加到VJI行为模型内部,在VJI的用户逻辑接口产生相应的波形,实现了对VJI的仿真。这一仿真过程与真实的硬件操作有两个不同点:一是激励是静态施加到仿真环境中的,无法实现用户交互,所以需要设计一组最有效的操作参数,保证测试的功能覆盖率;二是仿真过程绕开了真实的JTAG操作,无法验证Tcl脚本与JTAG API的配合。对VJI仿真的主要目的是验证用户自定义扫描链逻辑与VJI的配合正确性,实践证明这一部分逻辑也是最容易出错和难以直接调试的。 riple


 


需要说明的是,实际的JTAG电路运行速度不快,TCK只有不到10MHz的频率。所以仿真中的电路跑起来也不快,需要耐心等待。 riple


 


手工输入上述三个参数非常繁琐,而且容易出错。试试手工生成下面这组参数,嘿嘿,不是很容易吧。


sld_sim_action : (1,1,1,4),(1,2,6,6),(1,1,2,4),(1,2,0,6),(1,1,8,4),(1,2,3,2),(1,1,4,4),(1,2,55aa,10),(1,1,4,4),(1,2,f0f0,10),(1,1,4,4),(1,2,0123,10),(1,1,4,4),(1,2,4567,10),(1,1,4,4),(1,2,89ab,10),(1,1,4,4),(1,2,cdef,10),(1,1,1,4),(1,2,4,6),(1,1,2,4),(1,2,0,6),(1,1,8,4),(1,2,2,2),(1,1,4,4),(1,2,55aa,10),(1,1,4,4),(1,2,55aa,10),(1,1,4,4),(1,2,55aa,10),(1,1,4,4),(1,2,55aa,10),(1,1,1,4),(1,2,4,6),(1,1,2,4),(1,2,0,6),(1,1,8,4),(1,2,2,2),(1,1,4,4),(1,2,55aa,10),(1,1,4,4),(1,2,55aa,10),(1,1,4,4),(1,2,55aa,10),(1,1,4,4),(1,2,55aa,10)
sld_sim_n_scan : 46
sld_sim_total_length : 358


由于有规律可循,可以用Tcl自动生成上面的参数。实际硬件调试时总是需要写一组Tcl脚本来完成对JTAG API的操作和用户交互,可以在这组脚本中生成上述仿真参数。在Tcl脚本中设置一个变量,用于区分是实际调试还是仅生成仿真参数,再编写一组用户操作就可以在实际调试之前得到仿真参数。 riple

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1560530 2010-8-20 22:16

过来拜读一下riple大侠的文章,很感谢您宝贵的分享!
相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
ash_riple_768180695 2011-06-26 23:20
Hardware-Assisted IEEE1588 Implementation Analysis
06/18/11 11:00:05 PM         最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条