返回介绍

15.2 时钟控制块声明

发布于 2020-09-09 22:55:52 字数 2753 浏览 1102 评论 0 收藏 0

时钟控制块的声明语法如下:

clocking_declaration ::=              // 引用自附录A.6.11
    [default] clocking [clocking_identifier] clocking_event;
        {clocking_item}
    endclocking [: clocking_identifier]

clocking_event ::=
    @ identifier
  | @ (event_expression)

clocking_item :=
    default default_skew;
  | clocking_direction list_of_clocking_decl_assign;
  | {attribute_instance} concurrent_assertion_item_declaration

default_skew ::=
    input clocking_skew
  | output clocking_skew
  | input clocking_skew output clocking_skew

clocking_direction ::=
    input [clocking_skew]
  | output [clocking_skew]
  | input [clocking_skew] output [clocking_skew]
  | inout

list_of_clocking_decl_assign ::= clocking_decl_assign {, clocking_decl_assign}

clocking_decl_assign ::= signal_identifier [= hierarchical_identifier]

clocking_skew ::=
    edge_identifier [delay_control]
  | delay_control

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

delay_control ::=                                    // 引用自附录A.6.5
    # delay_value
  | # (mintypmax_expression)

语法 15-1—时钟控制块语法(摘录自附录A)

delay_control必须是一个时间文本或者一个可以计算成一个正的整数值的常量表达式。

clocking_identifier了指定所声明的时钟控制块的名字。

signal_identfier标识一个位于包围时钟控制块声明的作用范围内的信号,并且声明了时钟控制块中一个信号的名字。除非使用了一个hierarchical_expression,无论是这个信号还是clocking_item的名字都应该是相同的。

clocking_event指定了一个特定的、作用于时钟控制块时钟的事件。典型情况下,这个表达式是一个时钟信号的上升沿或下降沿。在一个指定的时钟控制块中说明的所有其它信号的时序都由这个时钟事件控制。时钟控制块中所有的输入或双向信号都在对应的时钟事件发生的时候被采样。同样,时钟控制块中所有输出或双向信号都在对应的时钟事件发生的时候被驱动。双向信号(inout)即被驱动也被采样。

clocking_skew确定一个信号离开时钟事件多少个时间单位被采样或驱动。输入时滞隐含是负的,也就是说,它们总是指向时钟之前的一个时间,而输出时滞则总是指向时钟之后的一个时间(参见15.3节)。当时钟时间指定了一个简单的沿而不是一个数值的时候,时滞可以被说明成信号的特定的沿。通过使用一个缺省的时钟控制条目,我们可以为整个块指定单个时滞。

clocking ck1 @(posedge clk);
    default input #1step output negedge; // 合法的
    // 输出在clk的下降沿被驱动
    input ...;
    output ...;
endclocking

clocking ck2 @(clk); // 没有指定沿
    default input #1step output negedge; // 合法的
    input ...;
    output ...;
endclocking

hierarchical_identifier说明与时钟控制块关联的信号由它的层次化名字指定(跨模块引用),而不是一个本地端口。

例子:

clocking bus @(posedge clock1);
    default input #10ns output #2ns;
    input data, ready, enable = top.mem1.enable;
    output negedge ack;
    input #1step addr;
endclocking

在上面的例子中,第一行代码声明了一个称为bus的时钟控制块,它以信号clock1的上升沿进行时钟控制。第二行代码通过default指出:时钟控制块中的所有信号都应该使用一个10ns的输入时滞和一个2ns的输出时滞。下一行代码为时钟控制块加入了三个输入信号:data、ready和enable;最后一个信号指向层次化的信号top.mem1.enable。第四行代码为时钟控制块加入了一个ack信号并过载了缺省的输出时滞从而使ack信号在时钟的下降沿被驱动。最后一行代码加入了addr信号并过载了缺省的输入时滞从而使addr在时钟上升沿之前的一个步值时被采样。

除非另有说明,缺省的输入时滞是1step,缺省的输出时滞是0。一个步值是一个特殊的时间单位,它的值在18.10节中定义。一个1step的输入时滞使得输入信号在时钟信号之前的时间步值中采样它们的稳定值(也就是在前一个Postponed区域)。与其它代表物理单位的时间单位不同,一个step不能被用来设置或修改时间精度或时间单位。

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

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

发布评论

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