那曲檬骨新材料有限公司

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
    +關注

    關注

    1630

    文章

    21796

    瀏覽量

    606012
  • 邏輯電路
    +關注

    關注

    13

    文章

    494

    瀏覽量

    42709
  • 時鐘
    +關注

    關注

    11

    文章

    1746

    瀏覽量

    131801
  • 邏輯設計
    +關注

    關注

    1

    文章

    41

    瀏覽量

    11609
  • Vivado
    +關注

    關注

    19

    文章

    815

    瀏覽量

    66889

原文標題:一鍵獲取邏輯設計中的所有跨時鐘路徑

文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    vivado約束案例:時鐘路徑分析報告

    時鐘路徑分析報告分析從時鐘域(源時鐘)跨越到另
    的頭像 發表于 11-27 11:11 ?5932次閱讀
    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

    Stm32怎么一鍵下載

    文章目錄前言一鍵下載一鍵下載原理硬件原理圖跳帽與啟動存儲映射串口下載程序由來一鍵下載流程通過 USB 控制機器復位握手解讀前言最近在又要折騰 stm32 了,所以翻出了腳落里的開發板,先復習下
    發表于 08-05 08:13

    邏輯設計是什么意思

    偏硬件:接口電路的門組合電路;偏軟件:算法、接口控制器實現的狀態機群或時序電路。隨著邏輯設計的深入,復雜功能設計般基于同步時序電路方式。此時,
    發表于 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 ?5406次閱讀

    成品電路一鍵開關電路

    一鍵開關電路,電路通過了仿真,并已經用于小批量產品
    發表于 03-09 15:11 ?24次下載

    PLC一鍵啟停不同方式的程序編寫

    采用位邏輯指令結合PLC工作原理實現一鍵啟停的程序編寫。 怎樣才能開始掌握PLC一鍵啟停不同方式的程序編寫呢?
    發表于 03-14 11:39 ?1357次閱讀

    一鍵開關電路的好處?生活一鍵開關電路有哪些?

    一鍵開關電路的好處?生活一鍵開關電路有哪些? 一鍵開關電路是指個電路設計,可以用個按鈕或
    的頭像 發表于 10-22 15:18 ?2407次閱讀

    變電站一鍵順控系統和開關柜一鍵順控有區別嗎?

    變電站一鍵順控系統和開關柜一鍵順控技術雖然都涉及到“一鍵順控”的概念,但它們在應用范圍和具體實現上有所不同,因此變電站一鍵順控系統和開關柜一鍵
    的頭像 發表于 07-31 13:34 ?688次閱讀
    變電站<b class='flag-5'>一鍵</b>順控系統和開關柜<b class='flag-5'>一鍵</b>順控有區別嗎?

    一鍵斷電開關的種類有哪些

    內部的小電流控制大電流,達到弱電控制強電的目的。 特點 :快速、安全,能夠切斷所有連接的電源,適合需要快速切斷電源的場景。 應用場景 :家庭、辦公室、工廠等需要一鍵控制多個電源的場景。 2. 智能開關式一鍵斷電 定義 :隨著智能
    的頭像 發表于 09-13 16:45 ?1399次閱讀
    全讯网开奖结果| 网上百家乐官网赌钱| 皇冠网足球开户| 扑克百家乐麻将筹码防伪| 威尼斯人娱乐城排名| 海威百家乐赌博机| 百家乐二游戏机| 赌百家乐官网的体会| 澳门百家乐官网赢钱秘诀| 百家乐官网视频网络游戏| 优博百家乐娱乐城| 澳门百家乐免费开户| 百家乐官网手机壳| 百家乐最好的投注方法| 百家乐客户端皇冠| 折式百家乐赌台| 百家乐的玩法视频| 百家乐游戏机博彩正网| 网络百家乐免费试玩| 真人百家乐平台排行| 免佣百家乐的玩法| 百家乐打揽法| 百家乐游戏开户网址| 金字塔百家乐的玩法技巧和规则 | 易赢百家乐官网软件| 川宜百家乐官网软件| 百家乐官网桌14人| 百家乐官网路子技巧| 百家乐官网技巧玩法技巧| 百家乐星级游戏| 至尊百家乐奇热| 圣保罗百家乐的玩法技巧和规则| 大发888客户端de 软件| 大发888娱乐平台| 彩票游戏| 澳门百家乐官网赢钱技术| 闲和庄百家乐官网娱乐| 绥德县| 找真人百家乐官网的玩法技巧和规则| 韦德娱乐| 大发麻将|