返回介绍

17.6 声明序列

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

一个序列可以在下列单元中声明:

  • 一个模块
  • 一个接口
  • 一个程序
  • 一个时钟控制块
  • 一个包
  • 一个编译单元的作用范围
序列使用下列的语法进行声明:

concurrent_assertion_item_declaration ::=       // 引用自附录A.2.10
    ...
  | sequence_declaration

sequence_declaration ::=
    sequence sequence_identifier[([list_of_formals])];
        {assertion_variable_declaration}
        sequence_expr;
    endsequence [: sequence_identifier]

sequence_instance ::=
    ps_sequence_identifier [([actual_arg_list])]

actual_arg_list ::=
    actual_arg_expr {, actual_arg_expr}
  | .formal_identifier(actual_arg_expr){, .formal_identifier(actual_arg_expr)}

actual_arg_expr ::=
    event_expression
  | $

assertion_variable_declaration ::=
    data_type list_of_variable_identifiers;

语法17-4 — 序列声明语法(摘录自附录A)

clocking_event为序列指定了时钟。

一个序列声明可以带有可选的形式参数。当一个序列被实例化的时候,可以将实型参数传递到序列。通过使用实型参数替代形式参数,序列被展开。SystemVerilog会执行语义检查以确保使用真实参数展开的序列是合法的。

一个实型参数可以替代一个:

  • 标识符
  • 表达式
  • 事件控制表达式
  • 标记成$的上限范围
注意,在一个序列中使用,但不是序列形式参数的变量从序列被声明的作用域中根据作用域规则被求解。

sequence s1;
    @(posedge clk) a ##1 b ##1 c;
endsequence

sequence s2;
    @(posedge clk) d ##1 e ##1 f;
endsequence

sequence s3;
    @(negedge clk) g ##1 h ##1 i;
endsequence

在这个例子中,序列s1s2在连续的clk上升沿事件上被计算。序列s3在连续的clk下降沿事件上被计算。

下面是序列声明的另外的一个例子,它包含了参数:

sequence s20_1(data, en);
    (!frame && (data == data_bus)) ##1 (c_be[0:3] == en);
endsequence

序列s20_1没有指定一个时钟。在这个例子中,一个时钟会从某个外部源(例如一个特性或一个断言语句)继承而来。一个序列可以通过它的名字引用。与SystemVerilig命名约定相一致,我们可以使用一个层次化的名字。一个序列可以在一个特性、一条断言语句或者一条覆盖语句中被引用。

为了将一个命名序列当作另外一个序列的子序列使用,我们只需简单地引用它的名字。对于引用一个命名序列的序列的计算来讲,它在执行的时候就好像这个命名序列被包含成引用序列的词法组成部分一样,这个命名序列的形式参数被实形参数所替代并且这个命名序列中剩余的变量根据命名序列声明的作用域来解析。一个例子如下所示:

sequence s;
    a ##1 b ##1 c;
endsequence

sequence rule;
    @(posedge sysclk)
        trans ##1 start_trans ##1 s ##1 end_trans;
endsequence

前一个例子中的序列规则等价于:

sequence rule;
    @(posedge sysclk)
        trans ##1 start_trans ##1 a ##1 b ##1 c ##1 end_trans;
endsequence

序列名字的任何形式的循环依赖都是不允许的。下面的例子演示了一个s1s2以及s2s1的非法的依赖性,因为这个例子产生了一个循环依赖。

sequence s1;
    @(posedge sysclk) (x ##1 s2);
endsequence

sequence s2;
    @(posedge sysclk) (y ##1 s1);
endsequence

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

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

发布评论

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