时钟域

激励函数API

以下是 ClockDomain 激励函数的列表:

时钟域激励函数

描述

forkStimulus(period)

分裂一个仿真进程以生成时钟域激励(时钟、复位、softReset、clockEnable 信号)

forkSimSpeedPrinter(printPeriod)

分裂一个仿真进程,该进程将定期打印每秒实时千周期的仿真速度。 printPeriod 是实时计数的秒数

clockToggle()

翻转时钟信号

fallingEdge()

清除时钟信号

risingEdge()

设置时钟信号

assertReset()

将复位信号设置为有效(电平)

deassertReset()

将复位信号设置为无效(电平)

assertClockEnable()

将时钟使能信号设置为有效(电平)

deassertClockEnable()

将时钟使能信号设置为有效(电平)

assertSoftReset()

将软复位信号设置为有效(电平)

deassertSoftReset()

将软复位信号设置为有效(电平)

等待相关API

以下是 ClockDomain 实用工具函数的列表,您可以用它们来等待来自时钟域的给定事件:

时钟域等待函数

描述

waitSampling([cyclesCount])

等待 ClockDomain 进行采样(有效时钟沿 && 无复位 && 时钟使能)

waitRisingEdge([cyclesCount])

等待cyclesCount个时钟的上升沿;如果没有另外指定,cycleCount 默认为 1 个周期。注意,cyclesCount = 0 是合法的,该功能对复位/softReset/clockEnable 不敏感

waitFallingEdge([cyclesCount])

waitRisingEdge 相同,但针对下降沿

waitActiveEdge([cyclesCount])

waitRisingEdge 相同,但针对 ClockDomainConfig 指定的边沿类型

waitRisingEdgeWhere(condition)

waitRisingEdge 功能相同,但要检查条件,上升沿发生时布尔 condition 必须为真

waitFallingEdgeWhere(condition)

waitRisingEdgeWhere 相同,但针对的是下降沿

waitActiveEdgeWhere(condition)

waitRisingEdgeWhere 相同,但针对 ClockDomainConfig 指定的边沿类型

waitSamplingWhere(condition) : Boolean

等待直到时钟域采样并且给定条件为真

waitSamplingWhere(timeout)(condition) : Boolean

与上面定义的 waitSamplingWhere 相同,但阻塞不会超过timeout个周期。如果退出是因为超时,则返回 true

警告

等待 API 的所有功能只能直接从线程内部调用,而不能从通过回调函数使用(通过回调API调用)。

回调函数API

以下是 ClockDomain 实用工具函数的列表,您可以用它们来等待来自时钟域的给定事件:

时钟域回调函数

描述

onNextSampling { callback }

仅在下一个 ClockDomain 样本上执行一次回调代码(有效边沿+无复位+时钟使能)

onSamplings { callback }

每次 ClockDomain 采样时执行回调代码(有效边沿+无复位+时钟使能)

onActiveEdges { callback }

每次 ClockDomain 时钟符合其配置的边沿的条件时执行回调代码

onEdges { callback }

每次 ClockDomain 时钟出现上升沿或下降沿时执行回调代码

onRisingEdges { callback }

每次 ClockDomain 的时钟出现上升沿时执行回调代码

onFallingEdges { callback }

每次 ClockDomain 中时钟出现下降沿时执行回调代码

onSamplingWhile { callback : Boolean }

与 onSampling 相同,但您可以通过让回调返回 false 来停止它(永远)

默认时钟域

您可以访问顶层模块的默认 ClockDomain ,如下所示:

// Example of thread forking to generate a reset, and then toggling the clock each 5 time units.
// dut.clockDomain refers to the implicit clock domain created during component instantiation.
fork {
  dut.clockDomain.assertReset()
  dut.clockDomain.fallingEdge()
  sleep(10)
  while(true) {
    dut.clockDomain.clockToggle()
    sleep(5)
  }
}

请注意,您还可以直接分裂标准复位/时钟产生进程:

dut.clockDomain.forkStimulus(period = 10)

如何等待时钟上升沿的示例:

dut.clockDomain.waitRisingEdge()

新时钟域

如果您的顶层模块中定义了一些未直接集成到其 ClockDomain 中的时钟和复位,您可以直接在测试平台中定义其相应的 ClockDomain

// In the testbench
ClockDomain(dut.io.coreClk, dut.io.coreReset).forkStimulus(10)