Systemverilog中时钟块的使用

问题描述 投票:4回答:1

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

一些差异,我知道:

  1. Clocking Block对来自Preponed Region的输入数据进行采样,而在正常的始终阻塞中,始终存在竞争条件的可能性。
  2. 时钟块不可合成,但正常的@(posedge clk)是可合成的。

尽管如此,我还没有得到Clocking Block的具体用法,如果我提到错误的话,请提供你的输入,并纠正我。

verilog system-verilog
1个回答
7
投票

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

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

时钟块用于概括时钟事件周围事件的时序应如何表现。在实际电路中,通常对设计中的每个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关于输出偏差的讨论。

© www.soinside.com 2019 - 2024. All rights reserved.