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

书接上回:

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:

SystemVerilog和Verilog都是硬件描述语言,用于描述数字电路的行为和结构。它们在仿真调度机制方面有一些相似之处。 在Verilog中,所有的描述语句(连续赋值语句、行为语句块、模块实例化等)都是并行发生的。然而,由于仿真器是串行执行的,Verilog中的并行行为实际上是通过串行执行来模拟的。这意味着在仿真过程中,仿真器会按照一定的顺序逐条执行语句,分时执行。在所有并行进程执行完之前,仿真时间不会向前推进。\[3\] SystemVerilog也具有类似的并行行为和仿真调度机制。它引入了调度器(scheduler)的概念,用于控制并发执行的顺序。调度器根据一定的规则和优先级来决定哪些并发块应该被执行。这样可以模拟出更复杂的并行行为。\[1\]\[2\] 总结来说,SystemVerilog和Verilog都使用了仿真调度机制来模拟并行行为。Verilog中的并行行为是通过串行执行来模拟的,而SystemVerilog引入了调度器来控制并发执行的顺序。 #### 引用[.reference_title] - *1* [SV仿真调度机制](https://blog.csdn.net/weixin_39060517/article/details/115909613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SV仿真调度机制以及阻塞非阻塞赋值的区别(用例子说明)](https://blog.csdn.net/dinghj3/article/details/122513314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值