当前位置: 首页 > news >正文

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语句违例报告和多进程

多进程的参与可能使得违例报告会出现多次。举例:

假设:

  1. 在time step1,c=1,d=1,e=1,f=1,那么b1/b2两个进程都会报violation;
  2. 在time step2,c=1,d=0,e=1,f=1,只有b2进程会报violation;
  3. 在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语句的不同:

  1. case语句是将条件与所有case分支条件进行比较,而if语句是只比较当前这一个分支,因此if语句更通用;
  2. 当条件中有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 快速查询&#xff0…...

推荐一款强大的书签管理工具,让你的网址不在落灰

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

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 属性的一些关键作用&#xff1…...

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的…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

SpringCloudGateway 自定义局部过滤器

场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

c# 局部函数 定义、功能与示例

C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...