0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一键获取逻辑设计中的所有跨时钟路径

Spinal FPGA 来源:Spinal FPGA 2023-09-15 14:06 次阅读

编 者 按

之前在玩FPGA时,对于一个系统工程,当逻辑电路设计完成之后,一般会先拿给Vivado/Quartus先去跑一般综合,然后去获取所有的跨时钟路径,在ASIC里,基本也是拿EDA工具去分析获取。今儿个搞个小demo,看在SpinalHDL当设计做完后,如何一键提取整个工程里所有的跨时钟路径。

这个Demo会依赖spinal.lib.tools.DataAnalyzer,此次测试在1.9.3版本上进行。

获取跨时钟路径

得益于SpinalHDL对时钟域严格的划分,在SpinalHDL中,如果存在跨时钟域,那么必须显示的添加Tag进行标示,否则在生成电路时将会直接报错。以BufferCC为例:

class BufferCC[T <: Data](val dataType: T, init : => T, val bufferDepth: Option[Int], val randBoot : Boolean = false) extends Component {
def getInit() : T = init
val finalBufferDepth = BufferCC.defaultDepthOptioned(ClockDomain.current, bufferDepth)
assert(finalBufferDepth >= 1)

val io = newBundle {
val dataIn = in(cloneOf(dataType))
val dataOut = out(cloneOf(dataType))
}

val buffers= Vec(Reg(dataType, init),finalBufferDepth)
if(randBoot) buffers.foreach(_.randBoot())

buffers(0) := io.dataIn
buffers(0).addTag(crossClockDomain)
for(i <- 1until finalBufferDepth) {
buffers(i) := buffers(i - 1)
buffers(i).addTag(crossClockBuffer)
}

io.dataOut := buffers.last
}


因为是跨时钟域,所以buffers(0)必须添加Tag标签crossClockDomain,那么基于此,我们完全可以找出整个工程里的所有跨时钟路径的源节点,目的节点。


下面给出一个demo:

importspinal.core._
importspinal.lib._
importspinal.lib.tools.DataAnalyzer

importscala.collection.mutable.ArrayBuffer

object Test extendsApp {
def getCrossClockFanIn(signal: BaseType, clockDomain: ClockDomain): ArrayBuffer[BaseType] = {
val signalList = ArrayBuffer[BaseType]()
for(srcSignal <- DataAnalyzer.toAnalyzer(signal).getFanIn) {
      if(srcSignal.isReg) {
if(srcSignal.clockDomain != clockDomain) {
signalList.append(srcSignal)
}
} else{
signalList ++= getCrossClockFanIn(srcSignal, clockDomain)
}
}
signalList
}

def reportCrossClockSignal(toplevel: Component) = {
toplevel.walkComponents { c=>
c.dslBody.walkDeclarations {
casesignal: BaseType=>{
if(signal.hasTag(crossClockDomain)) {
val fanInRegList = getCrossClockFanIn(signal, signal.clockDomain)
for(reg <- fanInRegList) {
              println(s"src reg:${reg.getDisplayName()}	 hierarchy:${reg.component.getPath(".")} src clock:${reg.clockDomain.clock.getDisplayName()}	dst reg:${signal.getDisplayName}	hierarchy:${signal.component.getPath(".")} dst clock:${signal.clockDomain.clock.getDisplayName()}")
}
}
}
case_ =>
}
}
}

val report = SpinalSystemVerilog(newStreamFifoCC[UInt](UInt(8bits), 512, ClockDomain.external("clka"), ClockDomain.external("clkb")))
reportCrossClockSignal(report.toplevel)

val report1 = SpinalSystemVerilog(newStreamCCByToggle[Stream[UInt]](Stream(UInt(8bits)), ClockDomain.external("clka"), ClockDomain.external("clkb")))
reportCrossClockSignal(report1.toplevel)
}


在这个Demo中,采用了StreamFifoCC以及StreamCCByToggle来做演示。两个模块的跨时钟域路径分析结果如下:

StreamFifoCC

srcreg:popCC_ptrToPushhierarchy:toplevelsrcclock:clkb_clkdstreg:buffers_0hierarchy:toplevel.popToPushGray_bufferccdstclock:clka_clk
srcreg:pushCC_pushPtrGrayhierarchy:toplevelsrcclock:clka_clkdstreg:buffers_0hierarchy:toplevel.pushToPopGray_bufferccdstclock:clkb_clk


StreamCCByToggle

srcreg:pushArea_data_validhierarchy:toplevelsrcclock:clka_clkdstreg:popArea_stream_rData_validhierarchy:topleveldstclock:clkb_clk
srcreg:pushArea_data_readyhierarchy:toplevelsrcclock:clka_clkdstreg:popArea_stream_rData_readyhierarchy:topleveldstclock:clkb_clk
srcreg:pushArea_data_payloadhierarchy:toplevelsrcclock:clka_clkdstreg:popArea_stream_rData_payloadhierarchy:topleveldstclock:clkb_clk
srcreg:popArea_hithierarchy:toplevelsrcclock:clkb_clkdstreg:buffers_0hierarchy:toplevel.outHitSignal_bufferccdstclock:clka_clk
srcreg:pushArea_targethierarchy:toplevelsrcclock:clka_clkdstreg:buffers_0hierarchy:toplevel.pushArea_target_bufferccdstclock:clkb_clk

完全符合预期~

getCrossClockFanIn

该函数的作用用于针对指定信号其所有的扇入驱动中不在一个时钟域的寄存器。输入参数有两个:

  • signal:待搜索信号

  • clockDomain:signal信号对应的时钟域

    这里面存在一个递归调用,通过调用DataAnalyzer中的getFanIn,获取signal信号的所有扇入,对于其扇入信号类型,存在以下三种情况:

  • 扇入类型为寄存器,和signal不属于同一个时钟域,那么将信号添加到匹配列表中

  • 扇入类型为寄存器,但和signal属于同一个时钟域,则不做任何处理

  • 扇入类型为非寄存器,那么递归调用getCrossClockFanIn进一步搜索

reportCrossClockSignal

该函数的作用是对于传入的toplevel模块,会便利搜索其中所有带有crossClockDomain标签的信号,通过调用getCrossClockFanIn进一步得到其相应的跨时钟域路径。在得到跨时钟域路径后,这里仅做了信息打印,读者有需要可自行扩展,比如生成针对单bit信号的约束,对于多比特信号的约束等。

写在最后

这里仅能针对SpinalHDL代码中的电路进行分析。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1634

    文章

    21830

    浏览量

    607971
  • 逻辑电路
    +关注

    关注

    13

    文章

    495

    浏览量

    42824
  • 时钟
    +关注

    关注

    11

    文章

    1756

    浏览量

    132121
  • 逻辑设计
    +关注

    关注

    1

    文章

    41

    浏览量

    11655
  • Vivado
    +关注

    关注

    19

    文章

    819

    浏览量

    67187

原文标题:一键获取逻辑设计中的所有跨时钟路径

文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    vivado约束案例:时钟路径分析报告

    时钟路径分析报告分析从时钟域(源时钟)跨越到另
    的头像 发表于 11-27 11:11 5988次阅读
    vivado约束案例:<b class='flag-5'>跨</b><b class='flag-5'>时钟</b>域<b class='flag-5'>路径</b>分析报告

    方便快捷:PADS的一键快捷功能:一键灌铜,一键检查DRC

    倾情奉献给大家,非常实用的快捷功能一键灌铜: [hide] [/hide]一键检查连通性:[hide][/hide]一键检查安全间距::[hide] [/hide]一键清除Error标
    发表于 11-07 15:06

    电信一键免流量软件电信一键免流软件app

    ,独家年技术完成开发的,经过测试,全国使用没有地区限制,全免支持所有软件完全免流量,该软件采用一键免流模式,简单方便,真正的一键免流!
    发表于 07-19 10:37

    proteus汉化软件 一键汉化

    ` 本帖最后由 电子工程师2014 于 2016-8-21 18:34 编辑 proteus汉化软件一键汉化选好安装路径一键汉化`
    发表于 08-21 13:51

    逻辑设计是什么意思

    偏硬件:接口电路的门组合电路;偏软件:算法、接口控制器实现的状态机群或时序电路。随着逻辑设计的深入,复杂功能设计般基于同步时序电路方式。此时,
    发表于 11-10 06:39

    stm32的ISP一键下载的原理是什么

    三种工作模式boot 0boot 1启动方式0X内部FLASH10系统存储器11内部SRAM ISP一键下载电路上面的图1是正点原子精英版的ISP一键下载原理图,图2是mcuisp烧录软件。先看图2我标出来的序号1
    发表于 01-27 07:04

    规模集成时序逻辑设计

    规模集成时序逻辑设计:计数器:在数字逻辑系统,使用最多的时序电路要算计数器了。它是种对输入脉冲信号进行计数的时序
    发表于 09-01 09:09 13次下载

    组合逻辑设计实例_国外

    组合逻辑设计实例_国外:
    发表于 12-16 15:08 24次下载
    组合<b class='flag-5'>逻辑设计</b>实例_国外

    Java如何获取文件的路径

    Java 开发我们经常要获取文件的路径,比如读取配置文件等等。今天我们就关于文件的路径和如何读取文件简单地探讨下。
    的头像 发表于 02-22 15:03 5444次阅读

    成品电路一键开关电路

    一键开关电路,电路通过了仿真,并已经用于小批量产品
    发表于 03-09 15:11 24次下载

    PLC一键启停不同方式的程序编写

    采用位逻辑指令结合PLC工作原理实现一键启停的程序编写。 怎样才能开始掌握PLC一键启停不同方式的程序编写呢?
    发表于 03-14 11:39 1392次阅读

    一键开关电路的好处?生活一键开关电路有哪些?

    一键开关电路的好处?生活一键开关电路有哪些? 一键开关电路是指个电路设计,可以用个按钮或
    的头像 发表于 10-22 15:18 2515次阅读

    变电站一键顺控系统和开关柜一键顺控有区别吗?

    变电站一键顺控系统和开关柜一键顺控技术虽然都涉及到“一键顺控”的概念,但它们在应用范围和具体实现上有所不同,因此变电站一键顺控系统和开关柜一键
    的头像 发表于 07-31 13:34 770次阅读
    变电站<b class='flag-5'>一键</b>顺控系统和开关柜<b class='flag-5'>一键</b>顺控有区别吗?

    一键断电开关的种类有哪些

    内部的小电流控制大电流,达到弱电控制强电的目的。 特点 :快速、安全,能够切断所有连接的电源,适合需要快速切断电源的场景。 应用场景 :家庭、办公室、工厂等需要一键控制多个电源的场景。 2. 智能开关式一键断电 定义 :随着智能
    的头像 发表于 09-13 16:45 1695次阅读

    开关柜一键顺控在一键停电、一键送电的作用

    蜀瑞创新为大家科普,开关柜一键顺控技术在一键停电和一键送电中发挥了快速响应、减少人为错误、提高安全性、简化操作流程、降低操作风险、提高送电成功率等综合优势,对于提升电力系统的运行效率、安全性以及自动化水平具有重要意义。
    的头像 发表于 02-27 09:13 92次阅读