#systemverilog# 之 event region 和 timeslot 仿真调度(三)概念

调度机制的由来

SystemVerilog是HDVL语言,相较与Verilog,除了面向HW design应用,也为了提高verif的效率。所以其仿真调度算法在向下兼容Verilog的同时,增加了不少新的‘Time region’,以便更好的支持program块等针对验证需求的新特性。

SV不同于C/C++等软件语言,为了对硬件进行仿真建模,所以有很多并行的process,而仿真器作为运行在CPU上的软件,只是按照SV LRM的仿真调度算法,开始仿真后,将仿真时间串行的一步步的向前推进。由于SV LRM并没有完全详细的规定并行的process以具体什么样的顺序来执行,这就引进许多不确定性(Nondeterminism), 不同厂家的仿真器可能有不同的仿真结果。

为了在coding时就消除这种不确定性,更好理解常见的design rule,需要对Verilog/SV的仿真调度算法进行深刻理解,并且涉及到VHDL的混合仿真,也要理解VHDL和Verilog/SV之间的差异。

设计规则

常见的Design Rules:

  1. 时序逻辑中应使用非阻塞赋值(<=)
  2. 锁存器建模应使用非阻塞赋值(<=)
  3. 用always对组合逻辑建模,应使用阻塞赋值(=)
  4. 当需要在同一always中对组合逻辑和时序逻辑建模时,可以使用<=,不要使用=
  5. 不要在同一always块中混合使用<=和=
  6. 要避免在不同的always块中对同一变量进行赋值
  7. 使用$strobe来打印同一时刻下的非阻塞赋值
  8. 千万,千万不要使用0延时(#0)

Simulation模型 

 SV是基于离散事件执行驱动的仿真模型,event-driven仿真的基本概念:

1)simulation time, 2)simulation regions,3 event processing

2.1 事件(event)

模型中数值的变化,功能仿真是一种事件驱动的仿真,整个仿真过程都是围绕事件来组织的。具体地说,由于仿真器在cpu是串行执行,其需要将各个event放进事件队列中(event queue),这就叫scheduling an enent. 

更新事件(update event):在被仿真的电路中,线网或寄存器的值在任何进程中的任何改变都被认为是一个更新事件。

求值事件(evaluation event):由于更新事件产生的,进程的计算,计算事件。另外也包含PLI调用。

计算事件和更新事件之间循环往复的互相触发,推动仿真时间的前进。

process: 进程是Verilog中的独立执行单元,包括:原语(Primitives), 模块(Moules), initial过程块, always过程块, 连续赋值语句(assign), 异步任务(task)。在仿真时,所有的进程都是仿真器按Verilog的语义来顺序执行的,效果是各个进程并行执行的效果,在未执行完当前所有的进程时,仿真时间不会向前推进。

 

2.2 仿真时间(simulation time)

当然是指波形中看到的时间,不是仿真软件在host PC中运行的时间。是仿真时间维护的时间值,用来对仿真电路的真实时间进行建模,当仿真时间推进到某一个时间点时,该时间点就被称为当前仿真时间(current time),而以后的任何时间都被称为将来仿真时间(future time)。

2.3 仿真域(simulation region)

2.3.1 层次化事件队列(The stratified event queue)

一个timeslot下的事件队列可以划分为不同层次的域(region),这些域按照特定的优先级顺序执行,只有所有在优先级高的region内的事件执行完,才执行低优先级域的事件。仿真器首先按照仿真时间对事件进行排序,然后再在当前仿真时间里按照这些域的优先级顺序进行排序。在同一域里的事件,执行顺序是不确定的。

2.3.2 Verilog的事件调度器

Verilog的timeslot划分5个域:
Active region : 执行process语句,阻塞赋值,连续赋值,及非阻塞赋值的右侧求值事件,阻塞赋值和连续赋值会触发在该时刻的新事件。$display是在该region执行。 
Inactive region : 执行 #0的阻塞赋值; 
NBA region : 更新非阻塞赋值的LHS; 
Monitor region : 执行$monitor 和 $strobe等,不会出发任何其他事件的read-only region 

在这里插入图片描述

在这里插入图片描述

2.4 System Verilog的事件调度器

SystemVerilog增加到17个域,为assertion,design code和testbench code间交互作用减少race发生,其中9个顺序的域为了SV statement的执行,8个顺序的域为了PLI代码的执行。下图是略去了PLI region的SV scheduler。

在这里插入图片描述

在这里插入图片描述

Preponed region : 在timeslot开始时进行信号采样, assertion使用的signal也是在这个region进行采样。
observed region : 执行assertion evaluation. 
Re-Active and Re-Inactive regions : 执行assertion action blocks 和 testbench programs 

 2.5 SV引入了新的代码块: program, final, clocking  

program: 为了清晰的区分design和TB,SV引入program块,它可以包含TB的环境,目的是减少竞争冒险。program在Re-Active域执行。

final:final块用来在仿真末尾时打印summary info,它是在仿真隐式或显式的调用$finish后立即执行,没有delay,如:

 clocking:  SV引入clocking用以解决TB和design间的timing及sychronisation的需求.

3. 确定性(Determinism)和不确定性(Nondeterminism)

3.1 确定性(Determinism)

SV标准规定了下面两种确定的scheduling顺序:

1. 在begin...end块中的语句要按其代码出现的先后顺序执行,为了支持模型中的其他过程,可以挂起特定的begin-end块中语句的执行。不管怎样,不允许begin-end块中的语句不按照代码中的顺序以任意顺序执行。

2. NBAs必须按照语句的顺序来执行。

3.2 不确定性(Nondeterminism)

SV并没有规定多个processes执行时的顺序,如果多个processes在同一时刻下触发,这些processes以什么样的先后顺序来执行,由于SV标准并没有规定,不同厂商的仿真器不一定相同。如下例,q在d变化后是变成d还是~d,其结果都符合SV规定,但不同的仿真器可能会得到不同的结果。

4. 阻塞/非阻塞赋值(blocking/nonboclking assignment) 

4.1 阻塞赋值

1、RHS的表达式计算和LHS的赋值更新,这两个动作之间不能插入其他动作,即所谓计算完毕,立即更新。

2、所谓阻塞赋值就是在一个”begin…end”块中的多个阻塞赋值语句,只有上一句完全执行完毕后,才会执行下一语句。
阻塞赋值属于active event,会立刻执行,这就是阻塞赋值“计算完毕,立即更新”的原因。此外,由于在分层事件队列中,只有将活跃事件中排在前面的事件调出,并执行完毕后,才能够执行下面的事件,这就可以解释阻塞赋值的第二个特点。

4.2 非阻塞赋值

非阻塞赋值分两个step执行:RHS的计算表达式和LHS的赋值更新。首先,应该是RHS表达式计算,得到新值后并不立即赋值,而是放在事件队列中等待,直到当前仿真时刻的后期才执行。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值