Kar*_*hah 4 verilog system-verilog
System Verilog中Clocking Blocks的确切用法是什么?它与正常的@(posedge clk)块有什么不同?
一些差异,我知道:
尽管如此,我还没有得到Clocking Block的具体用法,如果我提到错误的话,请提供你的输入,并纠正我.
虽然我没有对时钟块做过多少工作,但我可以基本了解它们的目的以及与always块结构的主要区别.
重要的是要注意这些结构是非常不同的并且解决了非常不同的问题.always块是真正的Verilog的心脏,并作为逻辑和寄存器的主描述符(IM样混为一谈的always @*,always_comb,always_latch,always @(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和测试平台之间的同步接口的时序.
因此,您在问题中进行的直接比较并不合适.但是直接回答你的问题:
时钟块在由输入偏移定义的时间步长的延迟区域(即,时钟事件之前的偏斜时间)中对其输入进行采样.默认情况下1step,样本在时钟事件之前的上一步骤的延迟区域中完成(就值的当前步骤的预定区域而言).在时钟事件之后,输出在ReNBA区域偏移时间步骤中被驱动(默认偏移为0,因此输出在与时钟事件相同的时间步长的ReNBA中被驱动).
由于时钟模块用于定义DUT与其测试平台之间的时序模型(用于同步线路),因此它们确实不具有可窃听性.它们是一个测试平台构造,非常类似于initial(忽略一些情况)final,断言和程序.
要了解有关时钟模块的更多信息,请阅读IEEE1800-2012的第14章.14.13讨论输入偏差和14.16关于输出偏差的讨论.