??上一篇我們講過set_input_delay:
set_input_delay如何約束?
什么是output_delay?
顧名思義,output_delay就是指輸出端口的數據相對于參數時鐘邊沿的延時。
對于系統同步,FPGA和下游器件是同一個時鐘源,output delay的設置方式如下圖所示:
image-20220922214836390 image-20220923191831151
對于我們常用的源同步場景,output delay的設置方式如下圖所示:
image-20220923191055430
set_output_delay語法
set_output_delay[?clock][?reference_pin ][?clock_fall] [?rise][?fall][?max][?min][?add_delay][?network_latency_included] [?source_latency_included][?quiet][?verbose]
Name | Description |
---|---|
[-clock] | Relative clock |
[-reference_pin] | Relative pin or port |
[-clock_fall] | Delay is relative to falling edge of clock |
[-rise] | Specifies rising delay |
[-fall] | Specifies falling delay |
[-max] | Specifies maximum delay |
[-min] | Specifies minimum delay |
[-add_delay] | Don't remove existing input delay |
[-network_latency_included] | Specifies network latency of clock already included |
[-source_latency_included] | Specifies source latency of clock already included |
[-quiet] | Ignore command errors |
[-verbose] | Suspend message limits during command execution |
|
Delay value |
|
List of ports |
下面來詳細說明一下:
-clock:input_delay一般是相對時鐘而言的,而且默認是相對于上升沿,我們可以通過clock_fall參數來指定下降沿,這里的時鐘可以是虛擬時鐘;
-reference_pin:指定相對于某個pin上的時鐘邊沿,跟-clock的參數其實是一個意思,畢竟時鐘也是通過pin輸入進來的;
-clock_fall:指定相對于時鐘下降沿
-rise:指定端口的上升轉換的輸入延遲
-fall:指定端口的下降沿的輸入延遲
-max:最大延遲
-min:最小延遲,我們做input delay主要就是約束這兩個參數
-add_delay:以增量的方式添加延遲,如果不加該參數,默認行為是替換現有的延時
-network_latency_included:表示參考時鐘的網絡延遲也包含在延遲中
-source_latency_included:跟上一個參數類似的含義,該參數表示時鐘的源端延遲包含在延時中
-quiet:忽略指令的錯誤信息,即便指令錯了也依然返回TCL_OK
-verbose:命令執行期間忽略消息數量的限制,就是說會返回該指令的所有的message
delay:延遲值
objects:端口列表
Vivado Timing Constraints Wizard
還是一樣通過Vivado的Timing Constraints Wizard工具來進行約束會方便很多:
對應的約束如下:
set_output_delay-clock[get_clocks{clk}]-min-add_delay-1.0[get_ports{led[*]}] set_output_delay-clock[get_clocks{clk}]-max-add_delay2.0[get_ports{led[*]}]
可以看出,對于源同步系統,output delay其實就是下游器件的建立時間和保持時間的要求。
Examples
1.輸出數據比時鐘延遲3ns的delay:
create_clock-nameclk-period10[get_portsclk_in] set_output_delay-clockclk3[get_portsDOUT]
2.輸入數據相對于時鐘的下降沿有2ns的delay:
set_output_delay-clock_fall-clockclk2[get_portsDOUT]
3.設置延遲5ns,同時參數時鐘的網絡延遲也包含在內:
set_output_delay5.0-clockclk-network_latency_included[get_portsDOUT]
4.雙沿時鐘的約束,對上升沿和下降沿都需要進行約束
create_clock-nameclk_ddr-period6[get_portsDDR_CLK_OUT] set_output_delay-clockclk_ddr-max2.1[get_portsDDR_OUT] set_output_delay-clockclk_ddr-max1.9[get_portsDDR_OUT]-clock_fall-add_delay set_output_delay-clockclk_ddr-min0.9[get_portsDDR_OUT] set_output_delay-clockclk_ddr-min1.1[get_portsDDR_OUT]-clock_fall-add_delay
具體案例
比如某器件手冊的輸出時鐘與數據的setup和hold要求如下圖:
該時鐘雙沿采樣,在時鐘邊沿到來后,結合output_delay的最大最小延遲的定義,可以知道:
最大延遲為Tsetup
最小延遲為-Thold
但需要注意的是,輸出延遲的時鐘位置,一般輸出時鐘都會經過一級BUFG,再作為數據的隨路時鐘輸出,那我們就需要在輸出的pad上先create_generate一個時鐘,然后output delay是相對于該時鐘進行的。
image-20220924171932035
因此output delay的約束如下:
crate_clock-nameclk_in-period10[get_portsclk_p] create_generated_clock-name{tx_clk}-source[get_ports{clk_tx}]-multiply_by1-divide_by1{get_portsclk_p}-master_clock[get_clocks{clk_in}]-add_delay set_output_delay-clock[get_clocksclk_tx]-min-0.8[get_portsDOUT]-add_delay set_output_delay-clock[get_clocksclk_tx]-max1.0[get_portsDOUT]-add_delay set_output_delay-clock[get_clocksclk_tx]-min-0.8[get_portsDOUT]-clock_fall-add_delay set_output_delay-clock[get_clocksclk_tx]-max1.0[get_portsDOUT]-clock_fall-add_delay
因此,只要記住:
min_delay就是下游器件的 -hold time
max_delay是下游器件的setup time
如果是雙沿的話,就是半個時鐘周期,而且還需要對時鐘的下降沿進行約束
-
FPGA
+關注
關注
1629文章
21742瀏覽量
603541 -
數據
+關注
關注
8文章
7045瀏覽量
89062 -
時鐘
+關注
關注
11文章
1734瀏覽量
131496 -
Output
+關注
關注
0文章
31瀏覽量
10504
原文標題:set_output_delay如何約束?
文章出處:【微信號:傅里葉的貓,微信公眾號:傅里葉的貓】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論