sv标准研读第十二章-过程性编程语句
书接上回:
sv标准研读第一章-综述
sv标准研读第二章-标准引用
sv标准研读第三章-设计和验证的building block
sv标准研读第四章-时间调度机制
sv标准研读第五章-词法
sv标准研读第六章-数据类型
sv标准研读第七章-聚合数据类型
sv标准研读第八章-class
sv标准解读第九章-进程
sv标准研读第十章-赋值语句
sv标准研读第十一章-操作符和表达式
第12章 过程性编程语句
12.1 总览
-条件语句(if-else/case/casez/casex/unique/unique0/priority)
-循环语句(for/repeat/foreach/while/do while/forever)
-跳转语句(break/continue/return)
12.2 概述
过程性编程语句可以出现在下面这些结构中:
-initial
-always
-always_comb
-always_latch
-always_ff
-final
-task
-function
12.3 语法
12.4 条件语句if-else
语法:
执行过程:如果cond_predicate=true,那么执行该语句,如果cond_predicate=false,不执行该语句,如果结果为false且有else语句,则执行else语句。Else是与在它前面最近的if匹配的。
如果不想要else与它前面最近的if匹配,可以加上begin end来解决这个问题:
12.4.1 if-else-if结构
结构如下:
可以用来做多路决策。
12.4.2 unique-if/unique0-if/priority-if结构
Unique/unique0/priority可以放在if前面用来做一些违规检查。
unique-if/priority-if的作用是如果不符合后面的条件,且没有else分支语句,那么会报violation。举例:
unique0-if的作用是,即时一个条件也不满足,也不会报violation,举例:
所以,unique-if/unique0-if是互斥的。
另外,需要注意的是,unique-if/unique0-if的每个条件必须是唯一的,如果发现满足一个以上的条件,也会报violation,最终执行的是最早出现的条件语句。
priority-if表示条件是按照优先级依次2列出来的。
12.4.2.1 unique-if/unique0-if/priority-if结构产生的violation
unique-if/unique0-if/priority-if条件的判断是在active域,但是生成的violation报告是在observed域,且violation报告可以被断言系统task控制。举例:
上面这个例子中,u1在active域评估a/not_a这两个条件,如果一开始a=0,当a变成1且not_a的值还没有刷新时,u1的唯一性检查会发现两个条件都满足,所以会安排一个violation报告在observed域,但是在active域not_a会被刷新,此时又不满足violation条件,因此之前的violation会被撤销,最后在observed域,不会报出任何violation。
12.4.2.2 if语句违例报告和多进程
多进程的参与可能使得违例报告会出现多次。举例:
假设:
- 在time step1,c=1,d=1,e=1,f=1,那么b1/b2两个进程都会报violation;
- 在time step2,c=1,d=0,e=1,f=1,只有b2进程会报violation;
- 在time step3,c=1,d=1,e=1,f=0,只有b1进程会报violation。
12.5 case语句
语法:
Default语句可写可不写,但是最多只能写一次。
按照顺序依次查看case里的条件,一旦匹配就执行该语句;如果没有匹配且有default语句,则执行default语句,如果没有default语句,则不执行任何case语句。
Case语句和if-else-if语句的不同:
- case语句是将条件与所有case分支条件进行比较,而if语句是只比较当前这一个分支,因此if语句更通用;
- 当条件中有x/z时,case语句的结果是确定的
也就是说,case语句会认真比较0/1/x/z,只有完全匹配,才会成功。且case语句要注意bit位的长度,如果条件和分支条件长度不匹配,那么最终长度会扩充到条件的最长bit位。且如果条件中有一个是无符号数,那么所有的条件都会被看做是无符号数,只有所有的都是有符号数,最终才是有符号数。举例:
上面这个例子中,只要select[1]=0且flaga=0,无论select[2]是什么,result都是0.
12.5.1 casex/casez语句
Casex:不care x和z
Casez:不case z
表达式中允许用?来代替z
举例:
只要ir的最高位为1,无论其他位是什么,都会走第一个分支
12.5.2 case语句中的常量表达式
举例:
上面这个例子的作用是:只要encode的任何一个bit位为1,就会进入对应的分支。
12.5.3 unique-case/unique0-case/priority-case
可以在case/casex/casez关键字前面加上unique/unique0/priority关键字。
unique-case/unique0-case的作用:如果出现多个分支匹配,那么会报violation,最后执行的分支是按照顺序第一个匹配的分支
如果unique-case /priority-case没有分支匹配,也会报出violation;如果unique0-case没有分支匹配,不会报出violation。
举例:
12.5.3.1 unique-case/unique0-case/priority-case结构产生的违例报告
unique-case/unique0-case/priority-case的判断是在active域,但是生成的violation报告是在observed域,且violation报告可以被断言系统task控制。
其处理过程和unique-if/unique0-if/priority-if一样。
12.5.3.2 case语句违例报告和多进程
多个进程违例报告的处理和unique-if/unique0-if/priority-if一样。
12.5.4 case语句设置成员关系
在case(***)后面可以加上inside关键字来设置成员关系,作用是使得括号里的表达式和每一个分支条件里的所有集合成员进行比较。举例:
12.6 pattern匹配条件语句
作用:将值与某种结构体、tagged union和常量进行比较。
Pattern指的是带有标识符、常量表达式和通配符“.*”的tagged union和结构体的嵌套。
语法:
12.6.1 case语句中的模式匹配
Matches关键字要跟在case(***)后面
举例:
上面这个例子中,如果v有invalid tag,那么它和第一个分支匹配,否则,必须包含valid tag,和第二个分支匹配。当与第二个分支匹配时,n和valid这个成员的值绑定,可以打印该值,但是当tag为invalid时,是没办法访问n的值的。
Casez/casex语句,另外加上priority/unique关键字也可以使用pattern 匹配。
12.6.2 if语句中的pattern匹配
Matches关键字要放在if()括号里面。
举例:
上面这个例子中,只要e和tag jmp里的tag jumpc匹配,那么就会进入第一个分支。
12.6.3 条件表达式里的pattern匹配
这里说的条件表达式指的是三目运算符的条件表达式,即c1?c2:c3结构。其中c1这个条件语句里就可以使用pattern匹配。
12.7循环语句
Sv有六种循环结构:forever/repeat/while/for/do while/foreach
12.7.1 for循环
For循环结构里的初始化部分可以用逗号实现多个变量的初始化,如下:
在初始化部分,变量既可以在for结构里声明,也可以放在for结构之外声明,但是如果存在多个变量,只能要么全部在for结构里声明,要么全部在for结构之外声明,而不能一部分变量放在for结构里声明,一部分放在for结构外声明,这样会报错,如下:
另外,声明的变量可以使用前面已经声明过的变量组成的表达式,如下:
12.7.2 repeat循环
Repeat会执行指定次数的语句,如果语句计算结果是x/z,那么会当做0处理,也就不会执行该语句。
举例:
12.7.3 foreach循环
Foreach循环针对的是数组,会对数组里的每一个元素进行遍历。数组标识符后面用逗号分隔开循环变量列表,并且这些循环变量要用中括号包起来,每个循环变量是一个维度。举例:
Foreach里变量和维度的映射关系如下:
注意:不要在遍历foreach循环时去改变数组的维度,否则这可能造成不可预期的后果。
12.7.4 while循环
只要while 里的表达式为真,那么就会重复执行里面的语句。
下面的例子利用while循环去统计data里1的个数:
12.7.5 do while循环
Do while循环和while循环的区别是前者是先执行语句再进行条件判断,后者是先进行条件判断再执行语句。举例:
12.7.6 forever循环
Forever循环没有条件判断语句,会一直重复执行一条语句,且要配合delay语句使用,否则可能会产生零延迟无限死循环。
12.8 跳转语句
Sv有三种跳转语句:break/continue/return
break/continue只能用在循环语句中,break用于结束整个循环,continue用于跳出当前循环;
break/continue
fork-join里不能使用break/continue来跳出fork join外的循环。
Return语句只能用在子例程中。
相关文章:

sv标准研读第十二章-过程性编程语句
书接上回: sv标准研读第一章-综述 sv标准研读第二章-标准引用 sv标准研读第三章-设计和验证的building block sv标准研读第四章-时间调度机制 sv标准研读第五章-词法 sv标准研读第六章-数据类型 sv标准研读第七章-聚合数据类型 sv标准研读第八章-class sv标…...

MySQL-联合查询
1.简介 1.1为什么要使用联合查询 在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就 要从多个表中获取数据,如下图所⽰:要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获…...

突触可塑性与STDP:神经网络中的自我调整机制
突触可塑性与STDP:神经网络中的自我调整机制 在神经网络的学习过程中,突触可塑性(Synaptic Plasticity)是指神经元之间的连接强度(突触权重)随着时间的推移而动态变化的能力。这种调整机制使神经网络能够通…...

【小沐学GIS】QGIS导出OpenStreetMap数据(QuickOSM、OSM)
文章目录 1、简介1.1 OSM1.2 QuickOSM1.3 Overpass Turbo 2、插件安装3、插件使用3.1 快速查询(boundary边界)3.2 快速查询(railway铁路)3.3 快速查询(boundaryadmin_level行政边界)3.4 快速查询࿰…...

推荐一款强大的书签管理工具,让你的网址不在落灰
在信息爆炸的互联网时代,我们每天都会浏览大量的网页,收藏各种各样的网址。然而,随着时间的推移,这些杂乱无章的书签往往让我们感到头疼。别担心,今天我要向你推荐一款强大的书签管理工具,它将帮助你轻松整…...

Python 工具库每日推荐 【Matplotlib】
文章目录 引言Python数据可视化库的重要性今日推荐:Matplotlib工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:数据分析可视化案例分析高级特性自定义样式动画效果3D绘图性能优化技巧扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 T…...

在远程非桌面版Ubuntu中使用Qt5构建Hello World项目
在 Linux 下运行 Qt 应用程序,需要完成以下几个步骤,包括安装 Qt 工具、设置开发环境以及编译和运行项目。下面是详细的步骤: 1. 安装 Qt 1.1使用系统包管理器 sudo apt update 和 sudo apt install qt5-default qtcreator 命令用于更新 U…...

netty之基础aio,bio,nio
前言 在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共…...

在找工作吗?给你一个AI虚拟面试官助力你提前准备面试
大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 让AI点亮我们的生活,是Shelly对…...

@KafkaListener注解中containerFactory属性的作用
在使用Spring Kafka时,containerFactory 属性是 KafkaListener 注解中的一个选项,它允许你指定一个 ContainerFactory Bean 的名称。这个 ContainerFactory 负责创建和管理 Kafka 消息监听容器。 以下是 containerFactory 属性的一些关键作用࿱…...

1006C简单题(计数式子的组合意义 + dp式子联立)
http://cplusoj.com/d/senior/p/SS241006C 对于这个式子,我们可以从它的组合意义入手。 假设我们有 n 1 n1 n1 个白球要染色,中间有一个绿球,绿球左边有 a a a 个红球,右边有 b b b 球。染完后绿球左边每个白球有 x x x 的贡…...

千益畅行,旅游创业新模式的创新与发展
旅游创业的时代背景与旅游卡的崛起,在当今快节奏的时代,旅行成为人们生活中的重要部分,随着科技发展和市场需求的变化,旅游创业项目中的旅游卡应运而生。 其中,“千益畅行” 旅游卡作为新兴力量,在共享经济…...

单调栈day54|42. 接雨水(高频面试题)、84. 柱状图中最大的矩形、两道题思维导图的汇总与对比
单调栈day54|42. 接雨水(高频面试题)、84. 柱状图中最大的矩形、两道题思维导图的汇总与对比 42. 接雨水84. 柱状图中最大的矩形两道题思维导图的汇总与对比 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱…...

关于Excel将列号由字母改为数字
将Excel的列表由字母改为数字 步骤: 文件-选项-公式-勾选“使用公式”中的“R1C1引用样式(R)”-确定即可 部分步骤图示 设置前的样子 设置后的样子 虽然现在还不清楚在xlwings操作Excel时有什么作用,先留着吧。...

曾黎第二次受邀巴黎时装周看秀 为新疆棉代言引人瞩目
近日,演员曾黎受邀出席巴黎时装周Stella McCartney 2025春夏大秀,她身穿品牌25早春“超季”新装登场,干练的摩登蓝色西服,自信优雅,温婉大气,手提链条黑包上面绑着的一朵新疆棉花十分抢眼,成为全…...

No.6 笔记 | Linux操作系统基础:全面概览与核心要点
1. 简介与历史 1.1 起源 创始人:Linus Torvalds(芬兰赫尔辛基大学学生)初衷:设计一个替代Minix的全功能Unix操作系统首次发布:1991年10月5日,Linux v0.01版本 2. Linux特点 多用户多任务:用…...

MySQL之分库分表后带来的“副作用”你是怎么解决的?
目录标题 一、垂直分表后带来的隐患二、水平分表后带来的问题1.多表联查问题2.增删改数据问题3.聚合操作问题 三、垂直分库后产生的问题1.跨库join问题2.分布式事务问题3.部分业务库依然存在的性能问题 四、水平分库后需要解决的问题1.聚合操作和连表问题2.数据分页问题3.ID主键…...

【Python】Python-JOSE:Python 中的 JSON Web Token 处理库
Python-JOSE 是一个用于处理 JSON Web Token (JWT) 和 JOSE (JSON Object Signing and Encryption) 标准的 Python 库。它支持对 JWT 进行签名、加密、解密和验证等操作,是处理基于 OAuth 2.0 和 OpenID Connect 协议的身份验证和授权任务的理想选择。Python-JOSE 实…...

SpringBoot3+Druid YAML配置
背景 Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。现在已经SpringBoot3,Druid的配置也需要随…...

【c语言——指针详解(3)】
文章目录 一、字符指针变量二、数组指针变量1、 数组指针变量是什么?2、 数组指针变量怎么初始化 三、⼆维数组传参的本质四、函数指针变量1、函数指针变量的创建2、函数指针变量的使⽤3、两段有趣的代码1)typedef 关键字2)typedef和define的…...

QT系统学习篇(2)- Qt跨平台GUI原理机制
一、Qt工程管理 1、新建项目: 我们程序员新建项目对话框所有5类项目模板 Application: Qt的应用程序,包含Qt Quick和普通窗口程序。 Library: 它可以创建动态库、静态库、Qt Creator自身插件、Qt Quick扩展插件。 其他项目: 创建单元测试项目、子目录项…...

运用MinIO技术服务器实现文件上传——在Linux系统上安装和启动(一)
# MinIO 单机版环境搭建详解 ## 1. 简介 随着大数据时代的到来,数据存储的需求日益增大,如何有效地存储和管理大规模的非结构化数据成为许多企业和开发者面临的挑战。MinIO 作为一个高性能、分布式对象存储系统,致力于为用户提供简单、快速…...

Python技术深度探索:从基础到进阶的实践之旅(第一篇)
Python技术深度探索:从基础到进阶的实践之旅(第一篇) 在编程的世界里,Python以其简洁的语法、强大的库支持和广泛的应用领域,成为了无数开发者心中的“瑞士军刀”。无论是数据分析、机器学习、Web开发,还是…...

利士策分享,旅游是否要舟车劳顿才能尽兴?
利士策分享,旅游是否要舟车劳顿才能尽兴? 国庆假期,当夜幕降临,城市灯火阑珊,一场关于美食与等待的较量悄然上演。 李女士在北京天坛公园附近餐厅的等位经历——前方1053桌的壮观景象,不仅让人咋舌…...

C++入门——类的默认成员函数(取地址运算符重载)
文章目录 一、const成员函数二、取地址运算符重载总结 一、const成员函数 1.将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后⾯。2.const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进…...

学习记录:js算法(四十九):二叉树的层序遍历
文章目录 二叉树的层序遍历网上思路队列循环 总结 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的层序遍历 。 (即逐层地,从左到右访问所有节点)。 图一: 示例 1:如图一 输入:roo…...

【PCB工艺】表面贴装技术中常见错误
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 1、什么是SMT和SMD2、表面贴装技术的优势是什么?3、通孔和表面贴装技术之间的区别是什么?4、焊…...

3.使用条件语句编写存储过程(3/10)
引言 在现代数据库管理系统中,存储过程扮演着至关重要的角色。它们是一组为了执行特定任务而编写的SQL语句,这些语句被保存在数据库中,可以被重复调用。存储过程不仅可以提高数据库操作的效率,还可以增强数据的安全性和一致性。此…...

Effective C++中文版学习记录(三)
Effective C中文版学习记录(三) 章节三:资源管理 进度:17/55 文章目录 Effective C中文版学习记录(三)条款13、以对象管理资源条款14、在资源管理类中小心copying行为条款15、在资源管理类中提供对原始资…...

VBA学习(76):文件合并神器/代码
1.定义变量 Dim savePath As String Dim SaveFile As String Dim dataFolder As String Dim FileSystem As Object Dim folder As Object Dim FileExtn As String Dim t As Integer Dim blnCkb As Boolean 2.自定保存文件名、选择待合并文件所在文件夹 Private Sub CkbName_…...