systemverilog竞争冒险之time-slot

在systemverilog仿真过程中经常会遇到采样数据差一拍的问题,当希望获取当下cycle的数据,却获取的是上一cycle的旧数据,当希望获取的是采样前的数据,却阴差阳错的获取了采样后的数据。

verilog实现的是硬件电路,systemverilog仿真其实不是真正的硬件行为,而是软件行为,用软件来模拟硬件的行为,而软件的事件处理其实是串行的,为了模拟硬件行为,仿真器需要根据一定的规则处理电路事件。

一、time-slot

仿真过程由许多连续的时间组成的,每个时间成为一个time-slot,每个time-slot又被划分为多个区域,每个区域顺序执行。

systemverilog标准将一个time-slot划分为了17个区域:

time-slot划分

每个time-slot的执行过程如下:

执行顺序

一个time-slot的17个region的执行顺序如上所示,其中绿色框中的部分为module事件的执行,红色框中的为program事件的执行,observed为断言的执行。

    • Active region

执行和计算module当前活动:

  • 阻塞赋值

  • 非阻塞赋值表达式右值

  • 连续赋值语句

  • 计算输入并更新verilog原语输入

2.Inactive region

带有#0延时的事件被推迟到Inactive执行。

3. NBA region

非阻塞赋值左值更新在NBA生效。

4. observed region

断言在此region执行。

time-slot的细节可以参考systemverilog协议的“Scheduling semantics”章节。

二、仿真竞争冒险

1.仿真环境搭建在program中

program的一个重要作用就是将仿真环境和硬件代码分割开来,在program执行时,module的行为已经确定,避免了验证环境和RTL线程的竞争冒险。

所以在@rtl.clk时采样rtl.sig会得到更新后的“新值”。

2.仿真环境搭建在module中

由于program语法的限制在program中搭建仿真环境并不是很方便,更多的仿真环境是搭建在module中的。

分析一下下面两种情况:

  1. @rtl.clk时采样组合逻辑rtl.sig值,此时会出现竞争冒险导致采样值不确定是新值还是旧值。

rtl.sig在active region更新,环境使用rtl.sig也在active region,两个进程的顺序不确定。

  1. @rtl.clk时采样时序逻辑rtl.sig值,此时采样的值为更新前的旧值。

rtl.sig在NBA region更新,而环境使用rtl.sig在active region,顺序确定。

三、interface

上面提到在module中搭建仿真环境会存在冒险竞争的问题,interface的clocking block为解决这个问题提供了方案。

interface示例

在硬件电路中有一个很重要的概念建立时间和保持事件,如果希望电路功能正常,不出现时序问题,需要综合出的电路满足建立保持时间。

所谓的建立时间就是在时钟沿前数据要保持稳定的时间,保持时间是在时钟沿后数据要保持稳定的时间。

interface的clocking block实现原理也是类似的,clocking block会在时钟沿前一段时间采样信号值,在时钟沿后一段时间驱动信号值,避免了可能出现的采样和驱动冒险。

上图中的1step,对于input为上一个time-slot的postponed region,当然也可以设置为具体的时间,如1ps。如果不设置信号skew,则默认输入为1step,输出为0

在使用@if.cb时,该时钟对齐在observed region

对于时钟与信号的采样分为以下几种情况(这里只讨论验证环境搭建在module中的情况):

  1. @rtl.clk后采样rtl.sig,上面已经讨论过了,不赘述。

  1. @rtl.clk采样if.cb.sig

clocking block的输入信号采样发生在上一time-slot的最后,故采样的值为“旧值”。

  1. @if.cb后采样rtl.sig

时钟对齐在observed region,信号已经完成更新,采样的值为“新值”。

  1. @if.cb后采样if.cb.sig

采样值为“旧值”。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值