sv标准研读第十二章-过程性编程语句

news2024/11/24 6:54:01

书接上回:

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语句只能用在子例程中。

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

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

相关文章

使用链地址法实现哈希表(哈希函数为除留余数法)

该代码实现了一个哈希表,使用拉链法(链地址法)来解决哈希冲突,核心思想是通过链表存储哈希冲突的数据。哈希表的大小被设置为 MAX_SIZE,其中哈希函数采用除留余数法。以下是代码的详细解释和总结: #includ…

C++关于链表基础知识

单链表 // 结点的定义 template <class T> struct Node { T data ; Node <T> *next; //指向下一个node 的类型与本node相同 } // 最后一个node指针指向Null 生成结点&#xff1a; Node <T> * p new Node < T>; 为结点赋值: p-> data …

LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱

iText2KG是一个基于大型语言模型的增量知识图谱构建工具&#xff0c;通过从文本文档中提取实体和关系来逐步构建知识图谱。该工具具有零样本学习能力&#xff0c;能够在无需特定训练的情况下&#xff0c;在多个领域中进行知识提取。它包括文档提炼、实体提取和关系提取模块&…

BM1 反转链表

要求 代码 /*** struct ListNode {* int val;* struct ListNode *next;* };*/ /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** param head ListNode类* return ListNode类*/ struct ListNode* ReverseList(struct …

【LeetCode-热题100-128题】官方题解好像有误

最长连续序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-consecutive-sequence/?envTypestudy-plan-v2&envIdtop-100-liked 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的…

Linux高阶——0928—Github本地仓库与云端仓库关联

1、安装代理软件 steam 选择Github和系统代理模式&#xff0c;一键加速即可 2、 安装Git 3、访问Github网站&#xff0c;创建新用户 4、Github探索 &#xff08;1&#xff09;Explore探索标签 &#xff08;2&#xff09;工程结构 用户名/仓库名 自述文件&#xff0c;用markdo…

【Llamaindex RAG实践】

基础任务 (完成此任务即完成闯关) 任务要求&#xff1a;基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力&#xff0c;截…

每日OJ题_牛客_重排字符串_贪心_C++_Java

目录 牛客_重排字符串_贪心 题目解析 C代码 Java代码 牛客_重排字符串_贪心 重排字符串 (nowcoder.com) 描述&#xff1a; 小红拿到了一个只由小写字母组成的字符串。她准备把这个字符串重排&#xff08;只改变字母的顺序&#xff0c;不改变数量&#xff09; …

滑动窗口--(中篇)

将X减到0的最小操作数 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &#xff0c;返…

Tomcat 项目配置指南

在实际工作中&#xff0c;我们所维护的项目可能与我们平时做的项目不一样。其中一种情况就是需要自己配置Tomcat服务。 下面笔者为大家介绍Tomcat基础的配置以及可能遇到的问题。 文章目录 一、Tomcat 配置二、常见报错及解决方案参考 一、Tomcat 配置 1. 下载 Tomcat 从 Apa…

一款完全开源并免费的监测与分析系统,支持监测,预警,分析,报告,支持本地化部署(附源码)

前言 在当今这个信息爆炸的时代&#xff0c;企业和个人都需要时刻了解网络上的动态&#xff0c;以便及时了解自身品牌形象和社会舆论的变化。然而&#xff0c;现有的舆情监测工具往往价格昂贵&#xff0c;且cao作复杂&#xff0c;难以满足普通用户的需求。 在这种背景下&…

基于SSM实现的求职招聘系统 设计与实现

一、项目简介 求职招聘系统&#xff0c;基于SSM实现的求职招聘系统 二、技术实现 后台框架&#xff1a;Spring、SpringMVC、MyBatis UI界面&#xff1a;JSP、jQuery 、H-ui 数据库&#xff1a;MySQL 下载地址 基于SSM实现的求职招聘系统源码数据库资源-CSDN文库 三、系…

音频文件重采样 - python 实现

在处理音频文件的时候&#xff0c;经常会将原音频进行统一的重采样处理&#xff0c;设置为相同的采样率&#xff0c;本示例&#xff0c;就是将44100采样率的音频&#xff0c;重采样为16000. 安装对应的python 库&#xff1a;librosa 和 soundfile. pip install soundfile pip i…

Vue前端框架的基础配置

登录界面添加背景图 通过在登录界面的vue文件中&#xff0c;设置div标签的background-image属性&#xff0c;加载背景图 <style scoped> .myvue{width:100%;height: 750px; //添加背景图的地址background-image: url(../assets/oa.jpeg);background-size: cover;backgr…

Linux更改固定IP地址

1.VMware里更改虚拟网络 一: 二: 三:确定就好了 2.修改Linux系统的固定IP 一:进入此文件 效果如下: 执行以下命令: 此时IP已更改 3.远程连接 这个是前提!!! 更改网络编辑器后网络适配器可能会修改,我就是遇着这个,困住我了一会 一:可以以主机IP对应连接 连接成功 二:主机名连…

[OS] 2.Wait for signal (do_wait),task_struct

Wait for signal (do_wait) Linux 内核中 do_wait() 函数的实现&#xff0c;该函数是父进程等待子进程结束的系统调用的一部分。它通过在内核模式下等待信号&#xff0c;处理进程终止以及与父子进程相关的机制。让我们详细解读您提供的信息&#xff0c;涉及 do_wait() 的执行过…

微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化

微软推出了为每个人提供的“AI伴侣”Copilot&#xff0c;它不仅能够理解用户的需求&#xff0c;还能根据用户的日常习惯和偏好进行适应和进化。帮助处理各种任务和复杂的日常生活场景。 它能够根据用户的生活背景提供帮助和建议&#xff0c;保护用户的隐私和数据安全。Copilot…

Crypto虐狗记---”你“和小鱼(八)

前言&#xff1a;剧情八 提示&#xff1a; 下载&#xff1a; 只给了公钥 那么可以用RsaCtfTool去分离公钥---》 得到(e&#xff0c;n)&#xff1a; 如何安装参考&#xff1a; kail下安装RsaCtfTool - 九皋777 - 博客园 (cnblogs.com) 已知n&#xff0c;那么去得到p q 或者使…

智能制造领域的系统都有啥,MES、APS、PLC、SCADA等

提及制造业&#xff0c;大家都能想到工业4.0.那么与工业4.0紧密相连的B端系统都有哪些类型的&#xff0c;本文为大家详细解读下。 在智能制造领域&#xff0c;常见的系统包括MES&#xff08;制造执行系统&#xff09;、APS&#xff08;高级计划与排程系统&#xff09;、PLC&am…

Oracle 数据库安装和配置详解

Oracle 数据库安装和配置详解 Oracle 数据库是一款功能强大、广泛使用的企业级关系数据库管理系统 (RDBMS)&#xff0c;适用于处理大型数据库和复杂事务。本文将介绍如何在 Linux 和 Windows 环境下安装 Oracle 数据库&#xff0c;并对其进行基本配置&#xff0c;帮助开发者快…