Systemverilog中时钟块的使用

时间:2015-10-04 15:06:53

标签: verilog system-verilog

System Verilog中Clocking Blocks的确切用法是什么,它与正常的@(posedge clk)块有什么不同?

我知道的一些差异:

  1. Clocking Block对来自Preponed Region的输入数据进行采样,而在正常的始终阻止中,总是存在竞争条件的可能性。
  2. Clocking Block不可合成,但正常的@(posedge clk)是可合成的。
  3. 尽管如此,我还没有得到Clocking Block的具体用法,如果我提到错误的话,请提供你的输入,并纠正我。

1 个答案:

答案 0 :(得分:7)

虽然我没有对时钟块做过多少工作,但我可以基本了解它们的用途以及与常量块结构的主要区别。

重要的是要注意这些结构是非常不同的,并解决了非常不同的问题。始终块实际上是Verilog的核心,并且是逻辑和寄存器的主要描述符(我有点混在一起always @*always_combalways_latchalways @(posedge clk)和{ {1}}所有这些因为他们都做了类似的事情,但是对于不同的用例和几个细微差别)。因此,always_ff用于描述寄存器,或者更准确地说,描述每次给定信号具有正边沿时要采取的动作(就像FF /寄存器在实际电路中表现一样)。因此,当发生时钟事件时,该块的代码将执行。

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

当你定义一个时钟模块时,你定义了一组信号要与提供的时钟同步并定义了时滞,那么每当你尝试分配输入或从输出读取时,这些信号会自动偏斜给定的数量(因此表现得更加真实)。此外,通过计时,您可以在激励中使用always @(posedge clk)构造并检查块以将事件延迟一定数量的时钟周期(您可以使用##来执行此操作,但是{{1}语法更清晰。最终,时钟模块允许您构建可扩展的测试平台,其中包括同步接口的时序信息(因为时序信息都在时钟模块中)。您可以在此处找到更完整的解释和时钟模块示例: https://www.doulos.com/knowhow/sysverilog/tutorial/clocking/

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

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

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

  2. 由于时钟模块用于定义DUT与其测试平台之间的时序模型(用于同步线路),因此它们确实不具有可窃听性。它们是一个测试平台构造,非常类似于always @(posedge clk)(忽略一些情况),1step,断言和程序。

  3. 要了解有关时钟模块的更多信息,请阅读IEEE1800-2012的第14章。 14.13讨论输入偏差和14.16关于输出偏差的讨论。