sv标准研读第四章-时间调度机制

server/2024/9/20 1:24:46/ 标签: 前端

书接上回:

sv标准研读第一章-综述

sv标准研读第二章-标准引用

sv标准研读第三章-设计和验证的building block

4 时间调度机制

4.1 概述

此章描述以下内容:

-基于事件的模拟调度语义

- SystemVerilog的分层事件调度算法

-事件排序的确定性和非确定性

-竞争条件的可能来源

- PLI回调控制点

4.2 硬件模型和验证环境的执行

本标准中各章的平衡描述了语言中每个元素的行为。本章概述了这些元素之间的交互,特别是关于事件的调度和执行。

组成SystemVerilog语言的元素可以用来描述电子硬件在不同抽象层次上的行为。SystemVerilog是一种并行编程语言。某些语言结构的执行是通过并行执行块或进程来定义的。重要的是要了解哪些执行顺序对用户是有保证的,哪些执行顺序是不确定的。尽管SystemVerilog不仅仅用于simulation,但该语言的语义是为simulation而定义的,其他一切都是从这个基本定义中抽象出来的。

4.3 事件simulation

SystemVerilog语言是根据离散事件执行模型定义的。本小节将更详细地描述离散事件simulation,以提供描述SystemVerilog构造的含义和有效解释的上下文。这些结果定义为simulation提供了标准的SystemVerilog参考算法,所有兼容的模拟器都应该实现。在下面的事件执行模型定义中,有大量的选择,不同的模拟器之间在执行的一些细节上存在差异。此外,SystemVerilog模拟器可以自由地使用不同于本条款中描述的算法,前提是用户可见效果与参考算法一致。

SystemVerilog包含了进程的连接和执行。进程可以作为对象执行,可以具有状态,并且可以响应其输入的变化以产生输出。进程是并发调度的元素,例如initial过程语句。进程的例子包括但不限于:原语;initial、always、always_comb、always_latch和always_ff过程;continuous assignment;异步task;和过程assignment语句。

正在simulation的net/var的每一个变化称之为update event

进程对update event很敏感。当一个update event被执行时,所有对该事件敏感的进程都会被考虑以任意顺序进行评估。进程的评估也是一个事件,称为evaluation event

evaluation event还包括PLI回调,这些回调是执行模型中的point,PLI应用程序例程可以从仿真内核调用。

除了事件之外,模拟器的另一个关键方面是时间。术语仿真时间指的是由模拟器维护的时间值,以模拟所模拟的系统描述所需的实际时间。在本章中,术语“时间”与“模拟时间”可互换使用。

为了完全支持清晰和可预测的交互,将单个时隙划分为多个区域,在这些区域中可以安排事件,以提供特定类型执行的顺序。这允许属性和检查器在被测设计处于稳定状态时对数据进行采样。属性表达式可以安全地求值,测试平台可以零延迟地对属性和检查器做出反应,所有这些都以可预测的方式进行。同样的机制还允许设计、时钟传播和/或刺激和响应代码中的非零延迟自由混合,并与周期精确描述保持一致。

4.4 分层事件调度机制

一个兼容的SystemVerilog模拟器应该保持某种形式的数据结构,允许事件动态调度、执行,并随着模拟器的时间推移而删除。数据结构通常被实现为一组时间顺序的链表,这些链表以一种定义良好的方式被划分和细分。

第一种是按时间划分的。每个事件都有且只有一个模拟执行时间,在模拟过程中的任何给定点都可以是当前时间或将来的某个时间。在特定时间的所有scheduled事件定义为一个time slot。在移动到下一个非空时隙之前,按照时间顺序执行并删除当前模拟时隙中的所有事件,从而继续进行模拟。这个过程保证了模拟器不会在时间上倒退。

一个time slot可以划分成下面这些region:

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

划分成这些region的目的是为了实现在design和testbench之间提供可预测的交互。

注意:这些区域基本上包含了用于模拟的IEEE 1364-2005参考模型,具有完全相同级别的确定性。换句话说,遗留的Verilog代码应该继续正确运行,而不需要在SystemVerilog机制中进行修改。

4.4.1 active region集和reactive region

所有的事件region可以划分为两大类:active region集和reactive region集。

active region集包括:Active,Inactive, Pre-NBA, NBA, and Post-NBA regions。

reactive region集包括:Reactive, Re-Inactive, Pre- Re-NBA, Re-NBA, and Post-Re-NBA regions。

The Active, Inactive, Pre-NBA, NBA, Post-NBA, Pre-Observed, Observed, Post-Observed, Reactive, Re-Inactive, Pre-Re-NBA, Re-NBA, Post-Re-NBA, and Pre-Postponed regions又被称之为interative regions。

另外,上面所有的region还可以有另一种划分方式,分为simulation regions(3.4.2)和PLI regions(3.4.3)。

4.4.2 simulation regions

simulation regions包括:Preponed, Active, Inactive, NBA, Observed, Reactive, Re-Inactive, Re-NBA and Postponed regions。图4-1显示了regions的执行。

4.4.2.1 Preponed event region

在进入当前time slot之前,preponed event region因为有#1 step的采样delay从而使其有采样数据的能力。#1 step采样就等同于在当前time slot的preponed region进行数据采样,也等同于在先前一个time slot的postponed region进行采样。

Preponed region PLI event也在该region进行(参照4.4.3.1)

4.4.2.2 Active events region

Active region的作用是让所有当前active region set events保持在being evaluated的状态,进程的执行顺序是任意的。

4.4.2.3 inactive events region

Inactive region的作用是让所有active events进程之后的events保持在being evaluated的状态。

如果原来events是被安排在active region进行evaluated,那么加上#0之后该events就会被推迟安排到inactive region进行evaluated。

4.4.2.4 NBA events region

NBA region的作用是让所有安排在inactive region之后的events保持在being evaluated的状态。

非阻塞赋值会在NBA region执行。

4.4.2.5 observed events region

Property表达式在该region执行。当执行property表达式的过程中,它里面的pass/fail语句会在当前time slot的reactive region执行。该region不允许PLI callback执行。

4.4.2.6 reactive events region

在该region执行的events是任意顺序的。

在region执行的包括:checker/program里的阻塞赋值、concurrent assertion的action block

4.4.2.7 re-inactive events region

原本在reactive region执行的event在加上#0后就可以推迟安排到re-inactive region执行。

4.4.2.8 re-NBA events region

在reactive执行的非阻塞赋值右边,会创建一个事件让非阻塞赋值的左边在re-NBA region执行。

4.4.2.9 postponed events region

$monitor/$strobe等其它类似的events在该region执行。

该region不允许有新的value change,也不允许给任何net/var写值,也不允许给之前region里的event进行schedule。

该region允许有PLI events。

4.4.3 PLI regions

为了支持PLI callback事件的执行,在simulation region里的部分region可以允许PLI events执行,包括:Preponed, Pre-Active, Pre-NBA, Post-NBA,Pre-Observed, Post-Observed, Pre-Re-NBA, Post-Re-NBA and Pre-Postponed regions。

4.4.3.1 preponed PLI region

Preponed region提供PLI callback control point,从而使得PLI程序在net/var变化之前能拿到其在当前time slot的值。该region不允许给net/var写值,也不允许schedule任何event。

注意:PLI在preponed region不会安排callback。

4.4.3.2 pre-active PLI region

该region提供PLI callback control point,从而使得PLI程序在active region执行events之前能够对这些events进行读写等操作。

4.4.3.3 pre-NBA PLI region

该region提供PLI callback control point,从而使得PLI程序在NBA region执行events之前能够对这些events进行读写等操作。

4.4.3.4 post-NBA PLI region

该region提供PLI callback control point,从而使得PLI程序在NBA region执行events之后能够对这些events进行读写等操作。

4.4.3.5 pre-observed PLI region

该region提供PLI callback control point,从而使得PLI程序在NBA region执行events之后能够对这些events进行读操作。

该region不允许给任何net/var写值,也不允许schedule event。

4.4.3.6 post-observed PLI region

该region提供PLI callback control point,从而使得PLI程序在observed region执行property评估之后能够对这些property值进行读操作。

注意:该region不会执行PLI callback。

4.4.3.7 Pre-Re-NBA PLI region

该region提供PLI callback control point,从而使得PLI程序在re-NBA region执行events之前能够对这些events进行读写等操作。

4.4.3.8 post-re-NBA PLI region

该region提供PLI callback control point,从而使得PLI程序在re-NBA region执行events之后能够对这些events进行读写等操作。

4.4.3.9 pre-postponed PLI region

该region提供PLI callback control point,从而使得PLI程序在前面 region执行events之后能够对这些events进行读写等操作。

4.4.3.10 postponed PLI region

该region提供PLI callback control point,从而使得PLI程序在所有 region执行e之后能够创建只读events。

该region可以执行cbReadOnlySynch等其它类似的events。

完整的regions如下图:

Sv仿真的参考算法:

由上面的算法可知,可以出现迭代循环的region是:Active, Inactive, Pre-NBA, NBA, Post-NBA, Pre-Observed,Observed, Post-Observed, Reactive, Re-Inactive, Pre-Re-NBA, Re-NBA, Post-Re-NBA, and Pre-Postponed。并且,一旦进入Reactive, Re-Inactive, Pre-Re-NBA, Re-NBA, or Post-Re-NBA region,就回不去这5个region之前的region了,除非这5个region已经empty。

4.6 确定性

本标准保证了如下的schedule order:

a)begin-end块中的语句应按照它们在begin-end块中出现的顺序执行。在特定的begin-end块中执行的语句可以被挂起,以便于模型中的其他进程;但是,在任何情况下,begin-end块中的语句都不能按照它们在源程序中出现的顺序执行。

b) nba应按照语句的执行顺序执行(见10.4.2)。

举例:

当这个块被执行时,将有两个事件添加到NBA区域。前一条规则要求按执行顺序在事件区域中输入它们,在一个连续的begin-end块中,这是源顺序。这条规则要求他们来自NBA region,并按执行顺序执行。因此,在模拟时间0结束时,将变量a赋值为0,然后赋值为1。

4.7不确定性

不确定性的一个来源是active events可以从active或Reactive event region中取出,并以任何顺序进行处理。不确定性的另一个来源是过程块中没有时间控制构造的语句不必作为一个事件执行。时间控制语句是# expression和@ expression结构(见9.4)。在评估过程性语句的任何时候,模拟器都可以暂停执行,并将部分完成的事件作为待挂事件放置在event region中。这样做的效果是允许进程交错执行,尽管交错执行的顺序是不确定的,并且不受用户控制。

4.8 竞争冒险条件

由于表达式求值和net更新事件的执行可能会混合在一起,因此可能存在竞争条件。举例:

simulation显示1或0时都是正确的。将0赋值给q将启用p的更新事件。simulation可以继续执行$display任务,也可以执行p的更新,然后执行$display任务。

4.9 assignment调度

赋值操作会被转化为process和events,见4.9.1-4.9.7.

4.9.1连续赋值

连续赋值语句(见10.3)对应于一个process,对表达式中的源元素敏感。当表达式的值发生变化时,它会导致将active update event添加到event region,并使用当前值给目标。为了传播常数值,也在时间0处计算连续赋值过程。这包括从端口连接推断的隐式连续赋值(见3.9.6)。

4.9.2 过程连续赋值

过程连续赋值(即assign/force赋值;参见10.6)对表达式中的源元素敏感。当表达式的值发生变化时,它会导致将active update event添加到event region,并使用当前值给目标。

deassign或release语句使任何相应的assign或force语句失效。

4.9.3 阻塞赋值

一个阻塞赋值语句(见10.4.1)有一个内部赋值延迟,使用当前值计算右边的值,然后导致执行进程被挂起并作为未来事件调度。如果延迟为0,则该进程在当前时间被调度为Inactive事件。如果从Reactive区域执行零延迟的阻塞分配,则该流程将被调度为Re-Inactive事件。

当返回流程时(或者如果它在没有指定延迟的情况下立即返回),流程将执行对左侧的赋值,并基于左侧的更新启用任何事件。进程恢复时的值给到左边的目标。然后可以继续执行下一个顺序语句或其他Active或Reactive事件。

4.9.4 非阻塞赋值

非阻塞赋值语句(见10.4.2)总是计算更新的值,并将更新调度为NBA更新事件,如果延迟为零,则在当前time slot中执行,如果延迟为非零,则作为未来事件执行。将更新放置在事件区域时的值用于计算右边的值和左边的目标。

4.9.5 Switch(transistor)处理

4.5中描述的事件驱动仿真算法依赖于单向信号流,可以独立处理每个事件。读取输入,计算结果,并安排更新。

除了behavioral和gate-level建模之外,SystemVerilog还提供了Switch建模。transistor提供双向信号流,需要transistor连接的节点进行协调处理。

对Switch进行建模的源元件是各种形式的晶体管,称为tran、tranif0、tranif1、rtran、rtranif0和rtranif1。由于输入输出相互作用,transistor处理必须考虑双向Switch连接网络中的所有设备,才能确定网络上任何节点的合适值。模拟器可以通过放松技术做到这一点。模拟器可以在任何时候处理tran。它可以在特定时间处理跨连接事件的子集,与其他活动事件的执行混合在一起。

当某些晶体管的栅极值为x时,需要进一步细化。一种概念上简单的技术是将这些晶体管设置为全导和非导晶体管的所有可能组合,反复求解网络。在所有情况下,任何具有唯一逻辑电平的节点都具有等于该电平的稳态响应。所有其他节点都有稳态响应x。

4.9.6 端口连接

端口通过隐式连续赋值语句或隐式双向连接连接进程。双向连接类似于两个网络之间始终启用的传输连接,但没有任何强度降低。

端口可以作为对象进行连接,如下:

—如果是一个input端口,且被外面做了连续赋值操作,那么可以把它看成是local net/var

—如果是一个output端口,且被里面做了连续赋值操作,那么可以把它看成是outside net/var

—如果是一个inout端口,那么它会作为一个没有强度的transistor连接到localnet和outside net

原语终端,包括UDP终端,不同于模块端口。原语输出和输入terminal应直接连接到1bit net或1bit net表达式(见23.3.3),中间没有任何改变强度的过程。原语执行会作为active update events。连接到1位网或1位结构网表达式的输入端子也直接连接,没有中间过程影响强度。连接到其他类型表达式的输入终端被表示为从表达式到连接到输入终端的隐式网络的隐式连续赋值。

4.9.7 子程序

子程序的参数是按值传递的,在调用的时候会进行复制,返回值的时候又会复制出去,这种复制的行为和阻塞赋值的效果相同。

4.10 PLI callback control point

PLI callback有两种:(1)activity发生时立即执行callback;(2)被当成one-shot event执行。

下表提供了在不同region可以执行的PLI callback:


http://www.ppmy.cn/server/113768.html

相关文章

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能…

模型压缩之剪枝

(1)通道选择 这里要先解释一下: (1)通道剪枝 那我们实际做法不是上面直接对所有层都添加L1正则项,而是仅仅对BN层权重添加L1正则项。通道剪枝具体步骤如下: 1.BN层权重添加L1正则项&#xf…

Redis 事务

本篇文章内容为Redis 事务的四种命令介绍及应用场景和示例 目录 Redis 事务 使用Redis事务 1.事务开始 2.命令入队 3.事务执行 取消事务 WATCH命令的实现 总结 Redis 事务 Redis通过MULTI、EXEC、WATCH、DISCARD等命令来实现事务(transaction)功…

微信小程序登录与获取手机号 (Python)

文章目录 相关术语登录逻辑登录设计登录代码 相关术语 调用接口[wx.login()]获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识&#xff0…

亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖

近日,由中央网信办网络安全协调局指导、中国网络安全产业联盟(CCIA)主办的“2024年网络安全优秀创新成果大赛”评选结果公布。亚信安全信舱ForCloud荣获“创新产品”优胜奖,亚信安全“宁波市政务信息化网络数据安全一体化指挥系统…

【Rust光年纪】从心理学计算到机器学习:Rust语言数据科学库全方位解读!

Rust语言的数据科学和机器学习库大揭秘:核心功能、使用指南一网打尽! 前言 随着数据科学和机器学习在各个领域的广泛应用,使用高效、稳定的编程语言来实现这些功能变得尤为重要。Rust语言作为一种安全且高性能的系统编程语言,正…

前端核心基础知识总结

目录 前言 一、HTML模块 1. 标签结构 2. 语义化标签 3. 表单元素 二、CSS模块 1. 选择器 2. 盒模型 示例一:为一个div标签设置了宽度为 200 像素,高度为 100 像素的内容区。 示例二:内边距的存在可以使内容与边框之间有一定的间隔&…

基于云函数的自习室预约微信小程序+LW示例参考

全阶段全种类学习资源,内涵少儿、小学、初中、高中、大学、专升本、考研、四六级、建造师、法考、网赚技巧、毕业设计等,持续更新~ 文章目录 [TOC](文章目录) 1.项目介绍2.项目部署3.项目部分截图4.获取方式 1.项目介绍 技术栈工具:云数据库…

java设计模式(行为型模式:状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式)

6,行为型模式 6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果…

JS中【async】和【defer】属性详解与区别

理解浏览器如何处理JavaScript以及相关的async和defer属性对于前端开发是非常重要的。以下是相关知识点的详细讲解: 1. 浏览器的解析和渲染过程 浏览器在加载网页时,会按照以下步骤解析和渲染内容: HTML解析: 浏览器从顶部开始逐行解析HTML…

【语音告警】博灵智能语音报警灯JavaScript循环播报场景实例-语音报警灯|声光报警器|网络信号灯

功能说明 本文将以JavaScript代码为实例,讲解如何通过JavaScript代码调用博灵语音通知终端 A4实现声光语音告警。主要博灵语音通知终端如何实现无线循环播报或者周期播报的功能。 本代码实现HTTP接口的声光语音播报,并指定循环次数、播报内容。由于通知…

C++ linux下的cmake

cmake是一个帮助我们构建项目的跨平台工具。让我们不需要一次次手动配置makefile,或者手动去链接库这些操作。 配置 (基于vscode编辑器) 在项目main.cpp同级目录下,创建CMakeLists.txt文件,举例内容如下(需…

衡石分析平台使用手册-快速入门

快速入门​ 快速指南​ 创建管理员账号​ 按照文档安装成功之后&#xff0c;假设安装所在服务器 IP 是<Server IP>&#xff0c;端口是<Server Port>&#xff0c;则可以通过浏览器访问http://<Server IP>:<Server Port>/ 访问衡石分析平台&#xff0…

代码随想录算法day28 | 动态规划算法part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、 746. 使用最小花费爬楼梯

理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪…

任务执行拓扑排序(华为od机考题)

一、题目 1.原题 一个应用启动时&#xff0c;会有多个初始化任务需要执行&#xff0c; 并且任务之间有依赖关系&#xff0c; 例如&#xff1a;A任务依赖B任务&#xff0c;那么必须在B任务执行完成之后&#xff0c;才能开始执行A任务。 现在给出多条任务依赖关系的规则&#x…

银行定期产品

银行存款产品如下: 其中对私的储蓄存款: 定期存款是指存款人在银行或金融机构存入一定金额的资金,并约定一个固定的存期,在存期内不得随意支取,到期后可以获取本金和预先约定好的利息的一种存款方式。根据不同的存取方式和特点,定期存款主要可以分为以下几种类型: 整存…

Redis进阶(二)--Redis高级特性和应用

文章目录 第二章、Redis高级特性和应用一、Redis的慢查询1、慢查询配置2、慢查询操作命令3、慢查询建议 二、Pipeline三、事务1、Redis的事务原理2、Redis的watch命令3、Pipeline和事务的区别 四、Lua1、Lua入门&#xff08;1&#xff09;安装Lua&#xff08;2&#xff09;Lua基…

无人机纪录片航拍认知

写在前面 博文内容为纪录片航拍简单认知&#xff1a;纪录片 航拍镜头&#xff0c;航拍流程&#xff0c;航拍环境条件注意事项介绍航拍学习书籍推荐《无人机商业航拍教程》读书笔记整理&#xff0c;适合小白认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于…

堆-数组的堆化+优先队列(PriorityQueue)的使用

一、堆 1、什么是堆&#xff1f; 以完全二叉树的形式将元素存储到对应的数组位置上所形成的新数组 2、为什么要将数组变成堆&#xff1f; 当数组中的元素连续多次进行排序时会消耗大量的时间&#xff0c;将数组变成堆后通过堆排序的方式将会消耗更少的时间 二、接口 给堆…

OpenSSL Windows编译

目录 1. 源码下载2. vs2022编译 1. 源码下载 源码地址 2. vs2022编译 (1) 将“VS2022安装目录VC\Auxiliary\Build\“设置为PATH环境变量&#xff0c;启动cmd命令行&#xff08;一定要先设置环境变量&#xff09;。 (2)在cmd下进入VS2013安装目录vs2022\VC\Auxiliary\Build&…