我的 System Verilog 学习记录(5)
、
引言
本文简单介绍 System Verilog 语言的 控制流。
前文链接:
我的 System Verilog 学习记录(1)
我的 System Verilog 学习记录(2)
我的 System Verilog 学习记录(3)
我的 System Verilog 学习记录(4)
循环
简介
啥是循环 ?
循环是一段一遍又一遍地执行的代码。条件语句通常包含在循环中,以便在条件为真时终止。如果循环永远运行,则仿真将无限期挂起。
SV中有如下几种循环结构:

foreach
这是一个无限循环,就像 while(1) 一样。请注意,除非在 forever 块中包含时间延迟以提前仿真时间,否则仿真将挂起。

repeat
用于将一个块中的语句重复一定次数。下面显示的示例将显示消息5次,并继续执行代码的其余部分。

while
如果您知道verilog/C,您已经知道这一点。只要条件为真,它就会重复这个块。Counter最初是零,然后递增,直到它达到10。

for

do while

foreach
这最适合遍历数组变量,因为您不必找到数组大小,将变量设置为从0开始到数组大小-1,然后在每次迭代时递增。

while / do - while
while 循环首先检查条件是否为真,然后执行true语句。如果条件是假的,这个循环就在那里结束。
一个 do while 循环首先执行一次语句,然后检查该条件是否为真。如果条件为true,则执行语句集,直到条件变为false。如果条件为false,则循环就在那里结束。
因此,这两者之间的区别是,一个 do while 循环至少执行一次语句集。
语法

示例
while


int 变量如果定义但是没有初始化,默认给0;
用 Questa Sim 验证:
do while


foreach
SystemVerilog 数组是允许在单个变量中存储许多值的数据结构。foreach 循环仅用于迭代这样的数组,这是最简单和最方便的方法。
语法

示例:一维数组

foreach 等价于 for 的如下代码:

示例:多维数组

for
语法
对于循环,使用三步方法来控制其语句的执行:
1.初始化影响循环运行次数的变量
2.在执行该循环之前,请检查该条件是否为真
3.修改器在每次迭代结束时执行,并跳转到步骤2。

示例:数组迭代

示例:多个初始化

示例:增加多个修改项

forever
语法

forever 语句块内必须要有对应的延时信息。
SV中,always 块不能放在类中以及其他SV程序块内。我们可以用 forever 循环达到相同目的。
下面显示的伪代码模拟了Testbench中监视器的功能1,一旦启动,只要它的监视器上有活动,就允许其运行。

repeat
语法

示例


break,continue
break

continue

if-else-if
SV引入如下几种 if - else 结构:
- unique-if
- unique0-if
- priority-if
unique-if,unique0-if
unique-if 以任意顺序评估判断条件:
- 除非有明确的else分支语句,否则匹配不到if条件的内容是会报告一个error;
- 在if-else条件中匹配到都于一个的分支语句也会报告一个error;
注意,unique0-if 在匹配不到任何条件时不会报告error。
示例:无else分支的unique-if

示例:unique-if中存在多条件匹配

priority-if
priority-if完全按照顺序评估判断条件。当出现以下情况时,会报告一个违例:
- 没有一个判断条件为真
- 缺少else分支,且前面几个判断条件均不满足
示例:priority-if 缺少 else分支

示例:priority-if匹配第一个条件后退出

case
unique-case,unique0-case
所有case语句都可以通过 unique 或 unique0 关键字进行限定来执行违例检查,就像我们在 if-else-if 构造中看到的那样。
unique 和 unique0 确保没有重叠的大小写项,因此可以并行计算。如果存在重叠的案例项,则会报告违规行为。
- 如果多于1个case语句可以和已知表达式匹配,会报告一个违例并且执行第一个匹配的case分支;
- 如果所有的case语句都不匹配,仅在 unique 关键词下报告一个违例,unique0 则不会报告违例;
示例:unique 无一匹配

示例:unique 多个匹配

priority-case

阻塞 & 非阻塞语句
此处和 Verilog 的相同,给几个示例:

阻塞语句的赋值的立刻的。仿真结果:

加入延迟:

非阻塞赋值示例:

仿真结果:

执行过程:

加入延迟:

执行过程:

非阻塞右侧表达式在一开始便执行计算,但是赋值过程发生在下一时间刻度。
事件
事件是在两个或多个并发活动的进程之间进行同步的静态对象句柄。一个进程将触发该事件,另一个进程等待该事件。
- 可以和其他事件变量比较或者指定为其他事件变量
- 可以传递给队列、函数和任务
- - 可以指定为 null
- - 将两个变量赋给另一个事件时,这两个变量指向相同的同步对象

如何触发/等待事件 ?
- 可以使用 ->;或 ->> 运算符触发已命名事件;
- 可以用 @ 或者 .triggered 让进程等待事件;
示例

@ 和 .triggered 有啥区别 ?
事件的触发状态在整个时间步长中持续存在,一直到仿真进一步执行。因此,如果等待事件和事件的触发同时发生,则会出现竞争条件,而 triggered 的属性有助于避免这种情况。
等待已触发状态的进程始终解除阻塞,而不管等待和触发的顺序如何。
示例

仿真结果:

请注意,由于 @ 和 -> 操作符之间的竞争条件,Thread2从未收到触发。
等待顺序
等待按给定顺序触发事件,如果有任何事件无序执行,则会发出错误。
示例:

合并事件
将一个事件变量分配给另一个事件变量时,等待触发第一个事件的所有进程都将等待第二个变量被触发。

函数
SV中的函数和Verilog 中的具有相同特性。
函数的主要目的就是可以在表达式计算上调用,且不耗费仿真时间。
- 函数不能有时间控制语句,比如 @ ,#,fork join ,wait
- 函数不能调用任务,因为任务可以有时间控制语句
示例:ANSI-C 风格的声明

示例:使用声明和IO口

如何通过值传递参数 ?
按值传递是将参数传递给子例程的默认机制。每个参数都被复制到子例程区域,对子例程区域中的该局部变量所做的任何更改在子例程外部不可见。

仿真log:

如何通过参考传递参数
通过引用传递的参数不会复制到子例程区域,而是将对原始参数的引用传递给子例程。参数声明前面带有ref关键字。对子例程内的变量所做的任何更改都将反映在子例程外部的原始变量中。

对具有静态(static)生存期的子例程使用按引用传递参数是非法的。
任务
函数用于对输入进行一些处理并返回单个值,而任务更为通用,它可以计算多个结果值并使用output 和 inout 类型的参数返回计算结果。任务可以包含时间控制语句,如@posedge等。
语法

静态任务
如果任务是静态的,则其所有成员变量将在已启动以并发运行的同一任务的不同调用之间共享。

启用任务的参数(x,y,z)与任务定义的参数(a,b,c)相对应。因为a和b是输入,所以x和y的值将分别放在a和b中。因为c被声明为输出,并且在调用期间与z连接,所以和将自动从c传递给变量z。
自动任务
关键字 aotumatic 将使任务重入,否则默认情况下它将是静态的。自动任务中的所有项都是为每个调用动态分配的,而不是在并发运行的同一任务的调用之间共享。请注意,层次结构引用不能访问自动任务项。
为了便于说明,考虑从并发运行的不同初始块中调用的静态任务显示。在这种情况下,任务中声明的整数变量在任务的所有调用中共享,因此每个调用显示的值应该增加。
示例:

自动任务:

全局任务
在所有模块外部声明的任务称为全局任务,因为它们具有全局作用域,并且可以在任何模块内调用。

如果任务是在模块 des 中声明的,则必须引用模块实例名称来调用它。

函数和任务的区别

当函数尝试调用任务或包含耗时的语句时,编译器会报告错误。

任务禁止
可以用 disable 关键字禁止任务执行。

相关文章:
我的 System Verilog 学习记录(5)
、 引言 本文简单介绍 System Verilog 语言的 控制流。 前文链接: 我的 System Verilog 学习记录(1) 我的 System Verilog 学习记录(2) 我的 System Verilog 学习记录(3) 我的 System Ver…...
多芯片设计 Designing For Multiple Die
Why a system-level approach is essential, and why its so challenging作者:Ann MutschlerAnn Mutschler is executive editor at Semiconductor Engineering.将多个裸片或芯粒集成到一个封装中,与将它们放在同一硅片上有着很大的区别。在同一硅片上&a…...
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(10)
目录 竞赛内容 模块A 基础设施设置与安全加固 一、项目和任务描述: 二、服务器环境说明 三、具体任务(每个任务得分以电子答题卡为准) A-1任务一 登录安全加固(Windows, Linux) 1.密码策略(Windows, …...
数据结构-简介
目录 1、简介 2、作用 3、分类 4、实现分类 1、简介 数据结构指的是组织和存储数据的方法。它涉及到一系列的算法和原则,用来设计和实现不同种类的数据类型,如数组、链表、树、图等等。数据结构的目的是在计算机程序中有效地管理和操作数据ÿ…...
python装饰器及其用法
python装饰器是什么? Python装饰器是一种语法结构,它可以让开发者在不修改原函数的基础上,在函数的前后运行额外的代码,这些代码可以达到修改函数行为的目的。Python装饰器的实质是一个可调用的对象,它可以接收函数作为参数…...
Appium自动化测试之启动时跳过初始化设置
Appium每次启动时都会检查和安装Appium Settings,这是完全没有必要的,在首次使用Appium连接设备是Appium Settings便已经安装好。怎样跳过安装Appium Settings呢?之前的做法是修改appium中的源文件中的android-helpers.js实现,如M…...
JavaScript DOM【快速掌握知识点】
目录 DOM简介 获取元素 修改元素 添加和移除元素 事件处理 DOM简介 JavaScript DOM 是指 JavaScript 中的文档对象模型(Document Object Model);它允许 JavaScript 与 HTML 页面交互,使开发者可以通过编程方式动态地修改网页…...
不需要高深技术,只需要Python:创建一个可定制的HTTP服务器!
目录 1、编写服务端代码,命名为httpserver.py文件。 2、编写网页htmlcss文件,命名为index.html和style.css文件。 3、复制htmlcss到服务端py文件同一文件夹下。 4、运行服务端程序。 5、浏览器中输入localhost:8080显示如下: 要编写一个简单的能发布…...
渗透测试常用浏览器插件汇总
1、shodan这个插件可以自动探测当前网站所属的国家、城市,解析IP地址以及开放的服务和端口,包括但不限于FTP、DNS、SSH或者其他服务等,属被动信息搜集中的一种。2、hackbar(收费之后用Max Hackerbar代替)这个插件可用于…...
社区1月月报|OceanBase 4.1 即将发版,哪些功能将会更新?
我们每个月都会和大家展开一次社区进展的汇报沟通会,希望通过更多的互动交流让OceanBase 开源社区更加透明,实现信息共享,也希望能营造更加轻松的氛围,为大家答疑解惑,让大家畅所欲言。如果您对我们的社区有任何建议&a…...
Javascript的API基本内容(二)
一、事件监听 结合 DOM 使用事件时,需要为 DOM 对象添加事件监听,等待事件发生(触发)时,便立即调用一个函数。 addEventListener 是 DOM 对象专门用来添加事件监听的方法,它的两个参数分别为【事件类型】和…...
ChatGPT热度“狂飙”,OceanBase也去找它唠了唠
最近互联网的关键字 非 ChatGPT 莫属 就是这个小东西 集唠嗑、提问、答疑、科普、写作于一体 让我看看哪个孤独的打工人 还没和 ChatGPT 聊上一聊 有人说 ChatGPT 这么智能 或将取代人类的工作 OceanBase 的小编表示不服气 于是,抱着好奇之心试了一试 对 …...
HTTP协议基础知识点扫盲;HTTPS协议及密码学基础
目录 一、Http协议的特性 二、http协议的请求 1.请求行第一行,包含三个信息:请求方式,url,http协议版本 2.请求头浏览器向服务器发送一些状态数据,标识数据等等 3.请求主体请求代理端项服务器端,发送的…...
【golang/go语言】Go语言之反射
本文参考了李文周的博客——Go语言基础之反射。 一、反射初识 1. 什么是反射 在计算机科学中,反射是指计算机程序在运行时(run time)可以访问、检测和修改它本身状态和行为的一种能力。用比喻来说,反射就是程序在运行的时候能够…...
Java+Swing+Mysql实现超市管理系统
一、系统介绍1.开发环境操作系统:Win10开发工具 :IDEA2018JDK版本:jdk1.8数据库:Mysql8.02.技术选型JavaSwingMysql3.功能模块4.系统功能1.系统登录登出管理员可以登录、退出系统2.商品信息管理管理员可以对商品信息进行查询、添加…...
华为OD机试题,用 Java 解【机器人走迷宫】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...
软件测试基本概念
软件测试基本概念 1. 什么是软件测试 软件测试就是验证软件产品特性(功能, 界面, 兼容性, 性能…)是否符合用户的需求,同时软件测试不仅要测试系统是否做了其应该做的, 还需要测试系统是否未作其不应该做的。 2. 调试与测试 软件测试与调试的区别: …...
数学建模介绍
🚀write in front🚀 📜所属专栏: 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励…...
【LVGL】学习笔记--(2)GUI Guider的使用
基于上一篇【LVGL】学习笔记--(1)Keil中嵌入式系统移植LVGL,已经成功地移植了LVGL到我们的嵌入式板子上,并配合磁控旋钮编码器(或者诸如触摸屏、按键、键盘等其他输入设备均可),实现了简单界面的显示工作。这一章将学习…...
OpenCV-PyQT项目实战(6)项目案例02:滚动条应用
欢迎关注『OpenCV-PyQT项目实战 Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战(3)信号与槽机制 …...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

