Systemverilog中时钟块的使用

Systemverilog中时钟块的使用,verilog,system-verilog,Verilog,System Verilog,系统Verilog中时钟块的确切用途是什么?它与普通的always@(posedge clk)块有何不同 我知道有些不同: 时钟块从预先定义的区域采样输入数据,而在正常的always块中,总是存在竞争条件的机会 时钟块不可合成,但normal always@(posedge clk)可合成 尽管如此,我仍然不了解时钟块的具体用法,因此,如果我提到了一些错误,请给出您的输入,并纠正我。虽然我对时钟块做得不多,但我可以提供它们的用途以及与always Block构造的主要区别的基本理解 需要注意的是

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

我知道有些不同:

  • 时钟块从预先定义的区域采样输入数据,而在正常的always块中,总是存在竞争条件的机会
  • 时钟块不可合成,但normal always@(posedge clk)可合成

  • 尽管如此,我仍然不了解时钟块的具体用法,因此,如果我提到了一些错误,请给出您的输入,并纠正我。

    虽然我对时钟块做得不多,但我可以提供它们的用途以及与always Block构造的主要区别的基本理解

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

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

    当您定义时钟块时,您正在定义一组信号,这些信号将以定义的偏差与所提供的时钟同步,因此,无论何时尝试分配输入或从输出读取,这些信号都会自动按给定的量进行偏差(从而以更现实的方式表现)。此外,通过时钟,您可以在刺激和检查块中使用
    ##
    构造将事件延迟一定数量的时钟周期(确实,您可以使用
    @(posedge clk)
    可以做到这一点,但是
    语法更简洁。最终,时钟块允许您构建包含同步接口计时信息的可伸缩测试台(因为计时信息都在时钟块中)。您可以在这里找到时钟块的更完整解释和示例:

    重要的收获如下:
    always@(posedge clk)
    和时钟块之间的区别在于前者描述寄存器,后者描述DUT和测试台之间同步接口的定时

    因此,您在问题中进行的直接比较并不恰当。但是,要直接回答您的问题:

  • 时钟块在由输入偏差定义的时间步长的延迟区域(即,时钟事件前的偏差时间)对其输入进行采样。由于默认值为
    1step
    ,因此在时钟事件前的前一步的延迟区域进行采样(在值方面与当前步骤的前置区域相同)。输出在时钟事件后的伦巴区域倾斜时间步中驱动(默认倾斜为0,因此输出在与时钟事件相同时间步的伦巴中驱动)

  • 由于时钟模块用于定义DUT及其测试台之间的时序模型(用于同步线),因此它们确实不可设计。它们是测试台结构,非常类似于
    初始
    (忽略少数情况)、
    最终
    、断言和程序


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

    因此,据我所知,偏差是时钟块和正常始终块之间的一个主要区别。如果可能的话,你能给我一些关于这些偏差如何有助于同步DUT&Te的示例吗stbench还是在其他方面?@MaheshShah时钟块中的偏差允许测试台更好地模拟其自身和DUT之间的真实接口。因此,时钟块的存在实际上是为了消除测试台中模拟偏差所需的繁重且不可缩放的代码。例如,在为sequ编写teshbench时在整体设计中,您可以定义一个时钟模块,该模块将自动处理通过给定偏差延迟测试台输出以及通过特定偏差在时钟之前采样输入。这些偏差允许测试台更好地模拟DUT的源。即,在实际系统中,设计的输入(模拟中TB的输出)将延迟一定的偏差,您设计的输出应在时钟前准备好一定的偏差(TB的输入)。这些是电路的设置和保持时间。时钟模块允许您很好地模拟这些时间。请参阅我给出的链接中的第一个示例,以了解这方面的真实演示。因此,我从这些示例中了解到,使用时钟模块主要是为了减少测试中的计时工作