详解SystemVerilog中time slot的调度

news2024/10/5 18:33:30

1. 前言

本文讲一下SystemVerilog的time slot里的regions以及events的调度。SystemVerilog语言是根据离散事件执行模型定义的,由events驱动。SystemVerilog描述是由连接的执行thread或processes组成。Process是可衡量的,也具有状态,并且可以响应输入的变化以产生输出。Process是并发调度的元素,例如initial,process其实还包括了always, always_comb, always_latch, always_ff, contiguous assignment, asynchronous tasks和procedural assignment statement。

SystemVerilog是一种并行编程语言,我们需要重点了解哪些执行顺序对用户是有保证的,哪些执行顺序是不确定的。这块内容比较晦涩难懂,但要是理解了regions和events的调度,对我们写代码和调试会有极大的帮助,而且也更了解EDA工具的执行机制。

2. Event的定义

在仿真系统中net或variable的状态的任何更改,都被视为更新事件(update event)。Processes对upate event是敏感的。当一个update event发生时,所有对该event敏感的processes都会被当作以任意顺序进行评估。Process的评估也是一个event,称作评估事件(evaluation event)。Evaluation events包括PLI callbacks,这些callbacks是执行模型中的节点,PLI应用程序可以从仿真内核调用。所以,这些events会在不同的regions中发生。

3. Region的定义

为了支持清晰和可预测的交互,将单个time slot划分为多个region,events就被以确定的执行顺序安排到这些regions中,这就允许DUT代码和验证代码之间可预测的交互。在特定时间的所有scheduled events定义了1个time slot。在移动到下一个time slot之前,仿真按照时间顺序进行并删除掉当前仿真时间slot中的所有events,从而使得仿真前进。这个过程保证了仿真器不会在时间上倒退。一个time slot可以被划分为一组有序的regions,有:Preponed,Pre-Active,Active,Inactive,Pre-NBA,NBA,Post-NBA,Pre-Observed,Observed,Post-Observed,Reactive,Re-Inactive,Pre-Re-NBA,Re-NBA,Post-Re-NBA,Pre-Postponed,Postponed。如图1。

图1  time slot执行流程图

其中Active, Inactive, Pre-NBA, NBA和Post-NBA regions中scheduled events称为active region set events。Reactive, Re-Inactive, Pre- Re-NBA, Re-NBA和Post-Re-NBA regions中scheduled events称为reactive region set events

Active, Inactive, Pre-NBA, NBA, Post-NBA, Pre-Observed, Observed, Post- Observed, Reactive, Re-Inactive, Pre-Re-NBA, Re-NBA, Post-Re-NBA和Pre-Postponed regions被称为iterative regions

除了active region set和reactive region set,每个time slot的event regions可以分为simulation regionsPLI regions。图1中,圆角长方形的属于simulation regions。椭圆形的属于PLI regions。

 

4. Events调度参考算法

当仿真开始时,先初始化所有nets和variables的初始值,并在0 time slot上开始调度初始化events。

当发现有非空的time slot时,也就是time slot里有scheduled event。它会去执行第一个非空的time slot,就开始按照图1的流程图顺序执行各个region。当进入1个region内时,找到当前region内的scheduled event,判断event类型,如果是update event类型,更新这个event对象,且为对该event对象敏感的任何process安排evaluation event;如果是evaluation event类型,评估与这event相关的process,并可能安排进一步执行的events。

Time slot里的这些region中,Prepone、Pre-Active和Postponed只会执行一次。其它的region,具体要看event的情况,可能会执行多次。不过总体遵循这个流程:1. 顺序处理Prepone和Pre-Active region。2. 处理从Active到Post-Observed的region,会从里面找到第一个有非空event的region处理,直至全部event处理完且删掉。需要注意的是,如果在NBA region的触发了一个需要在Active region处理的event,那么会从NBA跳回Active region去处理,然后按顺序继续寻找第一个有非空event的region。3. 当步骤2的regions全部处理好之后,会开始处理从Reactive到Post_Re-NBA region,也是类似的,会从里面找到第一个有非空event的region处理,直至全部处理完毕。4. 当步骤3的region也全部处理完之后,会再重新判断下从Active到Post Re-NBA region是否还有未处理的,如果有就又要从第一个非空event的region处理,如果没有就执行Pre-Postponed region。5. 当步骤2-4里的都没有非空event的region后,处理Postponed region。6. 步骤5处理完之后,就进入到下一个time slot了。

5. Regions调度的events类别

Time slot的simulation regions包含了Preponed, Active, Inactive, NBA, Observed, Reactive, Re-Inactive, Re-NBA和Postponed regions。再根据active region set和reactive region set的划分,我们可以将一个time slot的simulation regions分为五个主要region:Preponed、Active、Observed、Reactive和Postponed。Active和Reactive可以进一步细分为小的regions。如图2所示。

 图2  Simulation regions

这五大regions里调度的events有:

Prepone在一个time slot内,Prepone region只会执行一次,当仿真时间进入当前time slot时,它是第一个被执行的region。验证环境采样DUT的信号就发生在这个region。我们平时在采样DUT信号时,会指定#1step采样延迟,#1step采样延迟提供了在进入当前time slot之前立即采样信号的能力。#1step采样相当于在当前time slot的Prepone中采样信号。所以在Preponed region的采样相当于前一个time slot Postponed region的采样。Preponed region PLI events也在这里调度。

ActiveActive包含了几个小的regions:active,inactive和NBA(nonblocking assignment update) regions。

  • Active region进行当前active region set events的评估求值,并且这些events会被任意处理。RTL代码和行为代码(behavioral code)被安排在active region。所有blocking assignments语句在Active region执行。对于nonblocking assignments,RHS的评估求值发生在Active region,而赋值发生在NBA region。如果有任何#0延迟的assignment,那么这些assignment发生在Inactive region。(注意:#0延迟的RHS是在inactive region是算的)
  • Inactive region进行处理完所有active events后要评估的events。显式的#0延迟控制要求将这个event安排到当前time slot的inactive region进行,以便在下一个inactive到active迭代中恢复process。
  • NBA region进行处理完所有inactive events后要评估的events。Nonblocking assignment会在当前或以后仿真时间的NBA region中创建events。

Observed:Observed用于触发property expressions(用于concurrent assertions)时对其求值。在property求值后,pass/fail的信息将在当前time slot的Reactive region报告出来。

Reactive:Reactive包含了Re-active,Re-inactive和Re-NBA regions。

  • Re-active进行当前reactive region set的评估求值,并且可以以任何顺序进行处理。Program blocks的blocking assignments、#0 blocking assignments的RHS求值和nonblocking assignment的RHS求值发生在re-active region。另外,concurrent assertions的action blocks的代码也是在re-active region调度的。Re-active region和active region其实是对偶关系的。只不过active处理design,re-active处理program。
  • Re-inactive进行处理完所有re-active events后要评估的events。Program里显示的#0延迟控制要求将这个event安排到当前time slot的re-inactive region进行,以便在下一个inactive到active迭代中恢复process。同样的,它也是inactive region的对偶关系。
  • Re-NBA进行处理完所有re-inactive events后要评估的events。Program里nonblocking assignment会在当前或以后仿真时间的re-NBA region中创建events。

Postponed:postponed是当前time slot的最后1个region。$monitor, $strobe和其它相似的events会安排在这个region执行 (注意$display event是在active region和reactive region(如果在program里调用)执行的)。一旦到达postponed region,就不允许在当前time slot中发生新的值更改。在此region内,向任何net或variable进行写入值或在当前region调度任何先前region的event都是非法的。Postponed region PLI events也在这里调度。

在一个time slot里,除了上述介绍的simulation regions,还有PLI regions,在PLI regions里会去调度PLI callback。PLI regions有Preponed, Pre-Active, Pre-NBA, Post-NBA, Pre-Observed, Post-Observed, Pre-Re-NBA, Post-Re-NBA 和Pre-Postponed regions。它是图1中的椭圆型部分。本文重点讲述simulation regions,这里就不介绍PLI regions了。

 

6. SystemVerilog里的确定和不确定调度顺序

以下场景必须有确定的调度顺序:

  • begin-end块中的语句应该按照它们在该begin-end块中出现的顺序执行。可以暂停特定begin-end块中语句的执行,以利于模型中的其它进程;但是在任何情况下,begin-end块中的语句都不得以它们在源代码中出现的顺序以外的任何顺序执行。
  • NBAs语句应按照语句执行的顺序执行。

举个例子:

module test;
    logic a;
    initial begin
        a <= 0;
        a <= 1;
    end
endmodule

当执行initial块时,将会有两个event被添加到NBA region。前面的规则要求它们按照执行顺序进入event region,在连续的begin-end块中,这是初始顺序。该规则要求它们去NBA region也按照这个顺序执行。因此,在仿真时间0结束时,变量a将被赋值为0,然后赋值为1。

在以下场景时,执行的顺序是不确定的:

Active events可以从active或re-active event region中取出,并以任何顺序进行处理。

过程块(procedural block)中没有时间控制结构的语句不必作为一个event执行。时间控制语句是指#expression和@expression结构。在评估过程语句时的任何时候,仿真器都可以暂停执行并将部分完成的事件作为待处理事件放置在event region中。 这样做的效果是允许进程执行的交错,尽管交错执行的顺序是不确定的并且不受用户控制。

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

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

相关文章

Java中操作文件(二)

目录 一、什么是数据流 二、InputStream概述 2.1、方法 2.2、说明 三、FileInputStream概述 3.1、构造方法 3.2、利用Scanner进行字符串读取&#xff0c;简化操作 四、OutputStream概述 4.1、方法 4.2、PrinterWriter简化写操作 五、小程序练习 示例1 示例…

3D渲染的最佳CPU推荐, 目前流行的 3D 渲染 CPU

在 3D 渲染领域&#xff0c;选择合适的 CPU 对于确保最佳性能和生产力至关重要。CPU 充当渲染工作站的动力源&#xff0c;处理复杂的计算并高效执行渲染任务。市场上有众多选择&#xff0c;了解 2023 年最流行的 3D 渲染 CPU 非常重要。 AMD 锐龙 9 5950X AMD Ryzen 9 5950X …

r‘./csv‘和f‘./csv‘有啥区别

r./csv 和 f./csv 在文件路径中具有不同的含义和用途。 r./csv&#xff1a;这是使用原始字符串&#xff08;raw string&#xff09;表示法来表示文件路径。在原始字符串中&#xff0c;反斜杠字符&#xff08;\&#xff09;不会被视为转义字符&#xff0c;而是作为普通字符。因…

Linux之CentOS_7.9部署MySQL_5.7静默安装实测验证安装以及测试连接全过程实操手册

前言&#xff1a;前面记录了Windows环境的MySQL的安装卸载及相关测试评估&#xff0c;这里记录下在Linux下MySQL的静默部署方式。当然还有更多的其他部署&#xff0c;大家可根据自身环境及学习来了解。 环境&#xff1a; 1、CentOS-7.9-x86_64-DVD-2009.iso 2、MySQL-5.7.42-…

7.4 【Linux】设置开机挂载

7.4.1 开机挂载 /etc/fstab 及 /etc/mtab 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。 其它 mount point 必须为已创建的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则 &#xff08;FHS&#xff09; 所有 mount point 在同一时间之内﹐只…

Go Mutex 错过后悔的重要知识点

Go Mutex 的基本用法 Mutex 我们一般只会用到它的两个方法&#xff1a; Lock&#xff1a;获取互斥锁。(只会有一个协程可以获取到锁&#xff0c;通常用在临界区开始的地方。)Unlock: 释放互斥锁。(释放获取到的锁&#xff0c;通常用在临界区结束的地方。) Mutex 的模型可以用…

基于STM32麦克风阵列音频信号处理系统设计

v hezkz17进数字音频系统研究开发交流答疑 附录: ADAU1452音频处理系统

飞行动力学 - 第3节-滑翔性能、喷气式飞机最大最小速度 之 基础点摘要

飞行动力学 - 第3节-滑翔性能、喷气式飞机最大最小速度 之 基础点摘要 1. 滑翔机1.1 滑翔动力学方程1.2 滑翔机升阻比1.3 滑翔机性能 2. 喷气式飞机2.1 最小推力2.2 最大、最小速度 3. 参考资料 1. 滑翔机 1.1 滑翔动力学方程 注&#xff1a;这里的航迹角 γ \gamma γ按照右…

基于Python图像的作物种子数统计算法设计与应用(源码+文档+演示视频)

基于图像的作物种子数统计算法设计运用Qt作为开发工具&#xff0c;PyTorch库的使用&#xff0c;算法实现等。具体分为以下三部分&#xff1a;第一部分&#xff0c;采用数码影像技术对黄豆粒进行影像辨识技术。第二部分&#xff0c;前端页面功能包括图像识别技术模块、光源技术模…

音频转文字怎么弄?这几个音频转文字方法可以轻松实现

想象一下&#xff0c;你正在开车或忙着做家务&#xff0c;突然接到一通重要电话&#xff0c;却又没有纸和笔可以记录下来。这是应该怎么办呢&#xff0c;其实我们可以使用录音转文字的软件帮助我们把语音在线转换成文字就能轻松解决这个问题啦&#xff0c;但是又有小伙伴可能会…

考完PMP/NPDP认证,项目经理们最后都找到了什么样的工作?

早上好&#xff0c;我是老原。 有很多粉丝朋友都好奇&#xff0c;考完PMP/NPDP认证&#xff0c;到底能找到一份什么工作&#xff1f; 首先&#xff0c;你要知道一个问题&#xff1a;有工作的人选择考证的几率更大。 有的人是因为职场发展遇到了瓶颈期&#xff0c;想要利用考…

类与对象 (一)

引子 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 什么是对象&#xff1f;…

MYSQL进阶-索引的组合索引

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 一、练习题目二、SQL思路SQL进阶-索引的组合索引初始化数据解法什么是组合索引为什么要使用组合索引如何使用组合索引 答案参考&#xff1a; 一、练习题目 题目链接难度SQL进阶-索引的组合索引★★★☆☆ 二、SQL思路 …

C++初阶之类和对象(中)

类和对象&#xff08;中&#xff09; 1.类的6个默认成员函数2. 构造函数2.1 概念2.2 特性 3.析构函数3.1 概念3.2 特性 4. 拷贝构造函数4.1 概念4.2 特征 5 运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 前置和后置重载 6.日期类的实现7.const成员8.取地址及const取地址操作…

Markdown 进阶语法:Mermaid 绘图 (一) - 流程图 (Flowchart)

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【Linux】手写一个简易命令行解释器

文章目录 1. 了解命令行解释器1.1 命令行解释器是什么&#xff1f;1.2 我们为什么要尝试手写一个命令行解释器&#xff1f; 2. 命令行解释器的实现2.1 打印提示符2.2 获取用户输入2.3 创建子进程并进行进程程序替换2.4 内建命令 1. 了解命令行解释器 1.1 命令行解释器是什么&a…

TiDB-亿级订单数据亚秒响应查询方案

TiDB-亿级订单数据亚秒响应查询方案 TiDB宣传片 1. 什么是TiDB TiDB 是一个分布式 NewSQL 数据库&#xff0c;它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议&#xff0c;具有数据强一致的高可用特性&#xff0c;是一个不仅适合 OLTP 场景还适合 OLAP 场景…

完全背包问题(二维数组 / 一维数组实现)

完全背包 完全背包的一维和二维dp数组 有 N 件物品和容量为 W 的背包&#xff0c;第 i 件物品的重量是 weight[i]&#xff0c;价值是 value[i] 每件物品都有无限个&#xff0c;即同一物品能够放入背包多次&#xff0c;求背包所能装入物品的最大价值总和 完全背包和 0-1 背包不…

小白到运维工程师自学之路 第四十六集 (mongodb复制集)

一、概述 1、 MongoDB复制集&#xff08;MongoDB Replica Set&#xff09;是MongoDB提供的一种高可用性和数据冗余的解决方案。它由多个MongoDB实例组成&#xff0c;其中一个作为主节点&#xff08;Primary&#xff09;&#xff0c;其他节点则扮演从节点&#xff08;Secondary&…

使用finalshell连接Linux服务器出现的问题

第一次使用finalshell远程连接Linux服务器的过程、遇到的问题及解决方案 首先建立连接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d8836dcd8a224bf093ebdac031f763d5.png 然后问题来了 出现以下问题&#xff1a; java.net.ConnectException: Connection refused:…