Systemverilog断言介绍(二)

3.2 IMMEDIATE ASSERTIONS

        即时断言是最简单的断言语句类型。它们通常被认为是SystemVerilog过程代码的一部分,并在代码评估期间访问时进行评估。它们没有时钟或复位的概念(除非有时钟/复位控制其封闭的过程块),因此无法验证跨越时间的行为。它们还容易受到SystemVerilog过程代码通常存在的风险的影响,包括“delta-time”故障(这里可以看绿皮书4.3.4 测试平台一设计间的竞争状态),即由于过程块(always或always_*)的多次评估而受到时间步长中间临时值的影响。通常情况下,我们建议尽可能使用并发断言而不是即时断言。这个建议有几个原因:

  • 使用相对于已知时钟的断言是并发断言直接支持的功能,有助于保持预期行为的清晰和理解。

  • 时间差异风险,即即时断言可能报告临时值,这些临时值在时间步长结束时会发生变化,可能导致错误的失败报告,并增加调试的困难。

  • 由于即时断言不是相对于时钟来说明的,除非位于定时过程块中,模型或测试台架的时序行为的变化可能导致不可预测的结果。

然而,有一些特定情况下需要使用即时断言:

  • 在函数或其他真正无时钟结构中:可能希望在函数内部添加即时断言;例如,检查其参数的安全性或检查计算结果。

  • 用于状态匹配形式等价验证(FEV)工具:状态匹配的FEV工具将逻辑分解为组合逻辑锥,因此其中许多工具只能处理无时钟假设以证明等价性。

        出于这些原因,在此处描述即时断言而不是完全跳过它们。但请记住,必须谨慎使用它们,只建议在上述情况下使用。

3.2.1 WRITING IMMEDIATE ASSERTIONS

        虽然即时断言通常只应在上面描述的情况下使用,但当您确实需要使用它们时,正确使用它们非常重要。建议始终使用称为“最终延迟即时断言”的即时断言变体。最终延迟即时断言语句相对简单:只需使用assert final,后面跟随任何布尔表达式,可选地在之前添加一个标签和在之后添加一个失败消息。因此,如果想编写一个即时断言来检查当代理0没有请求时是否授予了他们的访问权限,可以编写以下语句:

grant0_ok: assert final (!(gnt[0] && !req[0])) else$error(“Grant without request for agent 0.”);
或者
grant0_ok: assert #0 (!(gnt[0] && !req[0])) else$error(“Grant without request for agent 0.”);

        标签grant0_ok是断言的一个可选名称;如果没有标签,大多数EDA工具会自动生成一个名称,但我们建议始终包含一个标签。

    else $error ...的动作块也是可选的,如果没有它,大多数仿真工具会为断言失败生成默认消息。但建议始终在这里包含一些有意义的内容,以帮助仿真调试。

        这个断言可以放在任何模块内的always块中,只要gnt和req信号是可见的,或者放在具有访问这些信号权限的函数内。也可以将其放在模块内的always块之外;在这种情况下,它将被视为在隐含的always_comb块中。每当执行其过程代码时,将检查该断言。

        插个题外话,理解 assert #0 or assert final,这里需要复习一下Time Slot的概念(具体细节可以看绿皮书4.4章节)。

图片

根据IEEE1800里对于assert #0 or assert final的描述如下:

  • #0 : for an observed deferred assertion

  • fina1: for a final deferred assertion

图片

        可以看到两者区别在于采样region的不同,实际上大多数case中使用assrt #0还是asset final都是一样的。通过deferred assertion就可以避开delta-time可能导致的问题。

3.2.2 COMPLICATIONS OF PROCEDURAL CODE AND MOTIVATION FOR ASSERT FINAL

        在SystemVerilog中执行过程代码(主要是always块)的方式可能会让许多用户感到惊讶,甚至包括那些在这种语言中设计多年的用户。您需要记住以下三个关键概念:

  • 在单个always块中,语句按照它们出现的顺序执行,就像软件代码一样。

  • 对于多个always块,没有保证执行顺序;它们可以以任何顺序执行。

  • 如果always块的敏感列表中的信号发生变化(由于另一个always块或其他类型的赋值导致),它将在同一时间步重新执行。

        这些特性可能会导致某些立即断言的行为令人惊讶,除非用户对LRM非常熟悉。这就是为什么语言的较新版本引入了延迟断言的概念。延迟断言是一种立即断言的形式,遵循以下特殊规则:如果包含它们的过程在单个仿真时间步内执行多次,只有最后执行的结果会被报告。

        为了更清楚地说明这一点,以下是一个非常糟糕的RTL代码片段示例,其中使用了非延迟的立即断言:

always_comb begin : add_1_to_evensif (f_even(i) && i < 9) begini = i + 1;a1: assert (i >= 10) else $error(“i is %0d”,i);end
end
always_comb begin : add_1_to_oddsif (f_odd(i) && i < 10) begini = i + 1;a2: assert (i >= 10) else $error(“i is %0d”,i);end
end

        假设f_even正确地对偶数返回true,f_odd正确地对奇数返回true,如其名称所示。如果i在某个地方被赋予小于10的值,上述一对始终计数块将一直被执行,每次交替地将i增加1,并且每次在i增加但尚未达到最大值时都会出现断言失败:

Assertion failure in myfile.v:40: i is 4
Assertion failure in myfile.v:34: i is 5
Assertion failure in myfile.v:40: i is 6
Assertion failure in myfile.v:34: i is 7
Assertion failure in myfile.v:40: i is 8
Assertion failure in myfile.v:34: i is 9

        用户会发现上述信息非常令人困惑,因为在仿真器的每个时间步骤结束时,他们会发现i的值始终至少为10。在时间步骤期间发生变化的中间值触发了这些断言。这就是为什么引入延迟断言的原因:对于延迟断言,在任何仿真时间步骤中,只报告给定过程中每个断言最终执行的结果。在上述示例中,如果每个assert被替换为assert final,那么将看不到任何违规行为:对于任何给定时间步骤中每个过程的最终执行,要么i将具有合法值,要么不会检查任何断言。


原创 Junxiao Zhang 芯片验证笔记 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础如何自学C#?

前言 本文来源于知乎的一个提问&#xff0c;提问的是一个大一软件工程专业的学生&#xff0c;他想要自学C#但是不知道该怎么去学&#xff0c;这让他感到很迷茫&#xff0c;希望有人能给他一些建议和提供一些学习方向。 个人建议 确认目标&#xff1a;自学C#首先你需要大概了解…

spring boot MongoDB实战

项目搭建 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

谈谈 Redis 如何来实现分布式锁

谈谈 Redis 如何来实现分布式锁 基于 setnx 可以实现&#xff0c;但是不是可重入的。 基于 Hash 数据类型 Lua脚本 可以实现可重入的分布式锁。 获取锁的 Lua 脚本&#xff1a; 释放锁的 Lua 脚本&#xff1a; 但是还是存在分布式问题&#xff0c;比如说&#xff0c;一个客…

李宏毅机器学习笔记-半监督学习

半监督学习&#xff0c;一般应用于少量带标签的数据&#xff08;数量R&#xff09;和大量未带标签数据的场景&#xff08;数量U&#xff09;&#xff0c;一般来说&#xff0c;U>>R。 半监督学习一般可以分为2种情况&#xff0c;一种是transductive learning&#xff0c;…

GO 语言的方法??

GO 中的方法是什么&#xff1f; 前面我们有分享到 GO 语言的函数&#xff0c;他是一等公民&#xff0c;那么 GO 语言中的方法和函数有什么区别呢&#xff1f; GO 语言中的方法实际上和函数是类似的&#xff0c;只不过在函数的基础上多了一个参数&#xff0c;这个参数在 GO 语…

O2O优惠券预测

O2O优惠券预测 赛题理解赛题类型解题思路 数据探索理论知识数据可视化分布 特征工程赛题特征工程思路 模型训练与验证 赛题理解 赛题类型 本赛题要求提交的结果是预测15 天内用券的概率&#xff0c;这是一个连续值&#xff0c;但是因为用券只有用与不用两种情况&#xff0c;而…

Redis入门到实战(四、原理篇)RESP协议

目录 2、Redis内存回收-过期key处理3、Redis内存回收-内存淘汰策略 Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&#xff09;&#xff1a; 客户端&#xff08;client&#xff09;向服务端&#xff08;server&#xff09;发送一条命令…

数字秒表VHDL实验箱精度毫秒可回看,视频/代码

名称&#xff1a;数字秒表VHDL精度毫秒可回看 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表的VHDL设计&#xff0c;可以显示秒和毫秒。可以启动、停止、复位。要求可以存储6组时间&#xff0c;可以回看存储的时间 本资源内含2个工程文件&am…

2023 年程序员必读的 27 本软件开发书籍

不断发展的软件开发领域需要不断学习和改进。现代开发实践要求软件工程师具备全面的知识&#xff0c;包括各个领域的理论见解和实践技术&#xff0c;从编程语言和数据库管理到质量保证、网页设计和 DevOps 实践。 这就是编程书籍可以提供帮助的地方。通过及时了解此类书籍并应…

模拟退火算法求解TSP问题(python)

模拟退火算法求解TSP的步骤参考书籍《Matlab智能算法30个案例分析》。 问题描述 TSP问题描述在该书籍的第4章 算法流程 部分实现代码片段 坐标轴转换成两点之间直线距离长度的代码 coordinates np.array([(16.47, 96.10),(16.47, 94.44),(20.09, 92.54),(22.39, 93.37),(2…

如何给Github上的开源项目提交PR?

前言 对于一个热爱开源的程序员而言&#xff0c;学会给GitHub上的开源项目提交PR这是迈出开源的第一步。今天我们就来说说如何向GitHub的开源项目提交PR&#xff0c;当然你提交的PR可以是一个项目的需求迭代、也可以是一个Bug修复、再或者是一些内容文本翻译等等&#xff0c;并…

单片机点亮led管(01)

如何开始学习单片机 1&#xff1a;实践第一 2&#xff1a;补充必要的理论知识&#xff0c;缺什么补什么 3&#xff1a;做工程积累经验&#xff08;可以在网络上收集题目&#xff0c;也可以有自己的想法大胆的实验&#xff09; 单片机是什么&#xff1f; 单片机&#xff08…

5分钟内在Linux上安装.NET Core应用程序

作为开源的忠实粉丝&#xff0c;我喜欢 .NET Core 的跨平台特性。它开启了无限的可能性&#xff0c;从业余爱好项目、实验和概念验证&#xff0c;到在具有高安全性和可扩展性的经济高效基础设施上运行的大规模高负载生产应用程序。我通常从任何云平台提供商那里获得最简单、最便…

<C++> 模拟实现string

目录 前言 一、模拟实现string 1. 成员变量 2. 构造函数 2.1 构造函数 2.2 重载默认构造 2.3 合并 3. 析构函数 4. 拷贝构造函数 5. c_str 6. size 7. operator[ ] 7.1 普通版 7.2 const版本 8. 迭代器—iterator 8.1 普通版iterator 8.2 const版本iterator 9. 尾插 10. …

【微服务 SpringCloud】实用篇 · 服务拆分和远程调用

微服务&#xff08;2&#xff09; 文章目录 微服务&#xff08;2&#xff09;1. 服务拆分原则2. 服务拆分示例1.2.1 导入demo工程1.2.2 导入Sql语句 3. 实现远程调用案例1.3.1 案例需求&#xff1a;1.3.2 注册RestTemplate1.3.3 实现远程调用1.3.4 查看效果 4. 提供者与消费者 …

美创科技入选“内蒙古自治区第一届网络安全应急技术支撑单位”

近日&#xff0c;内蒙古自治区党委网信办、国家网络应急技术处理协调中心内蒙古分中心评选“内蒙古自治区网络安全应急技术支撑单位”结果公布。 经自治区各地区、各部门和单位推荐各单位自主申报&#xff0c;资料审查和专家评审等环节&#xff0c;美创科技成功入选“内蒙古自治…

Linux将磁盘空闲空间转移到其他目录下(home目录转移到root目录下)

目录 1、查看分区 2、备份home分区文件 &#xff08;重要&#xff09; 3、卸载/home 4、删除/home所在的lv 5、扩展/root所在的lv&#xff08;我这里还扩展了、dev/sr0&#xff09; 6、扩展/root文件系统。 7、重新创建home lv 创建时计算好剩余的磁盘容量&#xff0c;建…

数据预处理—滑动窗口采样数据

一个简单的例子&#xff1a; # data: 这是要应用滑动窗口采样的输入数据&#xff0c;通常是一个序列&#xff0c;例如列表或NumPy数组。 # window_size: 这是滑动窗口的大小&#xff0c;表示每个窗口中包含的元素数量。 # step_size: 这是滑动窗口移动的步长&#xff0c;表示每…

一个可以解决企业跨网文件交换难题的软件所具备的特性必须有哪些

在当今数字化办公的浪潮中&#xff0c;企业跨网文件交换成为了不可忽视的重要需求。无论是内部网络还是外部网络&#xff0c;都存在着各种跨网文件交换的场景&#xff0c;然而这一过程也面临着一系列的挑战。本文将深入探讨企业跨网文件交换的难题以及一款可以解决企业跨网文件…

vue 树状结构数据渲染 (java 处理 list ->树状)

树状结构 Element ui https://element.eleme.cn/#/zh-CN/component/tree <el-tree :data"data" :props"defaultProps" node-click"handleNodeClick"></el-tree><script>export default {data() {return {data: [{label: 一级…