时钟域(Clock domains)

一、激励API(Stimulus API)

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

时钟域激励函数 描述
forkStimulus(period) 分化仿真流程来产生时钟域激励(clock, reset, softReset, clockEnable singals)
forkSimSpeedPrinter(printPeriod) 分化仿真流程定期以实时秒数下的千-周期打印仿真速度。printPeriod是实时秒数
clockToggle() 切换时钟信号
fallingEdge() 清空时钟信号
risingEdge() 设置时钟信号
assertReset() 将复位信号设置为有效电平
deassertReset() 将复位信号设置为无效电平
assertClockEnable() 将时钟使能信号设置为有效电平
deassertClockEnable() 将时钟使能信号设置为无效电平
assertSoftReset() 将软复位设置为有效电平
deassertSoftReset() 将软复位信号设置为无效电平

二、等待API(Wait API)

以下是可用于等待时钟域中给定事件的ClockDomain实用程序列表:

时钟域等待函数 描述
waitSampling([cyclesCount]) 一直等待直到ClockDomain采样(active clock edge && deassertReset && assertClockEnable)
waitRisingEdge([cyclesCount]) 等待cyclesCount个时钟上升沿, cyclesCount默认是1周期。注意, cyclesCount=0是合法的, 并且该函数对reset/softReset/clockEnable不敏感
waitFallingEdge([cyclesCount]) waitRisingEdge相同但是针对下降沿
waitActiveEdge([cyclesCount]) waitRisingEdge相同但是针对由ClockDomainConfig指定的边沿
waitRisingEdgeWhere(condition) waitRisingEdge相同但要是退出, 当上升沿触发Booleancondition必须为真
waitFallingEdgeWhere(condition) waitRisingEdgeWhere相同但是针对下降沿
waitActiveEdgeWhere(condition) waitRisingEdgeWhere相同但是针对由ClockDomainConfig指定的边沿

注意:所有的等待API的功能只能从线程内部调用, 不能从传回调用。

三、传回API(Callback API)

以下是可以用于传回时钟域中给定事件的ClockDomain实用程序列表:

时钟域传回函数 描述
onNextSampling{ callback } 只在下一个ClockDomain采样时执行传回代码(active edge + reset off + clock enable on)
onSamplings{ callback } 每次ClockDomain采样时执行传回代码(active edge + reset off + clock enable on)
onActiveEdges{ callback } 每次ClockDomain生成配置边沿时执行传回代码
onEdges{ callback } 每次ClockDomain生成上升或下降边沿时执行传回代码
onRisingEdges{ callback } 每次ClockDomain生成上升边沿时执行传回代码
onFallingEdges{ callback } 每次ClockDomain生成下降边沿时执行传回代码

四、默认时钟域(Default ClockDomain)

你可以如下所示访存顶层的默认ClockDomain

//线程分叉以产生复位的例子, 并且之后每5个单位时间翻转一次时钟。
//dut.clockDomain参考在模块例化期间产生的隐含的时钟域
fork {
  dut.clockDomain.assertReset()
  dut.clockDomain.fallingEdge()
  sleep(10)
  while(true) {
    dut.clockDomain.clockToggle()
    sleep(5)
  }
}

备注:你也可以直接分化一个标准reset/clock进程:

dut.clockDomain.forkStimulus(period = 10)

下例所如何等待时钟上升沿的例子:

dut.clockDomain.waitRisingEdge()

五、新时钟域(New ClockDomain)

如果你顶层定义了一些时钟并且复位输入没有直接集成到ClockDomain中, 你可以直接在testbench中定义他们对应的ClockDomain

//在testbench中
ClockDomain(dut.io.coreClk, dut.io.coreReset).forkStimulus(10)