Microsemi Libero使用技巧6——FPGA全局網絡的設置

在這裏插入圖片描述


系列教程:Microsemi Libero系列教程

前言

剛開始做Microsemi FPGA+SoC開發時,會用到幾個ARM專用的IP Core,功能一複雜起來,就會遇到某些信號如rst_n不能分配到指定的引腳上的情況,IO類型爲CLKBUF,並不是普通的INBUF,而且,這些引腳既不是MSS_FIO,也不是屬於Cortex-M3專用的GPIO,怎麼會就不能分配呢?曾經一度懷疑是軟件的BUG問題。最近在一個FPGA工程中也遇到了這個問題,搜索了一些資料,算是徹底明白了,記錄一下。

問題描述

最近在一個FPGA工程中分配rst_n引腳時,發現rst_n引腳類型爲CLKBUF,而不是常用的INBUF,在分配完引腳commit檢查報錯,提示需要連接到全局網絡引腳上。


Running Global Checker...
Error:PLC002:No legal assignment exists for global net rst.n_c.
Info:Uhlocking the driver or removing the region constraint for net rst nc may help to satisfy 
Error:PLC005:Automat ic global net placement failed.

嘗試忽略這個錯誤,直接進行編譯,在佈局佈線時又報錯。

Error: PLC002: No legal assignment exists for global net rst_n_c.
Error: PLC005: Automatic global net placement failed.
Error: Failure when executing Tcl script. [ Line 18 ]

嘗試取消引腳鎖定LOCK,再次commit檢查成功,編譯下載正常,但是功能不對,再次打開引腳分配界面,發現是rst_n對應的引腳並不是我設置的那個,看來是CLKBUF的原因。

問題分析

網絡上搜索一些資料後,發現是在一些工程中會出現這個問題,如果rst_n信號連接了許多IP核,和很多自己寫的模塊,這樣rst_n就需要很強的驅動能力,即扇出能力(Fan Out),而且佈線會很長,所以在分配管腳時,IDE自動添加了CLKBUF,來提供更大的驅動能力和更小的延時。那麼什麼是FPGA的全局時鐘網絡資源呢?

FPGA全局佈線資源簡介

我們知道FPGA的資源主要由以下幾部分組成:

  • 可編程輸入輸出單元(IOB)
  • 基本可編程邏輯單元(CLB)
  • 數字時鐘管理模塊(DCM)
  • 嵌入塊式RAM(BRAM)
  • 豐富的佈線資源
  • 內嵌專用硬件 模塊。

我們重點介紹佈線資源,FPGA中佈線的長度和工藝決定着信號在的驅動能力和傳輸速度。FPGA的佈線資源可大概分爲4類:

  • 全局佈線資源:芯片內部全局時鐘和全局復位/置位的佈線
  • 長線資源:完成芯片Bank間的高速信號和第二全局時鐘信號的佈線
  • 短線資源:完成基本邏輯單元之間的邏輯互連和佈線
  • 分佈式佈線資源:用於專有時鐘、復位等控制信號線。

一般設計中,我們不需要直接參與佈線資源的分配,IDE中的佈局佈線器(Place and Route)可以根據輸入邏輯網表的拓撲結構,和用戶設定的約束條件來自動的選擇佈線資源。

其中全局佈線資源具有最強的驅動能力和最小的延時,但是隻能限制在全局管腳上,廠商會特殊設計這部分資源,如Xilinx FPGA中的全局時鐘資源一般使用全銅層工藝實現,並設計了專門時鐘緩衝和驅動結構,從而使全局時鐘到達芯片內部的所有可配置邏輯單元(CLB)、I/O單元(IOB)和選擇性塊RAM(Block Select ROM)的時延和抖動都爲最小。

一般全局佈線資源都是針對輸入信號來說的,如果IDE自動把rst_n引腳優化爲了全局網絡,而硬件電路設計上卻把rst_n分配到了普通管腳上,那麼就很麻煩了,要麼犧牲全局網絡的優勢,手動將全局網絡改爲普通網絡,要麼爲了利用全局網絡的優勢,修改電路,重新分配硬件引腳。所以如果一些關鍵的信號確定了,如時鐘、復位等,產品迭代修改電路時,不要輕易調整這些關鍵引腳。

Microsemi FPGA的全局佈線資源

Microsemi FPGA的全局時鐘管腳編號,我們可以通過官方Datasheet來找到,在手冊中關於全局IO的命名規則上,有如下介紹:

即只有管腳名稱爲GFA0/1/2,GFB0/1/2,GFC0/1/2,GCA0/1/2,GCB0/1/2,GCC0/1/2(共18個)才支持全局網絡分配,而且,如果使用了GFA0引腳作爲全局輸入引腳,那麼GFA1和GFA2都不能再作爲全局網絡了,其他GFC等同理,這一點在設計電路時要特別注意。

對於Microsemi SmartFusion系列FPGA芯片A2F200M3F-PQ208來說,只有7個,分別是:GFA0-15、GFA1-14、GFA2-13、GCA0-145、GCA1-146、GCC2-151、GCA2-153,引腳分配如下圖所示:

所以在設計A2F200M3F-PQ208硬件電路時,時鐘和復位信號儘量分配在這些管腳上,以獲得硬件性能的最大效率。

這些全局引腳的延時時間都是非常小的,具體的時間參數可以從數據手冊上獲得。

全局網絡改爲普通輸入

像文章開頭介紹的情況,IDE自動把rst_n設置爲全局網絡,而實際硬件卻不是全局引腳,應該怎麼修改爲普通輸入呢?即CLKBUF改爲普通的INBUF?網絡上zlg的教程中使用的是版本較低的Libero IDE 8.0,新版的Libero SoC改動非常大,文中介紹的修改sdc文件的方法已經不能使用了,這裏提供新的修改方法——調用INBUF IP Core的方式。

這裏官方已經考慮到了,在官方提供的INBUF IP Core可以把CLKBUF改爲INBUF。

在Catalog搜索框中輸入:INBUF,可以看到這裏也提供了LVDS信號專用的IP Core。

拖動到SmartDesign中進行連接

或者在源文件中直接例化的方式調用INBUF Core:

INBUF INBUF_0(
        // Inputs
        .PAD ( rst_n ),	
        // Outputs
        .Y   ( rst_n_Y ) 
        );

這兩種方法都是一樣的。添加完成之後,再進行管腳分配,可以看到rst_n已經是普通的INBUF類型了,可以進行普通管腳的分配,而且commit檢查也是沒有錯誤的。

普通輸入上全局網絡

如果佈局佈線器沒有把我們要的信號上全局網絡,如本工程的CLK信號,IDE自動生成的是INBUF類型,我們想讓他變成CLKBUF,即全局網絡,來獲取最大的驅動能力和最小的延時。那麼應該怎麼辦呢?

這裏同樣要使用到一個IP Core,和INBUF類似,這個IP Core的名稱是CLKBUF,同樣是在Catalog目錄中搜索:CLKBUF,可以看到有CLKBUF開頭的很多Core,這裏同樣也提供了LVDS信號專用的IP Core。

可以直接拖動Core到SmartDesign圖形編輯窗口:

或者是在源文件中以直接例化的方式調用:

CLKBUF CLKBUF_0(
        // Inputs
        .PAD ( CLKA ),
        // Outputs
        .Y   ( CLKA_Y ) 
        );

這兩種方式都是一樣的,添加完成之後,再進行管腳分配,可以看到CLKA已經是全局網絡了,只能分配在全局管腳上。

總結

對於不同廠家的FPGA,讓某個信號上全局網絡的方法都不盡相同,如Xilinx的FPGA是通過BUFG Core來讓信號上全局網絡,而且還有帶使能端的全局緩衝 BUFGCE , BUFGMUX 的應用更爲靈活,有2個輸入,可通過選擇端選擇輸出哪一個。所以,信號的全局緩衝設置要根據不同廠商Core的不同來使用。

推薦閱讀


在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章