Systemverilog 中时钟块的使用

Usage of Clocking Blocks in Systemverilog

System Verilog 中时钟块的确切用法是什么,它与普通的 always @ (posedge clk) 块有何不同?

我知道的一些差异:

  1. Clocking Block 从 Preponed Region 采样输入数据,而在正常的 always 块中,总是有竞争条件的机会。
  2. Clocking Block 不可综合,但 normal always @(posedge clk) 可综合。

不过,我还是不太了解时钟块的具体用法,所以请提供您的意见,如果我说错了,请指正。

虽然我对时钟块的了解不多,但我可以提供对它们的用途和与 always 块结构的主要区别的基本理解。

重要的是要注意这些结构非常不同并且解决的问题也非常不同。 always 块实际上是 Verilog 的核心,用作逻辑和寄存器的主要描述符(我有点把 always @*always_combalways_latchalways @(posedge clk)always_ff 在一起是因为它们都做类似的事情,尽管用于不同的用例并且有一些细微差别)。因此,always @(posedge clk) 用于描述寄存器,或者更准确地说,描述每次给定信号具有上升沿时要采取的操作(就像 FFs/registers 在实际电路中的行为一样)。因此,当时钟事件发生时,该块的代码将执行。

时钟块用于概括围绕时钟事件的事件计时应该如何表现。在实际电路中,您通常对设计中的每个 FF 都有保持时间和建立时间限制。这些约束规定了电路时钟频率的限制,并且在设计无危险逻辑电路时理解这些约束很重要。然而,在 HDL 代码的仿真中,重新创建这些时序范式可能很烦人且不可扩展,尤其是在处理测试台代码和设计代码之间的同步接口时。因此,SystemVerilog 包括时钟块构造,作为一种为测试台提供一种方法的方法,该方法可以使用定义的时钟轻松定义此类接口的时序,内置偏移和允许测试台中的刺激以更好的方式由时钟定义的构造.

当你定义一个时钟块时,你是在定义一组信号来同步到具有定义偏差的提供的时钟,所以当你尝试分配输入或从输出读取时,这些信号会自动偏差给定量(因此以更现实的方式表现)。此外,对于时钟,您可以在刺激和检查块中使用 ## 构造来将事件延迟一定数量的时钟周期(确实,您可以使用 @(posedge clk); 来做到这一点,但是 ## 语法更简洁。最终,时钟块允许您构建可扩展的测试平台,其中包括同步接口的时序信息(因为时序信息都在时钟块中)。您可以在此处找到更完整的时钟块解释和示例: https://www.doulos.com/knowhow/sysverilog/tutorial/clocking/

重要的要点是: always @(posedge clk) 和时钟块之间的区别在于前者是关于描述寄存器,而后者是关于描述 DUT 和测试平台之间的同步接口的时序。

因此,你在问题中的直接比较是不太合适的。但是直接回答你的问题:

  1. 时钟块在由输入偏移定义的时间步长的延迟区域中对其输入进行采样(即,时钟事件之前的偏移时间)。由于默认值为 1step,样本在计时事件之前的上一步的推迟区域中完成(就值而言,这与当前步骤的推迟区域相同)。输出在时钟事件后的 ReNBA 区域偏移时间步长中驱动(默认偏移为 0,因此输出在与时钟事件相同时间步长的 ReNBA 中驱动)。

  2. 由于时钟块用于定义 DUT 与其测试平台之间的时序模型(用于同步线路),因此它们确实不可合成。它们是一个测试台构造,很像 initial(忽略少数情况)、final、断言和程序。

要了解有关时钟模块的更多信息,请阅读 IEEE1800-2012 的第 14 章。 14.13讲输入偏斜,14.16讲输出偏斜