如何写出更系统的验证检查器

前言

芯片验证是为了发现芯片中的错误而执行的过程,它是一个破坏性的过程。有效激励灌入待测模块后,需要判断出不符合功能描述的行为。检查器(Checker)就是用于查看待测模块是否按照功能描述文档做出期望的行为,识别出所有的设计缺陷

不同被检查逻辑的层次,所需要的检查方法不一致,本文主要侧重于模块级验证的检查器设计。该层次需要检查的范围有:

  • 待测模块的所有输入输出信号;
  • 待测模块的内部设计细节;
  • 待测模块在芯片系统级的应用角色;

需要的功能描述文档至少有:

  • 项目产品文档:描述本模块的实际应用场景。
  • 项目需求文档:将产品文档转换为技术人员可读懂的技术文档。
  • 待测模块设计文档:将需求文档转换为实际RTL规范。

有些模块还需要其它手册,比如Arm和RISC-V的CPU还会有架构参考手册。

对待测模块行为的检查,可以采用不同的检查方法,主要有:

  • 监视器(monitor):可以用于信号级别的数值、时序和协议检查;
  • 参考模型+比较器(Checker):检查包层级的信息;
  • 断言:主要依靠它检查模块的逻辑细节和时序信息;
  • 定向测试:用于简单场景的检查,一般自带检查器;
  • 形式验证:用数学方式来证明功能是否正确;

根据情况不同,以上这些方法可以采用其中的一种或多种,一般很少只使用一种的。待测模块使用什么样的检查方法以及检查哪些内容,也是芯片验证的一大难点。和激励设计分析类似(如何写出更牛更系统的验证激励),本文也是从完备性可拓展性可控性三方面展开阐述如何系统地思考和构建验证检查器。

1. 完备性

检查器的完备性是最基本要求,可以从接口类型、内部结构、结束检查(End of check)和检查器审查这四方面去思考。

1.1 接口类型

接口类型检查主要是检查输入输出信号是否符合文档描述的行为,也就是与待测模块连接的上下游模块的互动信号行为。可以从单一接口类型和多个接口交互两方向去分析。

1.1.1 单一接口类型

单一接口类型分析由信号检查和协议检查组成。

  • 信号检查:主要检查每根信号的行为,包括信号值正确性和数据完整性。
  • 协议检查:主要检查多根信号之间的行为,包括时序检查、握手检查,hazard检查,order检查,outstanding能力检查和包传输流程检查等。

信号值检查、时序检查和握手检查通常可以用断言检查;outstanding能力检查和包传输流程检查通常可以用监控器检查。数据完整性、hazard检查和order检查等复杂建模需求的通常需要使用检查器检查。

1.1.2 多个接口交互

多个接口交互由数据完整性、保序和同步交互组成。

  • 数据完整性:检查信息传输没有丢失。
  • 保序:检查有先后关系的传输包是否正确传输。
  • 同步交互:检查传输包是否有同步或者约定先后出现等关系。

多个接口交互的检查通常需要检查器检查。

1.2 内部结构

内部结构检查需要沿着数据流(data flow)方向分析,看看有哪些必须检查的转换(transformation)和决策(decision)。主要有:

  • 内部功能点:order、hazard、forward、sleep、replay逻辑、register读写等。
  • 资源占用:FIFO、Buffer、Interface、流水线等。
  • 资源仲裁:优先级、死锁等。
  • 数据完整性:数据拆分、数据合并、数据保序等。
  • 功能配置:待测模块行为是否符合当前寄存器和参数配置等。
  • 异常检查:复位值、内部触发fault、外部返回错误响应、中断等。
    • 异常事件是否合理;
    • 异常处理是否正确;
    • 异常处理完,待测模块是否能恢复;

内部结构的检查经常需要用到RTL内部的辅助信号,最好是在非常有必要或可以大大节省检查器建模工作量的情况下,才使用这些辅助信号。而且检查器用辅助信号之前,必须检查辅助信号行为的合理性。

1.3 结束检查

结束检查主要用于在验证用例结束时,检查RTL和TB的状态,比如RTL是否处于非busy状态、FIFO是否为空、请求是否全部处理完毕等。只要有预期某个功能在用例结束时必须处于某种状态,都可以放到结束检查里。主要有:

  • TB/DUT状态检查:Counter、FIFO、Buffer、Queue、Busy等。
  • 仿真日志检查:可以通过脚本自动提取。
  • 波形检查:通过脚本解析波形内容来检查。

1.4检查器审查

审查(Review)环节对完善检查器起着至关重要的作用,可以提高检查器质量,并减少漏检查特性的概率,对个人成长也有很大帮助。

建议以下这些审查方式都要按顺序进行:

  • 个人审查:由自己进行,对照历史错误清单进行,举一反三,避免犯类似错误。
  • 同组审查:由组内更有经验的人进行,对检查完备性、检查器设计结构、假设、采用的RTL辅助信号、代码实现进行检查。
  • 跨组审查:由待测模块的设计人员进行,对检查器完备性、设计顾虑、易错特性、局限性和各种检查器假设进行检查。

2. 可拓展性

可扩展性也包括可复用性。为了处理验证周期缩短、待测RTL规格频繁变动等各种情况,我们需要在设计检查器时提前构思如何让检查器更容易扩展。基于此,我们可以从模块化和解耦性方面去思考。

2.1 模块化

模块化需要对待测模块的每个功能点检查都分别集中于一处,而不是将一个功能点的检查分散到检查器各个地方,且多个功能点检查互相穿插耦合,这样后期如果某个功能点改动会影响检查器的很多代码,而且容易改漏。

把常见的功能封装成公共库,这样在多个地方都可以直接使用,如果功能需要改动,只需要改动一处代码即可。

不要把所有检查器内容都放到一个class类里解决,这样会造成这个类代码巨多,而且难以维护。可以把检查器根据待测模块特性切割成多个小的建模单位,由这些小的建模单位共同组成整体检查器,这样结构更清晰,而且待测模块特性的改动,只会影响其中一些建模单位,不需要整体检查器都修改。

2.2 解耦性

解耦性要求检查器代码尽量减少依赖于环境其它组件的代码,不管是变量类型、方法还是类,最好使用自身定义的,方便修改、移植和重用。

比如monitor送过来的类内容要转换为检查器自己内部定义的类内容,检查器就可以减少依赖于monitor中类的改动。

3. 可控性

检查器的可控性在这里主要是指是否方便控制检查器的功能检查范围和消息打印内容。

3.1 功能检查控制

最常见的就是控制检查器是否开启,比如在调试激励的时候,通常会先把检查器关闭掉,避免造成不必要的干扰。

如果需要的话,功能检查控制可以做到更细粒度的控制,按照待测模块的规格、接口或某个功能来控制,这样就方便根据实际情况,选择打开或关闭哪些检查。

3.2 消息等级控制

检查器中会打印一些消息,跟踪检查器的内部情况,方便出错时调试。有效的打印消息越多,仿真速度越慢,但对调试来说更友好些。因此,需要控制好不同消息的打印等级,不要每个周期都打印大量信息。默认情况下,只打印一些关键信息。只有需要更多调试消息时,才调低等级,打印更多的消息。

总结

综上所述,检查器设计可以按照“完备性->可拓展性->可控性”方向去分析。在完备性中,可以按照“接口类型->内部结构->结束检查->检查器审查”方向去分析。在可拓展性中,可以按照“模块化->解耦性”方向去分析。在可控性中,可以按照“功能检查控制->消息等级控制”方向去分析。

另外很重要的一点是:要经常对验证结果进行复盘分析,并增强检查器。

总得思维导图如下:

### 回答1: 以下是一个仓库管理系统的模拟测试: 1. 添加商品 输入商品名称、数量和价格,点击“添加”按钮,系统会提示添加成功。 2. 修改商品信息 选择需要修改的商品,点击“编辑”按钮,修改商品信息后点击“保存”按钮,系统会提示修改成功。 3. 删除商品 选择需要删除的商品,点击“删除”按钮,系统会弹出确认框,确认后商品将被删除。 4. 查询商品 输入关键字进行查询,系统会返回与关键字匹配的商品列表。 5. 入库管理 选择需要入库的商品,输入入库数量和价格,点击“入库”按钮,系统会提示入库成功。 6. 出库管理 选择需要出库的商品,输入出库数量,点击“出库”按钮,系统会提示出库成功。 7. 库存盘点 点击“库存盘点”按钮,系统会自动统计库存数量和金额,并展示给用户。 8. 库存报表 选择需要生成报表的日期范围,点击“生成报表”按钮,系统会生成库存报表并展示给用户。 9. 用户管理 管理员可以添加、修改和删除用户,并授予不同的权限。 10. 登录和注销 用户必须先登录才能使用系统,点击“注销”按钮可以退出登录。 ### 回答2: 仓库管理系统是用来管理和控制仓库存货的软件系统。通过模拟测试仓库管理系统,可以评估系统的功能是否正常、能是否稳定,以及用户体验是否友好等方面的问题。 首先,针对仓库管理系统的功能进行模拟测试。这包括系统的登录、注销、权限管理、货物入库、出库、库存查询、库存盘点等功能。测试人员可以根据系统需求和规格说明书,模拟各种场景来测试系统的功能是否实现了预期目标。例如,模拟不同用户登录系统,测试系统是否正确地根据用户权限显示对应功能;模拟货物入库操作,测试系统是否正确地新库存数量和信息等。 其次,对仓库管理系统能进行模拟测试。这包括系统的响应时间、处理能力等能指标。测试人员可以模拟多个用户同时使用系统,测试系统在高并发情况下的能表现。例如,模拟多个用户同时进行库存查询操作,测试系统是否能够及时响应并返回准确的结果。 最后,对仓库管理系统的用户体验进行模拟测试。这包括系统的界面设计、操作流程是否简洁明了、用户操作是否方便等方面的测试。测试人员可以模拟不同类型的用户,如仓库管理员、财务人员等,测试系统是否能够满足不同用户的需求,并提供良好的使用体验。 在进行仓库管理系统的模拟测试时,需要编写测试用例、搭建测试环境、执行测试并记录结果。测试人员还可以根据测试结果提出改进建议和问题反馈,以便进行系统的优化和改进。 综上所述,通过仓库管理系统的模拟测试可以全面评估系统的功能、能和用户体验,并为系统的后续开发和优化提供参考和指导。 ### 回答3: 仓库管理系统模拟测试是对仓库管理系统进行实际操作的演练和验证过程,旨在检验系统是否能够正常运作并满足用户需求。以下是一个可能的仓库管理系统模拟测试的示例: 1. 登录功能测试:进入系统时,输入正确的用户名和密码,检查系统是否能够正确登录并跳转至主界面。 2. 添加物品测试:在主界面点击添加物品按钮,输入物品信息(如名称、数量、价格等),检查系统是否能够正确保存并在仓库中显示新增物品。 3. 修改物品测试:选择已存在的物品,在编辑页面进行修改(如改物品数量或价格),检查系统是否能够正确新并保存修改信息。 4. 删除物品测试:选择已存在的物品,点击删除按钮,检查系统是否能够正确删除物品并在仓库中不再显示。 5. 查找物品测试:输入物品关键字或条件,点击搜索按钮,检查系统是否能够根据输入信息从仓库中检索并显示对应物品。 6. 出库入库测试:模拟库存操作,选择要出库或入库的物品,输入对应数量,检查系统是否能够正确新库存数量并在仓库中显示变化。 7. 库存报表测试:生成库存报表,检查系统是否能够准确计算和展示物品的库存数量、总价值等信息。 8. 用户权限测试:测试不同用户角色的权限限制,例如管理员能够管理物品和用户,而普通员工只能进行物品操作,检查系统是否根据用户角色正确限制功能访问。 9. 系统稳定测试:在高并发或长时间运行情况下,模拟多次操作和多用户同时访问,检查系统是否能够正常运行,并没有出现崩溃或卡顿等问题。 以上仅为仓库管理系统模拟测试的一些例子,具体测试方案还需根据实际系统的功能和需求进行扩展和详细设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷公子的藏经阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值