#systemverilog# 之 event region 和 timeslot 仿真调度(四)思考

前言

我们设计的硬件、仿真环境抽象意义上是可以并行运行的。但是在实际仿真时,不过是运行在cpu上的串行执行的程序而已(先不讨论多核)。systemverilog专门为这种并行到串行的转换定义了调度机制。但IEEE在制定规范时,并未规定一部分并行的事件执行的先后顺序,这点会引入不确定性(Nondeterminism),这种不确定性往往会体现在不同厂家的仿真器上(因为不同的厂家采用的调度算法是不一样的),最严重的后果就是在不同仿真器上看到的最终结果是不一样的。所以作为一名合格的工程师,应该对sv仿真器的调度机制、确定性与不确定性有基础的了解。

一、event与time slot的介绍 

systemverilog是为离散事件执行模型(discrete event execution)所定义的一种语言。怎么理解呢?离散指的是仿真时间(simulation time)上的离散性,仿真基于时间片(time slot)进行,只对有效的时刻点进行仿真。事件执行模型指的是仿真基于事件进行建模和整体的调度。

下面先介绍几个概念:

进程(Processes):是sv中并发调度的单元,比如:原语(Primitives)、initial过程块、always过程块、连续赋值(continuous assign)、异步任务(asynchronous tasks)、过程赋值(procedural assignment)等。进程是可以被执行的,有相应的状态标志(state,比如挂起)。进程会响应输入的变化并产生对应的输出。sv的描述的对象也正是这些进程。

更新事件(update event):仿真中,net或者variable上每次的变化被认为是一次更新事件。

求值事件(evaluation event):进程对更新事件敏感!当一个更新事件被执行时,所有对该更新事件敏感的进程都会被求值,但是顺序是任意的。进程的求值本身也被认为是一种事件,即求值事件(evaluation event)。更新事件和求值事件的相互交替执行,推动了仿真时间的前移。

时间片(time slot):这个真的没啥好解释的,知道仿真是基于离散的时刻点来进行的就可以了。只有在每个时间片上的仿真活动全部完成,仿真器才会进行下一个时间片,也就是说仿真时间是不可逆的。在早期的IEEE描述里面,time slot也叫做timestep,只不过现在不这么叫了。每个时间片都会被划分成很多个区域,下面会详细介绍。划分的目的是为了保证仿真执行的正确性和清晰性。

 二、systemverilog中的Events Regions

 再看sv的Event Regions之前,我们先看下verilog-2001里面定义的Event Regions。

嗯,看上去还不是很复杂。总共也就定义了4个regions(Active、Inactive、NBA、Postponed),而且一般对于我们而言,Inactive域是不会用到的(后面会解释)。

Active Region:

阻塞赋值。
计算非阻塞赋值的右侧表达式(RHS即Right-Hand-Side)。并且把相应的更新事件调度至NBA Region(NBA即nonblocking assignment,非阻塞赋值)。
连续赋值。
调用$display系统函数。
primitive计算。

Inactive Region:

#0延迟下的阻塞赋值。

NBA Region:

更新非阻塞赋值的左侧表达式。

Postponed Region:

调用$monitor和$strobe系统函数。

这里有两个有趣的东西:

1、非阻塞赋值其实是分成了两个步骤,先计算RHS,再更新LHS,中间会去完成其它事件的调度和计算。而阻塞赋值两步同时执行,不存在中间插入其它事件的情况。

2、有一些工程师喜欢用#0延迟去消除对同一变量赋值所引起的竞争,但是其实按照编码规范来,你就不应该在多个always对同一个变量进行阻塞赋值,所以理论上就不应该用到#0的阻塞赋值,所以也就用不到Inavtive Region了。


我们再来看看systemverilog-2005里面定义的Event Regions。

 

 我第一次看到内心其实也是崩溃的,卧槽,数了下,总共有17个Event Regions。但是,如果把8个PLI(Programming Language Interface,用来调用其它语言的函数的接口,比如C/C++)的Event Regions剔除,看上去也还好。

Active Region、Inactive Region、NBA Region统称为Active Region set,这是专门为RTL代码执行所设立的区域集合(set),实际上就是上面介绍的verilog代码的区域,只不过在sv中需要限定一下事件是在module中定义的,而不是program中定义的(verilog不存在program)。在sv中,相对于为RTL代码设立的区域,还有专门为验证平台所设计的区域集合,Reactive Region set。包含了Reactive Region、Re-Inactive Region、Re-NBA Region。Observed Region则是专门为断言所设计的区域。

Preponed Region:

采样数据,为断言做准备。

Observed Region:

使用Preponed Region采样到的值来计算断言。

Reactive Region:

所有定义在program内的阻塞赋值。
执行断言pass/fail代码?(这个有点疑问)
所有定义在program内的非阻塞赋值RHS的计算,并将相应的更新事件调度至Re-NBA Region。
所有program内的连续赋值。
执行系统函数$exit及隐式的$exit命令。
其实仔细看下,和Active Region内执行事件是很类似的,只不过加了program的限定。

Re-Inactive Region:

program内#0延迟的进程。

 虽然Inactive Region不推荐使用,但是Re-Inactive Region还是有一些独特的价值的,比如开一些后台fork时,你希望新开的子进程优先于父进程执行。如下: 

 Re-NBA Region:

执行Reactive Region调度过来的LHS更新事件。

Postponed Region:

调用$monitor和$strobe系统函数。
收集利用strobe采样的功能覆盖率。
比较一下,systemverilog的Postponed Region比verilog的Postponed Region多了功能覆盖率的收集功能。

四、关于#1step

#1step是systemverilog引入的一种新的能力,主要为了解决采样的问题。step时间单位其实就是我们定义的最小的时间精度,换句话说,这也是仿真器在时间上进行调度的最小单位,在#1step的delay时间内,是不存在事件的。

IEEE定义了#1step延迟会在当前time slot的Preponed Region进行采样,但这样实际上的效果和在上一个time slot的Postponed Region采样是一样的(有可能两个time slot之间差了无数个#1step)。所以个人猜测,很多EDA的厂家会对这里进行优化,但最终呈现的效果是在当前time slot的Preponed Region采样的就行。

 在时钟块(clocking block)里面默认的input skew就是#1step,而output skew是0。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemVerilogVerilog都是硬件描述语言,用于描述数字电路的行为和结构。它们在仿真调度机制方面有一些相似之处。 在Verilog中,所有的描述语句(连续赋值语句、行为语句块、模块实例化等)都是并行发生的。然而,由于仿真器是串行执行的,Verilog中的并行行为实际上是通过串行执行来模拟的。这意味着在仿真过程中,仿真器会按照一定的顺序逐条执行语句,分时执行。在所有并行进程执行完之前,仿真时间不会向前推进。\[3\] SystemVerilog也具有类似的并行行为和仿真调度机制。它引入了调度器(scheduler)的概念,用于控制并发执行的顺序。调度器根据一定的规则和优先级来决定哪些并发块应该被执行。这样可以模拟出更复杂的并行行为。\[1\]\[2\] 总结来说,SystemVerilogVerilog都使用了仿真调度机制来模拟并行行为。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、付费专栏及课程。

余额充值