利用動態 SDC 限制簡化設計重複使用

author-image

作者

當您建立可在許多設計中重用的設計區塊或 HDL 元件時,可能需要建立 SDC 限制才能搭配使用。建立不需要設計者重新使用元件編輯的限制是十分有用的。限制應該是一般性的,因此無論區塊在設計階層中是即時化的,還是動態的,無論設計區塊如何連接,它們都能運作。如果必須手動編輯限制以反映設計變更,如果設計者進行設計變更而不更新限制,這些限制就會變得無法同步。

此設計範例涵蓋建立動態 SDC 限制以解決下列兩個問題的技術:

  • 確定直接連接到低階模組的頂級 I/O 名稱
  • 在低階模組中,根據邏輯建立產生的頻率

圖 1 中的圖表顯示此範例的簡單設計。其中包括兩個以reusable_block命名的可重複使用設計區塊的實例,以黃色顯示。圖 2 顯示reusable_block設計的內容。reusable_block可作為兩倍資料速率頻率,用於來源同步輸出匯流排。其輸出必須連接到最高層級的輸出。reusable_block的限制必須包括產生的頻率,因為輸出功能為來源同步頻率。

圖 1。設計範例的範例電路。

圖 2。reusable_block的內容。

判斷最高層級 I/O 名稱

reusable_block的限制必須適應最高層級 I/O 名稱的變更。因此,最高層級的 I/O 名稱必須在編譯或計時分析期間確定。get_fanouts Tcl 命令會退回一系列 ID,這些 ID 代表是特定名稱扇出的埠或收銀機。get_fanouts Tcl 指令使用編譯或計時分析期間存在的計時網路清單,因此無論風扇的節點名稱為何,都會動態判斷連線能力。下列 Tcl 代碼顯示如何使用get_fanouts取得直接扇出低階收銀機的頂層輸出。

foreach_in_collection fanout_id [get_fanouts $low_level_register_name] { break ®
set top_level_io_name [get_node_info -name $fanout_id]

低階收銀機的完整階層名稱不必為人所知,因為您可以使用可重複使用的設計區塊中的萬用字元和已知的階層級部分來搭配它。此頁面上的最後一個代碼範例顯示如何與低階註冊機名稱相符的範例。

在 圖 1 的設計中,低階模組輸出針腳直接連接到一個頂級輸出。以下的 Tcl 代碼增加了錯誤檢查,以確保低階的收銀機風扇僅有一個位置,而風扇輸出位置則是輸出埠。此 Tcl 代碼應是限制reusable_block的 SDC 檔案的一部分。

# 取得低階收銀機組的風扇出入
fanout_collection [get_fanouts $low_level_register_name]

# 請確保只有一個風扇組num_fanouts
[get_collection_size $fanout_collection],如果 {
1 != $num_fanouts { 返回
    -代碼錯誤「$low_level_register_name 風扇$num_風扇輸出 \
        節點,但必須扇出一個
。」

# 取得風扇輸出節點的名稱
foreach_in_collection fanout_id $fanout_collection { break {
set fanout_name [get_node_info-name $fanout_id] #

如果 { [捕捉 { get_port_info - is_output_port $fanout_id] ,請確保風扇輸出節點是輸出埠
[ is_output] \ \
    出現錯誤 - 它不會扇出到埠
    退貨 - 代碼錯誤 「$low_level_register_name 風扇到 $fanout_name \
        這不是埠」
\ elseif { ! $is_輸出 \
    \ # 沒有錯誤,但埠不是輸出埠
    退貨-代碼錯誤「$fanout_name 不是輸出埠

」low_level_register_name top_level_io_name top_level_io_name $fanout。

建立產生的頻率

來源同步輸出頻率必須根據提供雙倍資料速率輸出記錄器的頻率來定義為產生的頻率。所產生的頻率必須在設計中沒有任何手動輸入的頻率資訊的情況下建立,因為設計區塊可以在任何設計中使用任何計時方案進行即時化。

以下 SDC 指令顯示一個簡單的方法,在無法知曉階層中的位置時,為圖 1 中的設計建立來源同步輸出頻率的產生頻率。

create_generated_clock──姓名 reusable_generated──來源 [get_pins
    |reusable_block_clock_out|altddio_out_component|auto_generated|ddio_outa[0]|muxsel] \
    $top_level_io_name

這是一種簡單明瞭的方法,可在設計層級的任何地方對reusable_block進行單一即時化,但它無法處理多個即時或多頻情況。當計時方案未知時,產生的頻率限制應能夠處理在傳送設計區塊的單一頻率訊號上定義多個頻率的情況。支援不同 I/O 通訊協定速度的設計,或是支援頻率切換以進行備援的設計中,單一頻率訊號上的多個頻率通常存在。上述簡單產生的頻率範例會在多頻情況下失效,因為它不包括可區別多個來源頻率的 -master_clock選項。

若要處理多個即時,請使用迴圈為每一次即時建立獨特的產生頻率。若要處理多頻情況,請使用名為 get_clocks_driving_pin 的自訂程式,該程式在 「供貨針腳 」設計範例中的頻率中描述。若要使用自訂程式,您必須從 「頻率餵食針腳 」設計範例頁面複製。您可以將其儲存為新增到專案中的個別 SDC 檔案,或複製並貼在一個 SDC 檔案中,並附上所有其他限制可重複使用的區塊的限制。如果您將其儲存為新增到專案的 SDC 檔案,請確保它已列在任何使用get_clocks_driving_pin自訂程式的 SDC 檔案前。

下列 Tcl 代碼顯示如何在 圖 1 所示的設計中,建立由低階收銀機驅動的頂層輸出產生的頻率限制。產生的頻率會以最高層級的輸出作為目標,而altddio_output的 muxsel 針腳會作為來源。代碼使用迴圈來反覆運算設計中所有reusable_block的即時性,以及一個嵌入式迴圈,以get_clocks_driving_pin自訂程式處理多頻情況。它假設get_clocks_driving_pin程式已經定義。

# get_pins退回每一個reusable_block即時化的 muxsel 針腳 # foreach_in_collection迭在每一
個 muxsel 針
腳foreach_in_collection pin_id [get_pins-compatibility_mode \
    *|reusable_block_clock_out|altddio_out_component|auto_generated|ddio_outa[0]|muxsel] {

    # pin_name具有 muxsel 針腳的完整設計階層,reusable_block
    一組pin_name [get_node_info-name $pin_id]
    
    # 使用上面顯示的代碼,無需錯誤檢查,即可取得
    最高層級輸出
    的名稱foreach_in_collection port_id [get_fanouts $pin_name] { break { 設定
    port_name [get_node_info-name $port_id] # 可能會
    
    有多個頻率喂送altddio_output註冊
    器 #每個產生
    #muxsel 針腳的頻率需要一個產生的頻率。每個喂 muxsel 針腳的頻率都是主時鐘。
    foreach master_clock [get_clocks_feeding_pin $pin_name] {

        post_message「在$port_name 上建立產生的頻率,由 $pin_name 提供
        」# 使用適當的主時鐘建立產生的頻率。
        # 來源是目前reusable_block即時中altddio_output單元的 muxsel 針腳
        。
        # 這個名稱結合了主時鐘和
        muxsel 針腳的完整階層名稱。
        # 目標是最高層級的埠,即 muxsel 針腳的風扇。
        create_generated_clock -add -master_clock $master_clock \
            -source [get_pins $pin_name] -名稱 ${master_clock\-${pin_name\
            [get_ports $port_name]
[ \

透過此程式碼包含在專案中的 SDC 檔案中,所有reusable_block即時都會自動受限於產生的頻率。即使在下列情況下,所產生的頻率也始終正確且更新:

  • reusable_block在設計階層中即時化或移動至其他點
  • 最高層級 I/O 已重新命名
  • 設計師在設計中使用多個頻率定義

這個頁面的內容綜合了英文原始內容的人工翻譯譯文與機器翻譯譯文。本內容是基於一般資訊目的,方便您參考而提供,不應視同完整或準確的內容。如果這個頁面的英文版與譯文之間發生任何牴觸,將受英文版規範及管轄。 查看這個頁面的英文版。