SystemVerilog scheduler
文章目录
- 简介
- 调度器
- simulation region
- Preponed region
- Active region
- Inactive region
- NBA(Non-blocking Assignment Events region)
- Observed region
- Reactive region
- Re-Inactive Events region
- Re-NBA Region
- Postponed Region
- PLI region:
- Pre-active region
- Pre-NBA region
- Post-NBA region
- Post-observed region
- 参考
简介
verilog 作为一种 HDL (Hardware Description Language) 用来描述电子硬件的结构,SystemVerilog 是在 verilog 基础上扩展而来的,它不仅可以用来描述电子硬件,新增的扩展主要用于 verification,称为 HVL(Hardware Verification Language)。 我们知道硬件和普通程序的最大的区别:硬件是完全并行的,而程序本质上是串行的,所以 Verilog 和 SystemVerilog 仿真本质上是用串行的程序来描述硬件的并行行为。
调度器
为了解决串行模拟并行的问题,SystemVerilog 引入了 event 调度以及根据时间片划分成多个 region 的方式调度,下面主要就是看这两个概念怎么解决并行问题的。
SV 的事件是离散的模型。在设计中所有语言都有左值和右值两个元素,每次右值的变化都会引起左值的变化,每次左值和右值的变化都被视为更新事件,所有对这些事件敏感的表达式都会被考虑进行评估,称为评估事件。
表达式的通常包括:initial, always, always_comb, always_latch, and always_ff procedural blocks
, continuous assignments(assign)
, procedural assignment statements
.
verilog 中主要就是有两种赋值方法,Continuous assignment(连续赋值)适用于 net 类型,Procedural assignment(过程赋值)使用于variable 类型;其中过程赋值中有两种,阻塞赋值和非阻塞赋值。另外主要的就是 task 和 function,里面也是用这两种赋值。
systemverilog 中新增了 program, assertion,clocking 会影响调度器,其他的 package,class,interface,constraint 等并不会影响调度器,暂且不提。
// procedural blockinitial, always, always_comb, always_latch, always_ff, final, task, function// block 里面可以使用 block 和 non-blocking 赋值[ delay ] register_name = [ delay ] expression; // blocking[ delay ] register_name <= [ delay ] expression; // non-blocking//还可以使用if、case跳转, forever、 repeat、for等循环
// continuous assignmentswire out; wire in1, in2;assign out = in1 & in2;
对于事件的定义在原来延时和始终变化上新增了event
- 延时 ,例如
#1 a = b
- 等待时钟变化,例如
@(posedge clk)
- event,例如
@(b); wait(b.triggered) #10 -> a;
Note:
- 术语“仿真时间”用于指仿真器维护的时间值,用于对被仿真的系统描述所需的实际时间进行建模。
- 时间片包括每个仿真时间在事件区域中处理的所有仿真活动 SystemVerilog 事件区域 开发新的 SystemVerilog 事件区域是为了支持新的 SystemVerilog 构造,并防止在 RTL 设计和新验证构造之间创建竞争条件 。
SystemVerilog 时间片划分为 17 个有序区域:
a) Preponed
b) Pre-Active
c) Active
d) Inactive
e) Pre-NBA
f) NBA
g) Post-NBA
h) Pre-Observed
i) Observed
j) Post-Observed
k) Reactive
l) Re-Inactive
m) Pre-Re-NBA
n) Re-NBA
o) Post-Re-NBA
p) Pre-Postponed
q) Postponed
兼容 SystemVerilog 的模拟器应维护某种形式的数据结构,允许事件随着模拟器时间的推移动态地调度、执行和删除。 数据结构通常作为一组按时间排序的链表来实现,这些链表以明确定义的方式进行划分和细分。第一个划分是按时间划分。 每个事件都有且仅有一个模拟执行时间,在任意时刻执行时间可以是当前时间或未来的某个时间。 所有需要被调度的事件都会创建一个time slot,开始执行这17个region的event。 通过执行和删除当前模拟中的所有事件,当所有时间都被调度完之后移动到下一个 time slot 中。 程序通过类似的方式保证了模拟器永远不会出现模拟时间倒退的现象。
这些 region 可以从不同的角度进行划分:
-
根据 active 它把 region 分成了两组 region :active group, reactive group。其中 active region 包括 Active, Inactive, Pre-NBA, NBA, and Post-NBA 。reactive region 包括 Reactive, Re-Inactive, Pre- Re-NBA, Re-NBA, and Post-Re-NBA。
-
根据是否在 simulation 中执行划分成 simulation region:
Preponed, Active, Inactive, NBA, Observed, Reactive, ReInactive, Re-NBA and Postponed
和 PLI region:Preponed, Pre-Active, Pre-NBA, Post-NBA, Pre-Observed, Post-Observed, Pre-Re-NBA, Post-Re-NBA, Pre-Postponed
.
下面我们先只看 simulation region 的各个 region 需要完成的工作。
simulation region
Preponed region
主要用于验证环境下,在 assertion 中如果 clocking skew 中指定了输入 #1step
在该 region中进行采样。采样的结果和在上一个 time slot 中 postponed region 中采样的结果应该是相同的。 该 region 的 event 在每个 time slot 中仅执行一次,采样之后正式遍历 time slot 的各个region 调度 event。
Active region
包含了当前 active group 中所有需要评估的事件,事件被处理的顺序不提供任何保证,可以按任何顺序进行调度。
事件包括:
1. 所有的阻塞赋值
2. 非阻塞赋值表达式中右值的评估,它会在NBA中更新左值.
3. 所有的连续赋值.
4. 评估 verilog 的自定义源语UDP的输入和输出(一般用的很少).
5. Execute the $display and $finish commands.
Inactive region
保存所有active region 事件处理完毕后要评估的事件。
如果在 active region 中 执行 #0 a = 1
,其中显示的使用 #0
延时的 blocking 赋值操作,在 active region 处理时会将该表达式的处理暂时挂起,然后在 inactive 中调度,之后再次从 inactive 到 active 跳转时再次调度处理该表达式。
这种方式在 RTL 中不推荐使用。
NBA(Non-blocking Assignment Events region)
NBA 中处理所有非阻塞赋值的更新事件,其中 Active region 中处理右值的更新,NBA 更新左值。
Observed region
concurrent assertion 的语句事件评估在该 region 中处理,另外 clocking 中 input skew #0
的输入也在这个 region 中进行采样。
Reactive region
它保存了在 reactive group 所有需要被评估的事件,和 active region 中一样并不对事件被处理的顺序做任何保证,可以按任何顺序进行调度。
1. concurrent assertion 的 action 块
2. 在 program block 中的 blocking 赋值
3. 评估所有 program 中 non-blocking赋值的右值,之后会在 Re-NBA region 更新左值
4. program block 中所有的连续赋值
5. 执行了 $exit 或者隐式的 $exit 命令
Re-Inactive Events region
这个 region 类似于 inactive region, 如果在 reactive region 中有使用 #0
赋值,这个表达式在 reactive region 中会被挂起并且在当前time slot 的 re-inactive region 中调度处理,所以这个表达式会在下一次进入 reactive region 中被处理。
Re-NBA Region
和 NBA region 类似,处理 program block 中 non-blocking 赋值的更新。另外 clock 中 output skew #0
的也会在该 region 中更新。
Postponed Region
该区域的主要功能是执行 $strobe 和 $monitor 命令,这些命令将显示当前 time slot 的最终更新值。 该区域还用于收集使用选通采样的项目的功能覆盖范围。
PLI region:
Pre-active region
预活动区域专门用于 PLI 回调控制点,允许用户代码在评估活动区域中的事件之前读取和写入值并创建事件
Pre-NBA region
Pre-NBA 区域专门用于 PLI 回调控制点,允许用户代码在评估 NBA 区域中的事件之前读取和写入值并创建事件
Post-NBA region
Post-NBA 区域专门用于 PLI 回调控制点,允许用户代码在评估 NBA 区域中的事件后读取和写入值并创建事件
Post-observed region
Post-observed 区域专门用于 PLI 回调控制点,允许用户代码在评估属性后读取值(在 Observed 或更早的区域中)。
参考
SystemVerilog 2012 specification Manual, Chapter 4 Schduling semantics
相关文章:

SystemVerilog scheduler
文章目录 简介调度器simulation regionPreponed regionActive regionInactive regionNBA(Non-blocking Assignment Events region)Observed regionReactive regionRe-Inactive Events regionRe-NBA RegionPostponed Region PLI region:Pre-active regionPre-NBA regionPost-NBA…...

Qt 5. QSerialPort串口收发
1. 代码 //ex2.cpp #include "ex2.h" #include "ui_ex2.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>int static cnt 0;Ex2::Ex2(QWidget *parent): QDialog(parent), ui(new Ui::Ex2) {ui->setupUi…...
什么是Java中的JVMTI(JVM Tool Interface)?
Java中的JNI(Java Native Interface)和JVMTI(JVM Tool Interface)都是与Java运行时环境(JVM)交互的工具,但它们有不同的目的和使用场景。下面我从新手的角度来幽默地解释一下它们的区别和用途。…...

WAF独木难支 RASP与ADR将成应用安全防护2.0时代新宠
曾几何时,黑客攻击大多通过网络层进行,但随着基于网络层的基础安全防护措施趋于严密,防火墙、入侵防御、防病毒等安全软硬件构建起了相对完善的防护体系,想再从网络层钻空子的难度增大。如今,黑客攻击从网络层转入Web为…...

四、Unity中颜色空间
Unity中的设置 通过点击菜单Edit->Project Settings->Player页签->Other Settings下的Rendering部分进行修改,参数Color Space可以选择Gamma或Linear。 当选择Gamma Space时,Unity不会做任何处理。当选择Linear Space时,引擎的渲染…...
Java程序员面试题
Java程序员面试题目 1.Java基础1.1 Java有list,list有很多种,你平时开发喜欢用哪个list?(容易)1.2 Java的map,你知道有哪几种map,你平时喜欢用哪个?(容易) 2.…...

【自动化剧本】Role角色
目录 一、Roles模块1.1roles的目录结构1.2roles 内各目录含义解释1.3在一个 playbook 中使用 roles 的步骤 二、使用Role编写LNMP剧本2.1 搭建Nginx角色2.2搭建Mysql角色2.3搭建php角色2.4lnmp剧本 一、Roles模块 roles用于层次性、结构化地组织playbook。roles能够根据层次型结…...

安全文件传输:如何避免数据泄露和黑客攻击
网络安全问题日益严重,导致许多数据被泄露和黑客袭击的事件频发。为了保证文件传输的安全,需要实施一系列安全文件传输策略来防止数据被泄露和黑客袭击。 第一、选择适合的加密方法是非常关键的 加密是一种将明文转换成密文的过程,这样只有授…...
web基础与http
一,dns与域名 网络基于tcp/ip协议进行通信和连接的,其中主机以ip地址做固定的地址标识,用以区分用户和计算机。ip地址是由32位二进制数组成,不方便记忆。为了方便记忆,采用了域名。但是网络通信的唯一标识是ip地址&…...

寒假作业(蓝桥杯2016年省赛C++A组第6题 )
题目: 注:蓝桥杯2016年省赛CA组第6题 请填写表示方案数目的整数。 题解: 由题可知这是一道全排列问题,因此我们可以使用c的next_permutation函数对于1-13的数字进行全排列即可,并每次排列判断是否满足题意。 注意…...
NUMA架构在kubernetes中的应用
numactl使用 numactl 通过将 CPU 划分多个 node 减少 CPU 对总线资源的竞争,一般使用在高配置服务器部署多个 CPU 消耗性服务使用。 numactl使用,numa常用命令,numa命令行使用 #numactl -H available: 2 nodes (0-1) node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 node 0…...

Gogs Git windos服务搭建指南
Gogs Git服务器搭建指南 背景: 近期在Linux 麒麟 v10 系统上开发;为了团队协同编程;选用了Git服务器;之前在windos开始时候使用的visualSVN server; visualSVN server从4.x.x.x开始收费;限制15个开发者用户ÿ…...
leetcode 983. 最低票价
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有 三种不同的销售方式 : 一张 为期一天 的通行证售价为 costs[0] …...
七种遍历Map的方法
七种遍历Map的方法 import java.util.HashMap; import java.util.Iterator; import java.util.Map;public class Wan {public static void main(String[] args) {Map<String,String> dataMap new HashMap<>();dataMap.put("A","Abb");dataMap…...

Android性能优化—内存优化
一、App内存组成以及管理 Android 给每个 App 分配一个 VM ,让App运行在 dalvik 上,这样即使 App 崩溃也不会影响到系统。系统给 VM 分配了一定的内存大小, App 可以申请使用的内存大小不能超过此硬性逻辑限制,就算物理内存富余&…...

Python自动计算Excel数据指定范围内的区间最大值
本文介绍基于Python语言,基于Excel表格文件内某一列的数据,计算这一列数据在每一个指定数量的行的范围内(例如每一个4行的范围内)的区间最大值的方法。 已知我们现有一个.csv格式的Excel表格文件,其中有一列数据&#…...

FTP文件传输协议
FTP文件传输协议 介绍 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中,是一项基本的网络应用,即文件传送文件传输协议(File Transfer Protocol)是因特网上使用得最广泛的文件传输协议 FTP提供交互式访问,允许客户指明文件…...

运维高级--tomcat和jpress
1. 简述静态网页和动态网页的区别。 静态网页:事先创建好的网页,通常通过HTML、CSS和JavaScript等静态文件组成,不需要和服务器进行交互,加载速度快 动态网页:根据用户需求动态生成网页,动态网页通常使用…...

【LeetCode】141. 环形链表 进阶题142. 环形链表 II
141. 环形链表 这道题还是用经典的快慢指针法来做。每次让快的指针走两步,慢的走一步。如果有环,则绝对会在环内的某一节点相遇。思想跟物理知识有点关系,如果有环,则在相对运动过程中,可以相当于慢指针静止࿰…...

MySQL索引1——基本概念与索引结构(B树、R树、Hash等)
目录 索引(INDEX)基本概念 索引结构分类 BTree树索引结构 Hash索引结构 Full-Text索引 R-Tree索引 索引(INDEX)基本概念 什么是索引 索引是帮助MySQL高效获取数据的有序数据结构 为数据库表中的某些列创建索引,就是对数据库表中某些列的值通过不同的数据结…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...