返回介绍

8.10 事件控制

发布于 2020-09-09 22:55:48 字数 2156 浏览 1110 评论 0 收藏 0

delay_or_event_control ::=             // 引用自附录A.6.5
    delay_control
  | event_control
  | repeat (expression) event_control

delay_control ::=
    #delay_value
  | #(mintypmax_expression)

event_control ::=
    @hierarchical_event_identifier
  | @(event_expression)
  | @*
  | @(*)
  | @sequence_instance

event_expression ::=
    [edge_identifier] expression [iff expression]
  | sequence_instance [iff expression]
  | event_expression or event_expression
  | event_expression , event_expression

edge_identifier ::= posedge | negedge  // 引用自附录A.7.4

语法 8-9—时延与事件控制语法(摘录自附录A)

像Verilog一样,一个变量或线网的任何变化都可以使用@事件控制检测到。如果表达式的计算结果多于一位,那么结果中的任何一位发生变化(包括X到Z的变化)均会触发事件控制。

SystemVerilog为@事件控制加入了一个iff限定符。

module latch (output logic [31:0] y, input [31:0] a, input enable);
    always @(a iff enable == 1)
        y <= a; // latch处于透明模式
endmodule

事件表达式仅仅在iff之后的表达式为“真”时才会触发,在上面的例子中就是enable等于1的情况。注意:这个表达式只有在a发生变化时计算,而不是enable发生变化的时候。还需要注意:iff比or具有更高的优先级。我们可以使用圆括号使这层含义更加清晰。

如果变量不是一个四态类型,那么posedge和negedge分别指的是从0和到0的跃变。

如果这个表达式表示一个时钟控制块的输入或双向端口(参见第十五章),那么事件控制操作符使用同步的值,也就是时钟控制事件采样的值。表达式也可以表示一个由时钟控制事件触发的时钟控制块的名字(没有沿限定符)。

与事件控制一起使用的变量可以是任意integral数据类型(参见3.3.1节)或者是字符串。这个变量可以是一个简单的变量也可以是ref自变量(通过引用传递的变量);它可以是上述类型的数组、联合数组、或对象(类实例)的成员。

事件表达式必须返回单一值。如果表达式能够缩减到一个单一值,集合类型也可以使用在表达式中。对象成员或集合元素可以是任意类型,只要表达式的结果是一个单一值。

如果事件表达式一个简单对象句柄的引用或者是chandel变量,那么当对变量的写不等于它的前一个值的时候会产生一个事件。

一个对象的非虚拟方法以及一个集合类型的内建方法或系统函数允许使用在事件控制表达式中,只要返回值是单一值并且方法被定义成一个函数而不是一个任务。

改变由一个方法或函数引用的对象数据成员、集合元素的值,或者动态尺寸数组的尺寸会引起事件表达式被重新计算。当改变值或尺寸的时候,一个具体的实现可以引起事件表达式被重新计算,即使这些成员没有被方法或函数引用。

real AOR[];     // real类型的动态数组
byte stream[$]; // byte类型的队列
initial wait(AOR.size() > 0) ....;   // 等待数组被分配
initial wait($bits(stream) > 60)...; // 等待stram中总的位数大于60

Packet p = new; // Packet 1
Packet q = new; // Packet 2

initial fork
    @(p.status); // 等待Packet 1中的status发生变化
    @q;          // 等待q的变化
    #10 q = p;   // triggers @q.
    // @(p.status) now waits for status in Packet 2 to change,
    // if not already different from Packet 1
join

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

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

发布评论

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