刘斌,虞小鹏,谭年熊
(1.浙江大学微纳电子学院,浙江杭州 310000;2.西安路科验视集成电路技术咨询有限公司,陕西 西安 710000)
在日益先进的工艺制程下,芯片的流片费用越来越昂贵。为了保证一款芯片能够顺利流片完成全部功能,芯片功能验证的重要性日益突出。尽管目前的SoC 系统集成方式越来越普遍,在系统快速集成和系统测试完备性之间也出现了越来越大的人力鸿沟需要填补。一个庞大的SoC 系统往往容纳了数十个子系统和IP,而这些硬件资源之间的互连与集成急剧放大了需要测试的系统功能空间。动态功能仿真技术与UVM(Universal Verification Methodology)作为主要的芯片验证手段,面临着紧紧跟随芯片设计步伐的项目压力。为了降低项目压力,一种面向SoC 系统的UVM 可扩展自动化验证平台得以开发。该平台的推出,使得多款不同类型的芯片在结构化的验证环境中得到充分验证,有力地保障了芯片研发进程。
成熟稳定的IP 可以加速SoC 的系统集成。一个典型的SoC 系统中的IP按照功能类型,可以分为处理器、片上网络(Network on Chip,NoC)、存储、I/O 设备等。它们与专用的功能模块、系统控制模块等先构成子系统,而后多个子系统构成了SoC系统。为了能够确保从模块级到子系统级再到系统级的集成都是经过充分测试的,需要在每一个集成层次中对待测设计(模块、子系统和系统)进行功能验证。
对于模块、子系统和系统进行验证有着不同的目标和需求。模块验证需要尽可能完成80%以上的功能测试点要求,对寄存器的配置做组合设置,并且在各个端口上进行充分的数据组合测试,模块级测试用例以SV 和UVM 为主[1]。子系统验证会围绕着各个模块实例和它们之间的集成关系进行验证,子系统级测试用例兼有UVM 和C 语言。系统级验证会就各个子系统的启动运行和系统应用场景进行测试,系统级测试用例以C 语言为主[2]。
UVM 验证方法学在过去的十年已经成为了动态功能验证的主要方法。它在吸收了以往多种验证方法学的基础上,将验证环境的构建、验证组件的标准模型、验证组件间的通信、寄存器模型集成、测试序列的组织和调度都纳入其中[3]。
如图1 所示,典型的UVM 验证结构中需要包含这些组件:agent(由sequencer、driver、monitor 构成)、environment(由若干agent和子一级environment构成)、test(由一个顶层environment、register model、configuration object 构成)。与模块验证有关的代码相比于设计代码要多出很多[4]。从验证代码的类型划分来看,可以分为验证结构代码、测试用例代码、数据检查代码与功能覆盖率代码。在实际项目中由于工程师的经验局限,每个验证结构不仅无法保持类似结构,还需要重复投入的人力来完成前期验证结构的搭建以及后期的管理维护。
图1 典型UVM验证结构
如图2 所示,一种可扩展自动化验证平台不但可以让验证平台以非常短的时间创建出来,还能保持验证结构的一致性。结构化的验证框架有助于保持数据检查代码和功能覆盖率代码的范式。该平台也具备了标准的测试指令,便于验证人员在多个项目间理解和复用已有的测试用例[5]。
图2 Liezhen验证平台的增益
Liezhen(列阵)验证平台可以将验证环境搭建时间缩短到30 min 之内。依托于L 指令传输网络和适配组件,Liezhen 可以使用标准化的测试指令来实现测试用例。
不同的设计往往具备多种不同的总线接口和系统控制信号[6]。如图3 所示,Liezhen 验证平台可以针对不同接口产生相对应的验证结构,用以满足系统控制、寄存器访问和数据传输等需求。不同的agent会同时监测总线信号,将总线采样数据事务送往数据检查组件和功能覆盖率模型[7]。不同的agent 可以接收从lzn_net 传递的标准指令,再经由lzn_slave 适配为各个agent 可识别的激励事务信息,最终通过接口发送至待测设计。这些标准指令可以由一个或者多个lzn_master 发送。
图3 Liezhen验证平台的结构
Liezhen 验证平台可以在模块级、子系统级和系统级满足验证需求,充当外围激励或者接管设计内部激励,既能支持标准化的SV 和C 测试指令,也可以支持UVM sequence,实现多种激励形式[8]。
Liezhen 验证平台生成验证环境是通过一套完善的Python 脚本来实现的[9]。对于不同的待测设计,首先需要收集该设计的端口信息、寄存器信息、地址映射信息。端口信息列举出各个总线端口、主从设置、激励或者监测设置。如图4 所示,这些信息可以通过图形界面或者表格进行输入,工具会将收集到的设计参数放入数据池。这些数据池中的信息会被分为四类,分别是配置数据、环境结构数据、寄存器数据和测试数据。分类好的数据会与各自的模板文件(Mako 格式文件)结合,最后由Python 实现的代码生成器按照验证结构、文件类型依次生成相对应的代码。
图4 Liezhen验证平台的生成过程
Liezhen 验证平台拥有一套标准化测试指令[10]。标准化指令可以使得验证人员在不同的设计、验证阶段使用相同的测试指令进行测试。如表1 所示,标准测试用例按照用途可以分为数据访问指令、信号控制指令、随时数据指令、测试控制指令、核间通信指令、消息报告指令、断言检查指令、覆盖率定义指令、I/O 外设控制指令等[11]。这些指令可以几乎满足所有需求,实现90%以上的测试用例。
表1 Liezhen标准化测试指令(部分)
标准化指令由lzn_master 组件发送,经由lzn_net传递至各个lzn_slave,再由lzn_slave 转译为各个总线driver 可以识别的激励事务。指令的标准化可以对设计结构做到更大的灵活性,也能够将SV 的测试指令通过SV DPI-C 技术转为C 语言的测试指令[12]。
如图5 所示,标准化测试指令能够从lzn_master发送到lzn_slave,离不开lzn_net 的路由作用。在传递到目标agent 之前,测试指令需要经过若干层数据的打包和解包。指令的传送和转译过程分为4层[13]。第一层转换是由lzn_master 将指令类型、参数通过TLM2 协议接口传送到lzn_net。lzn_net 由AHB 总线网络构成,其将TLM2 事务通过网络地址信息送往目标slave 端口。utb_slave 从AHB slave 端口获得数据并转换为指令数据包,这是第二层转换。目标agent在接收到总线激励事务前,还需要将指令数据包转换为总线激励事务,这需要第三层转换。最终,总线agent会完成第四层转换[14]。
图5 Liezhen测试指令的传输和转换
如图6所示,Liezhen验证平台除了自动化生成方式、mako 代码模板、硬件设计结构参数、标准测试指令、指令传输网络以外,还依赖VIP(Verification IP)。VIP 是验证环境能够快速构建的必备元素。在集成VIP 之后的测试中,会进行必要的VIP 和验证结构的配置。中心化的配置可以对验证环境中各个组件进行配置。标准化的测试指令,也便于引导验证人员在实现测试用例时遵循统一的测试用例格式。
图6 Liezhen测试平台的构成要素
从图3 可知,Liezhen 在自动化生成验证组件时,可以将各个总线agent 中的monitor 通过TLM 端口连接到scoreboard(数据检查组件)和coverage model(覆盖率模型)[15]。所有数据信息在汇集到数据检查组件和覆盖率模型后,有助于数据的比对和采集。
如图7 所示,Liezhen 可以就NoC 的结构化特征,根据主端和从端的总线类型、地址位宽、数据位宽、地址映射等信息生成适配的验证结构[16]。NoC 的结构一般由工具生成,一个复杂SoC 的NoC 拓扑结构也同样复杂,Liezhen 可以在项目中与不时变化的NoC 结构保持一致。如果NoC 结构发生了变化,已经生成的Liezhen 测试平台可以根据新的参数自动生成新的验证结构[17]。
图7 Liezhen面向NoC生成的验证结构
NoC 的拓扑结构与Liezhen 验证结构中的lzn_net 指令传输网络相似。Liezhen 可以使用与NoC相同的设计结构参数来产生验证环境。验证环境产生的同时,可以产生访问各个地址范围的测试用例[18-21]。
如图8 所示,在验证LPDDR4 的流程中,Liezhen可以根据设计结构,生成相匹配的LZN TB。它包含一个lzn_master 负责发送测试指令,一个AXI 端的lzn_slave 收发数据,一个AHB 端的lzn_slave 配置寄存器,还有两个外部的memory 与LPDDR4 PHY 做数据存储交互。在LPDDR4 controller 验证过程中,lzn_master 可以先后通过lzn_slave(AHB)和lzn_slave(AXI)完成功能配置和数据发送,而且再通过lzn_net 直接访问与LPDDR4 PHY 连接的存储模型,完成数据比对。
图8 Liezhen面向LPDDR4生成的验证结构
在生成了结构化验证环境之后,可以利用标准化测试指令很快实现基本测试,如下:
如表2 所示,在将Liezhen 运用到芯片验证以后,通过将传统UVM 验证环境和采用Liezhen 自动化生成验证环境做对比,按照搭建时间、环境结构代码量、测试用例构建时间、测试用例代码量、回顾测试用例耗时、功能覆盖率数据等多个维度做比较,可以发现Liezhen 的优势,其能够在项目中发挥实效。
表2 Liezhen在芯片验证中的增效对比
利用Liezhen 自动化平台去管理和维护验证环境更为简单,因为多数验证人员需要一致性的验证结构,而又不需要为此投入太多的时间。Liezhen 自动化平台用于构建和调试验证环境的时间可以被显著缩短,而节省下来的时间也有助于让设计尽快稳定,加速项目进度。一致性的验证结构既是测试平台自动化的基础,也是测试指令标准化的基础。为了达到这种统一的验证结构,Liezhen 可以适配不同类型的验证IP,为不同类型的设计构建好相适应的验证环境。同时,Liezhen 也可以支持挂载UVM 测试序列,从而实现对于激励更为灵活的控制。在实际项目中,基于Liezhen 生成的测试平台即可以支持SV命令形式,也可以支持C 命令形式,而这也为接下来将PSS(Portable Stimulus Standard)与Liezhen 自动化平台相结合、为复杂的SoC 资源建模、为自动产生不同的测试场景和测试用例做好了准备。