Title

SystemVerilog -- 6.4 Interface ~ Clocking Blocks

SystemVerilog Clocking Blocks

默认情况下,模块端口和接口不指定信号之间的任何时序要求或同步方案。在clockingendclocking之间定义的时钟块正是这样做的。它是与特定时钟同步的信号集合,有助于指定时钟和信号之间的定时要求。

这将允许测试编写者更多地关注事务,而不是担心信号何时与时钟交互。testbench可以有多个时钟块,但每个时钟只有一个块。

Syntax

[default] clocking [identifier_name] @ [event_or_identifier]
  default input #[delay_or_edge] output #[delay_or_edge]
  [list of signals]
endclocking

delay_value表示要采样或驱动信号的时钟时间的时间单位的偏差。如果未指定偏斜,则将在指定事件后对所有输入信号进行采样并驱动输出符号。default #1step 0ns

clocking ckb @ (posedge clk);
  default input #1step output negedge;
  input  ...;
  output ...;
endclocking

clocking ck1 @ (posedge clk);
  default input #5ns output #2ns;
  input data, valid, ready - top.ele.ready;
  output negedge grant;
  input #1step addr;
endclocking 

请注意以下事项:

  • 创建一个名为ck1的时钟块,该时钟块将在clk的posedge处于活动状态。
  • 默认情况下,时钟模块内的所有输入信号将在时钟clk的posedge之前采样5ns,时钟模块内的所有输出信号将在时钟clk的posedge后驱动2ns。
  • 数据、有效和就绪被声明为模块的输入,因此将在clk的位置之前5ns采样。
  • 授予是模块的输出信号,具有自己的时间要求。在这里,grant将在clk的negedge而不是默认的位置驱动。

Use within an interface

简单来说,时钟块封装了一堆共享一个公共时钟的信号。因此,在接口内声明时钟块有助于节省连接到testbench所需的代码量,并有助于节省开发时间。

时钟块内的信号方向是相对于testbench的而不是DUT的。

posted on 2024-04-27 09:35  松—松  阅读(187)  评论(0编辑  收藏  举报

导航