Vivado使用技巧(32):IO延遲的約束方法

FPGADesigner發表於2018-09-27

上一篇講述了對時鐘的約束方法,時鐘不僅對設計很重要,約束情況也很多、很複雜,需要一定的經驗。本文將講述另一種重要的約束:I/O延遲,但與時鐘約束相比就簡單的多,本文篇幅也相對較少。

為了對設計外部的時序情況進行精確建模,設計者必須設定輸入和輸出埠的時序資訊。Vivado只能識別出FPGA器件範圍內的時序,因此必須使用set_input_delay和set_output_delay命令來設定FPGA範圍外的延遲值。兩者在含義、約束命令等方面有很多地方是相似的,只不過一個是輸入,一個是輸出,本文還是分開對兩者進行講述。


輸入延遲

set_input_delay命令設定輸入埠上相對於設計介面時鐘邊沿的輸入路徑延遲。輸入延遲既指資料從外部晶片經過板級傳輸到FPGA輸入管腳間的相位差,也指相對參考板級時鐘間的相位差。輸入延遲值可以是正的,也可以是負的,由時鐘和資料在FPGA介面處的相對相位決定。

約束時的相對時鐘可以是一個設計時鐘,也可以是一個虛擬時鐘。輸入延遲命令的選項包括:

  • -min和-max:-min設定的值用於最小延遲分析(保持時間、移除時間);-max設定的值用於最大延遲分析(建立時間、恢復時間)。如果約束命令中沒有使用這兩個選項,輸入延遲值會同時應用於min和max。
  • -clock_fall:用於指定由相對時鐘的下降沿啟動的時序路徑上的輸入延遲約束。如果沒有這個選項,Vivado只假定使用相對時鐘的上升沿。
  • -add_delay:該選項通常用於約束與多個時鐘沿相關的輸入埠(比如DDR介面),而且必須已經存在一個最大或最小輸入延遲約束,設計者使用該命令為同一埠設定其它相對時鐘沿的最大或最小輸入延遲約束。

輸入延遲約束只能應用於輸入埠或雙向埠(不包括時鐘輸入埠),不能用於設計內部的管腳。下面給出幾個使用輸入延遲約束的典型例子。

1.示例一

create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 2 [get_ports DIN]

定義一個主時鐘sysClk作為輸入延遲的相對時鐘,設定的值同時作為最小值(min)分析和最大值(max)分析。

2.示例二

create_clock -name clk_port_virt -period 10
set_input_delay -clock clk_port_virt 2 [get_ports DIN]

該例子約束目的與上例相同,只是相對時鐘換為一個虛擬時鐘。使用虛擬時鐘的好處是可以在不改變內部設計時鐘的情況下,設定任意的抖動和延遲。

3.示例三

create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk -max 4 [get_ports DIN]
set_input_delay -clock sysClk -min 1 [get_ports DIN]

該例中最小值分析和最大值分析採用不同的輸入延遲值。

4.示例四

create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 4 [get_ports DIN]
set_output_delay -clock sysClk 1 [get_ports DOUT]

第30篇中介紹過用虛擬時鐘對純組合邏輯進行約束的相關知識,這裡給出一個例子。如果兩個I/O埠之間僅有組合邏輯路徑,沒有任何時序單元,必須相對於虛擬時鐘為I/O埠定義輸入與輸出延遲。上例中DIN和DOUT之間的組合邏輯路徑約束為5ns(10-1-4)。

5.示例五

create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_input_delay -clock clk_ddr -max 2.1 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -max 1.9 [get_ports DDR_IN] -clock_fall -add_delay
set_input_delay -clock clk_ddr -min 0.9 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -min 1.1 [get_ports DDR_IN] -clock_fall -add_delay

這裡相對時鐘為DDR的時鐘,最小值分析和最大值分析採用不同的輸入延遲值。約束的一端是器件外部時鐘的上升沿和下降沿啟動的資料,另一端是器件內部同時對上升沿和下降沿敏感的觸發器的輸入資料。


輸出延遲

set_output_delay命令設定輸出埠上相對於設計介面時鐘邊沿的輸出路徑延遲。輸出延遲既指資料從FPGA的輸出管腳通過板級傳輸到另一個器件間的相位差,也指相對參考板級時鐘間的相位差。輸出延遲值同樣也可以是正的或負的,由時鐘和資料在FPGA器件外的相對相位決定。

約束時的相對時鐘可以是一個設計時鐘,也可以是一個虛擬時鐘。輸出延遲命令的選項基本與輸入延遲約束相同,還是陳列如下:

  • -min和-max:-min設定的值用於最小延遲分析(保持時間、移除時間);-max設定的值用於最大延遲分析(建立時間、恢復時間)。如果約束命令中沒有使用這兩個選項,輸入延遲值會同時應用於min和max。
  • -clock_fall:用於指定由相對時鐘的下降沿捕獲的時序路徑上的輸出延遲約束。如果沒有這個選項,Vivado只假定使用相對時鐘的上升沿。
  • -add_delay:該選項通常用於約束與多個時鐘沿相關的輸出埠(比如DDR介面同時使用上升沿和下降沿,或者輸出埠與幾個使用不同時鐘的器件相連),而且必須已經存在一個最大或最小輸入延遲約束,設計者使用該命令為同一埠設定其它相對時鐘沿的最大或最小輸入延遲約束。

同樣,輸出延遲約束只能應用於輸出埠或雙向埠,不能用於設計內部的管腳。下面給出幾個使用輸出延遲約束的典型例子。

1.示例一

create_clock -name sysClk -period 10 [get_ports CLK0]
set_output_delay -clock sysClk 6 [get_ports DOUT]

定義一個主時鐘sysClk作為輸出延遲的相對時鐘,設定的值同時作為最小值(min)分析和最大值(max)分析。

2.示例二

create_clock -name clk_port_virt -period 10
set_output_delay -clock clk_port_virt 6 [get_ports DOUT]

該例子約束目的與上例相同,只是相對時鐘換為一個虛擬時鐘。使用虛擬時鐘的好處是可以在不改變內部設計時鐘的情況下,設定任意的抖動和延遲。

3.示例三

create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_output_delay -clock clk_ddr -max 2.1 [get_ports DDR_OUT]
set_output_delay -clock clk_ddr -max 1.9 [get_ports DDR_OUT] -clock_fall -add_delay
set_output_delay -clock clk_ddr -min 0.9 [get_ports DDR_OUT]
set_output_delay -clock clk_ddr -min 1.1 [get_ports DDR_OUT] -clock_fall -add_delay

這裡相對時鐘為DDR的時鐘,最小值分析和最大值分析採用不同的輸出延遲值。約束的一端是器件外部時鐘的上升沿和下降沿啟動的資料,另一端是器件內部同時對上升沿和下降沿敏感的觸發器的輸出資料。

最後再補充一句,雖然上面說輸入延遲約束和輸出延遲約束不能應用於FPGA內部管腳,但也有特例。UltraScale+系列FPGA的STARTUPE3內部管腳就可以進行輸入延遲和輸出延遲約束。不過博主連UltraScale+的晶片都沒摸過,本文便不做介紹。

相關文章