微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 适用于系统级验证的VMM多层框架

适用于系统级验证的VMM多层框架

时间:11-16 来源:互联网 点击:
设计方法

本部分阐述如何实现分层结构,同时讨论对系统级验证有价值的其他内容。

内核无关的测试平台

大部分SoC使用的内核要么是经过充分验证的,要么仅进行了极少的更改。即使更改较大,其验证也需要与系统级验证完全不同的方法。因此,内核验证应与系统验证分开进行。测试平台取代内核,直接驱动到系统中,如图3所示。这种方法可提供更强大的控制能力和更多的功能,并且无需更改便可支持模块级VMM测试平台。由于设计开销减少,其仿真速度更快。它还支持生成覆盖率分级的汇编测试,以及在实际内核上运行测试。


图3 :BFM取代内核。

从模块级到系统级的基本类变化

基本类从vmm_data转变为系统级基本类,如图4所示。用于转变的基本类是与外设和系统配置关系最密切的基本类,其参数能够影响系统配置,包括外设方向和所有已使能的中断等。系统特性现已嵌入此交易类中,换言之,系统层插入发生级;编码样式如示例1所示。以下几个优点值得注意:


图4 : 基本类变化。

示例1 : 外设基本类的编码样式。



1.可以将更多限制条件添加到随机系统级类上,使外设模式与系统模式相关。因此,无需更改任何代码,就能将同一组类同时用于模块和系统测试平台。

2.使用VMM数据宏确保类层级无缝改变。

3.唯一的peripheral_id识别系统内的外设。

4.系统基本类中的寄存器功能和vmm_opts的使用确保当中断改变或焊盘引脚位置改变时,无需更改代码。因此,测试平台能够在不同项目之间高效移植,系统中测试平台的多个实例也能得到有效支持。

集成和管理子环境

在传统的VMM流程中,所有模块级子环境都被添加到顶层环境内部,然后从vmm_env调用subenv的配置、启动和停止等。这种流程会带来以下问题:

1.大量子环境会导致顶层环境变得异常复杂。

2.所有子环境的初始化任务混在一起导致移植更加困难。

3.子环境与性能下降之间存在相关性。

与传统流程相同,在新方法中模块级子环境在顶层VMM环境内分层次实例化,不同之处在于对子环境的管理由一个xactor接手。xactor产生于一个公共系统级类,它构成外设层与系统组件层之间的接口层。 xactor分阶段处理子环境,就像它是在模块级一样。此外,系统级任务从xactor内部调用,以便配置外设所需的系统组件支持。此xactor内接收的系统中断通知经由通知或函数/任务调用传递到模块测试平台。这种方法的优势在于:

1.顶层无需执行子环境初始化任务。

2.使用VMM xactor迭代器可以实现即插即用功能。一旦一个xactor实例化,连接和共识(consensus)就会自动添加。顶层针对实例化的唯一变化是只需调用xactor和子环境的构建器。

3.子环境的整个阶段处理完全在xactor内部进行,测试平台的移植能力更强, 。

示例2为用于实现外设xactor的代码示例。

示例2 :IO xactor的实现。



下面的示例3说明添加IO到系统vmm_env如何大大简化,无需连接通道或启动/停止xactor,这些任务将由VMM xactor迭代器完成,迭代器会寻找系统xactor基本类的衍生类。

示例3: Xactor插入env中。



测试结束由系统状态和外设状态决定,外设状态由子环境所传递的共识决定。结束测试之前,测试平台会查看所有活动组件的共识状态。

指定交叉关系

在指定同一外设交易内不同类型或模式的外设交易间关系上,使用VMM多流方案是一种有效的方法。如前所述,所有交易都产生自一个公共基本类,因此它们可以通过一个公共框架传递。一个路由器类(产生自vmm_broadcast)将交易路由至相应的交易器,由其处理分组数据。该流程如图5所示。


图5:交易流程。

路由器回调函数也可以根据需要丢弃或修改分组数据。当引脚通过多路复用方案由多个模块共用时,就需要进行修改。这种情况下,可以丢弃引脚冲突的交易。由于路由器知晓所生成的交易,因此它可以决定仅针对那些在测试中处于活动状态的外设调用start_xactor(),从而避免不必要的线程。

功能覆盖率

每个系统组件都会增加功能覆盖率,这样可以确保模块与系统的功能覆盖率之间有一个良好的交叉关系。由于模块交易和xactor被重用,因此来自模块级测试平台的功能覆盖率也可以在系统级重用。

流水线式RAL访问

在多核系统中,任何一个内核都可以访问外设寄存器,并没有一种直接的方法来指定在RAL读写期间外设在哪个内核上工作。间接方法则是通过读写任务的data_id字段指定内核,但其缺点是data_id的这种用法无法对来源不同的模块级环境实施。

另一种解决办法是将交易随机映射到任一内核,但是要求一个模块的所有交易必须使用同一内核接口。可以通过将内核分配变为非随机方式进行优化 。然而,即便有多个接口可用,由于RAL访问任务execute_single()一次只能接受一个交易,其效率仍然低下。如果启用流水线式RAL,则所有接口可以同时使用,接口的使用将得到进一步优化。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top