一、调度作用
为了解决在仿真中产生的竞争冒险现象,程序在软件中是顺序执行的,所以规定了仿真的程序事件调度机制。
事件event:
程序中数值的变化就叫一个事件,功能仿真是一种事件驱动的仿真,整个仿真过程都是围绕事件来组织的,分为更新事件和求值事件。
仿真时间simulation time:
指波形中看到的时间,不是仿真软件在电脑中运行的时间,是仿真时间维护的时间值,用来对仿真电路的真实时间进行建模,当仿真时间推进到某一个时间点时,该时间点就被称为当前仿真时间(current time),而以后的任何时间都被称为将来仿真时间(future time)
层次化事件队列:
仿真时,仿真器对一个仿真时刻(即最小的一个仿真时间刻度也叫时间片timeslot)内语句的执行是按照一定的事件顺序执行的,即所有的事件都是按照一定的队列执行,这个队列在Verilog和System Verilog称之为层次化事件队列。
二、Verilog的事件调度(共四个域)
- Active Region:阻塞赋值;计算非阻塞赋值的右侧表达式(RHS);并且把相应的更新事件调度至NBA Region(NBA即nonblocking assignment,非阻塞赋值);连续赋值;调用$display系统函数,primitive计算。
- Inactive Region:#0延迟下的阻塞赋值。
- NBA Region:更新非阻塞赋值的左侧表达式(LHS)。
- Postponed Region: 调用$monitor和$strobe系统函数。
- 在同一个域中的代码的执行顺序是不确定的,仿真结果和仿真器相关。
说明:
阻塞赋值
- RHS的表达式计算和LHS的赋值更新,这两个动作之间不能插入其他动作,即所谓计算完毕,立即更新,阻塞赋值属于active event。
- 多个阻塞赋值语句,只有上一句完全执行完毕后,才会执行下一语句,因为在分层事件队列中,只有将活跃事件中排在前面的事件调出,并执行完毕后,才能够执行下面的事件。
非阻塞赋值
- 非阻塞赋值分成了两个步骤,先计算RHS,再更新LHS,中间会去完成其它事件的调度和计算 ,计算RHS表达式,得到新值后并不立即赋值,而是放在事件队列中等待,直到当前仿真时刻的后期才执行。
三、SV的事件调度
SV中约定了一种schedule(即事件执行顺序),使RTL代码和验证代码在同一时刻(time slot) 操作,按照一定的顺序执行。SV中,为了区分验证和RTL事件,testbench代码都包含在program模块中,program同module的形式很类似,只是它不包含任何的层次结构,也就是说, program内部不能再包含module,interface, program。以下框图是扣除了调用其他语言函数接口的PLI执行顺序的。
Active Region、Inactive Region、NBA Region统称为Active Region set,这是专门为RTL代码执行所设立的区域集合(set),实际上就是上面介绍的verilog代码的区域,只不过在sv中需要限定一下事件是在module中定义的,而不是program中定义的。在sv中,专门为验证平台所设计的区域集合,Reactive Region set。包含了Reactive Region、Re-Inactive Region、Re-NBA Region、Observed Region则是专门为断言所设计的区域。
- Preponed Region:这个区域中的数值是上一时间片中最终的稳定值。断言所需的数据就是在这个区域采样的。
- Observed Region:使用在preponed区域中采样的值来评估并发断言中的属性是否成立,属性评估在任何一个时间片中只发生一次。
- Reactive Region:所有定义在program内的阻塞赋值;执行断言pass/fail代码;所有定义在program内的非阻塞赋值RHS的计算,并将相应的更新事件调度至Re-NBA Region ;所有program内的连续赋值;执行系统函数$exit及隐式的$exit命令。这与Verilog中的Active Region内执行事件是很类似的,只是加了program的限定。
- Re-Inactive Region:program内#0延迟的进程。
- Re-NBA Region:执行Reactive Region调度过来的LHS更新事件。
- Postponed Region:同下一时钟片中的preponed区域一样的值,代表本时钟片中的最终稳定值,调用$monitor和$strobe系统函数;收集利用strobe采样的功能覆盖率这verilog Postponed Region不同。
- 在同一个域中的代码的执行顺序是不确定的,仿真结果和仿真器相关。