SystemVerilog Clocking Blocks
默认情况下,模块端口和接口不指定信号之间的任何时序要求或同步方案。在clocking
和endclocking
之间定义的时钟块正是这样做的。它是与特定时钟同步的信号集合,有助于指定时钟和信号之间的定时要求。
这将允许测试编写者更多地关注事务,而不是担心信号何时与时钟交互。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的。 |