SVA中的局部变量

局部变量是SVA语言中最强大的特性之一,它使得检查设计中复杂的流水线行为成为可能。SVA中的局部变量是动态变量,也就是说它会在每一个sequence实例化的时候动态创建,在sequence结束的时候自动销毁。

以下图为例:

局部变量可能是您经常使用的功能。它们可以用于序列(sequence)或者属性(property)。之所以称之为局部是因为它们对声明它的sequence是局部的,对其他sequence或者property是不可见的。当然,这个限制是有解决办法的,文章末尾会简单介绍下。

上图指出了局部变量的关键元素。局部变量最重要的和的有用部分是它允许多线程,和包含它的sequence被实例化的时候创建局部变量的新副本。用户不需要担心每次调用sequence时创建局部变量的副本。

上面的例子是说每当RdWr在posedge clk处采样为高电平时,assertion开始评价,5个时钟后比较rData和wData的值。这个例子展示了如何完成这个规范。局部变量local_data在clk的上升沿存储rData值,然后5个钟以后与wData进行比较。请注意,每个clk的上升沿RdWr都有可能采样为真,也就是说序列data_check在每个clk被执行,同时创建一个local_data的新副本并创建一个新的线程,5个时钟后比较wData和local_data +h'ff的大小。

下图显示了局部变量的其他语义。需要注意的是局部变量必须附加到表达式的规则,而比较不能附加到表达式!

如下图所示,当你存储一个值到局部变量时,这个局部变量必须附加到表达式上。但是,当你比较存储在局部变量的值时它不能附加到表达式。

下图显示了,局部变量的另一个使用限制,即不能在范围运算符中使用局部变量。但是,这不是局部变量错。事实上,我们不能在##m或##[m:n]延迟运算符中加入变量延迟。从软件仿真角度来看,延迟范围的操作需要在elaboration的时候知道。因此他们不能是"变量"。

例1:创建计数器

上图展示了我们如何能有效地使用局部变量和连续重复运算符来构建一个计数器。为什么?你会有许多应用场景能够使用这个例子。例如,当网络上到来的数据包超过设定的阈值时,会产生一个中断。

property checkCounter声明了一个叫做LCount的局部变量,它等待startCount的上升边沿,并将initCount存储到LCount局部变量(initCount在代码中的其他地方定义)。然后等待1个时钟,并将LCount增加1,然后继续在每个时钟将LCount增加1,直到LCount达到maxCount。连续的循环操作符[* 0:$]执行重复计数操作。换句话说,“LCount=LCount+1”表达式在每个时钟的上升沿重复直到“LCount==maxCount”。一旦计数到maxCount,intr信号应在同一时钟(|->)被置位1。

例2:可变的时钟延迟

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值