返回介绍

17.7.3 采样值函数

发布于 2020-09-09 22:55:53 字数 3322 浏览 1272 评论 0 收藏 0

本节描述了用来访问一个表达式采样值的有效的系统函数。这些函数能够访问当前的采样值、访问过去的采样值、或者检测一个表达式采样值的变化。一个表达式的采样在17.3节中解释。SystemVerilog提供了下列的函数。

$sampled(expression [, clocking_event])
$rose(expression [, clocking_event])
$fell(expression [, clocking_event])
$stable(expression [, clocking_event])
$past(expression1 [, number_of_ticks] [, expression2] [, clocking_event])

这些函数的使用并没有被限制到断言功能;它们也可以被用作过程化代码中的表达式。时钟控制事件尽管作为函数的一个显式的参数是可选的,但在语义上它是需要的。

时钟控制事件必须被显式地指定成一个参数,或者从它使用的代码中被推断出来。下列规则被用来推断时钟控制事件:

  • 如果使用在一个断言当中,那么使用来自断言的合适的时钟控制事件。
  • 如果使用在一个单一定时断言的动作块中,那么使用断言的时钟。
  • 如果使用在一个过程化块中,那么使用过程化代码的推断时钟(参见17.13.5节)。
否则,会使用缺省时钟控制(参见15.11节)。

当这些函数被使用在一个断言中的时候,函数的时钟控制事件参数(如果指定了的话)应该与断言中表达式的时钟控制事件相同。在多时钟断言的情况下,其中函数被使用的表达式的合适的时钟控制事件被应用到这个函数。

函数$sampled返回与时钟控制事件最后一次发生有关的表达式的采样值。当$sampled在第一个时钟控制事件发生之前被调用的时候,函数会返回X。尽管在断言中使用$sampled函数是被允许的,但它确实多余的,因为函数的结果与在断言中使用的表达式本身的采样值是相同的。

SystemVerilog提供了三个函数来检测采样值的变化:$rose、$fell和$stable。

一个值改变函数检测一个表达式在采样值上的改变。时钟控制事件被用来在当前仿真时间单位之前的一个时钟标记上获取参数表达式的采样值。在这里,当前仿真时间单位指的是函数被计算的仿真时间单位。这个采样值与当前仿真时间单位的prepone时间上决定的表达式的值进行比较。一个值改变表达式的结果是“真”或“假”,并且可以在一个布尔表达式中使用。

如果表达式的最低有效位变为1,那么$rose返回“真”;否则返回“假”。

如果表达式的最低有效位变为0,那么$fell返回“真”;否则返回“假”。

如果表达式的值没有发生变化,那么$stable返回“真”;否则返回“假”。

当这些函数在时钟控制事件的第一个时钟标记上或之前被调用的话,那么通过将表达式当前的采样值与X进行比较来计算结果。

图17-3演示了值改变的两个例子:

  • 值改变表达式e1被定义成$rose(req)
  • 值改变表达式e2被定义成$fell(ack)

图17-3 — 值改变表达式

用来采样变量的时钟标记由特性的时钟衍生而来,它不同于仿真标记。现在,我们假设这个时钟在其它地方定义。因为req的值在时钟标记2处为低而在时钟标记3处为高,所以e1在时钟标记3处出现。类似地,因为ack的值在时钟标记5处采样为高而在时钟标记6处采样为低,因此e2发生在时钟标记6处。

下面的例子演示了$rose在断言之外的SystemVerilog代码中的使用。

always @(posedge clk)
    reg1 <= a & $rose(b);

在这个例子中,时钟控制事件(posedge clk)被应用到$rose。只要b的采样值从时钟控制事件前一个标记上的值改变到1,那么$rose的结果即为“真”。

除了访问值改变外,以前的值可以通过$past函数访问。SystemVerilog为$past函数提供了下面的三个可选的参数:

expression2被用作是时钟控制事件的门表达式;

number_of_ticks指定了过去发生的时钟标记的数目;

clocking_eventexpression1指定了时钟控制事件;

expression1expression2可以是断言中允许使用的任何表达式。

number_of_ticks必须大于或等于1。如果没有指定number_of_ticks,。那么它的缺省值为1。$past函数返回在$past被计算之前的number_of_ticks个时钟标记处表达式的采样值。一个时钟标记基于clocking_event。如果指定的过去的时钟标记在仿真开始之前,那么$past函数的返回值为X。

可选参数clocking_event指定了函数的时钟。clocking_event的使用规则与值改变函数中描述的规则相同。

当不需要两个参数中间的可选参数的时候,必须为每一个被忽略的参数放置一个逗号。例如:

$past(in1, , enable);

在这里指定了一个逗号来忽略number_of_ticks。对于空的number_of_ticks参数,会使用缺省值1。注意,如果想要忽略clocking_event,就不需要放置一个逗号,因为它没有位于指定的参数之间。

$past函数可以用于任何SystemVerilog表达式中,下面的代码就展示了一个这样的例子。

always @(posedge clk)
    reg1 <= a & $past(b);

在这个例子中,时钟控制事件(posedge clk)被应用到$past函数。$past在(posedge clk) 当前发生的时候被计算,并返回(posedge clk)前一次发生时候的采样值。

当指定了expression2的时候,expression1的采样基于expression2的门控时钟。例如,

always @(posedge clk)
    if (enable) q <= d;

always @(posedge clk)
    assert (done |=> (out == $past(q, 2, enable));

在这个例子中,计算$past时q的采样基于下面的时钟控制表达式:

posedge clk iff enable

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文