1. 時鐘周期約束:?時鐘周期約束,顧名思義,就是我們對時鐘的周期進行約束,這個約束是我們用的最多的約束了,也是最重要的約束。
2. vivado中時鐘約束指令:
create_clock
使用create_clock來創建時鐘周期約束,使用方法:
create_clock -name
值得注意的是,這里的時鐘必須是主時鐘 primary clock。主時鐘通常有兩種情況:一種是由外部時鐘源提供,另外一種是告訴收發器的時鐘提供。
如何查看主時鐘?
綜合、布局布線之后
打開綜合設計或者布局布線設計
兩種方式查看主時鐘:第一種,report_clock_networks -name mainclock,可以直接查看主時鐘。第二種,check_timing -override_defaults no_clock,可以查看沒有被約束的主時鐘
當主時鐘之間的相位關系確定時,則通過-waveform參數進行約束
如上圖所示的兩個主時鐘,進行如下約束:
create_clock -name clk0 -period 10.0 -waveform {0 5} [get_ports clk0]
create_clock -name clk1 -period 8.0 -waveform {2 8} [get_ports clk1]
數字單位默認是ns。如果不寫waveform參數,則默認占空比是50%且第一個上升沿在0時刻。
一般來說,如果輸入時鐘是差分的,只需要對P端進行約束即可。
create_generated_clock
約束在FPGA內部產生的衍生時鐘,使用方法如下:
create_generated_clock -name
-source
-multiply_by
-divide_by
-master_clock
因為是衍生時鐘,所以有-source參數,指明衍生時鐘從哪里來的,后面就是源時鐘名字,master clock,叫上一級時鐘,區別于primary clock。它可以是primary clock 也可以是其他衍生時鐘。
這個命令并不是設定周期和波形,而是描述時鐘電路如何對上級時鐘的轉換:
簡單的頻率分頻、倍頻
頻率和分頻組合,獲得非整數的比例,通常由MMCM或PLL完成
相移或波形反相
占空比改變
set_clock_groups
使用方法:
set_clock_groups -asynchronous -group
set_clock_groups -physically_exclusive -group
第一種用法:來指定兩個主時鐘是異步關系,使用asynchronous。
create_clock -period 10 -name clk1 [get_ports clk1]
create_clock -period 8 -name clk2 [get_ports clk2]
set_clock_groups -asynchronous -group clk1 -group clk2
第二種用法:當我們需要驗證同一個時鐘端口在不同時鐘頻率下能否獲得時序收斂時使用。 比如有兩個異步主時鐘clk1和clk2,需要驗證在clk2頻率為100MHz,clk1頻率分別為50MHz、100MHz和200MHz下的時序收斂情況,我們就可以這樣寫。
create_clock -name clk1A -period 20.0 [get_ports clk1]
create_clock -name clk1B -period 10.0 [get_ports clk1] -add
create_clock -name clk1C -period 5.0 [get_ports clk1] -add
create_clock -name clk2 -period 10.0 [get_ports clk2]
set_clock_groups -physically_exclusive -group clk1A -group clk1B -group clk1C
set_clock_groups -asynchronous -group "clk1A clk1B clk1C" -group clk2
第三種用法:當我們使用BUFGMUX時,會有兩個輸入時鐘,但只會有一個時鐘被使用。 比如MMCM輸入100MHz時鐘,兩個輸出分別為50MHz和200MHz,這兩個時鐘進入了BUFGMUX。在這種情況下,我們需要設置的時序約束如下:
set_clock_groups -logically_exclusive
-group [get_clocks -of [get_pins inst_mmcm/inst/mmcm_adv_inst/CLKOUT0]]
-group [get_clocks -of [get_pins inst_mmcm/inst/mmcm_adv_inst/CLKOUT1]]
虛擬時鐘
虛擬時鐘通常用于設定對輸入和輸出的延遲約束,這個約束其實是屬于IO約束中的延遲約束。虛擬時鐘和前面講的延遲約束的使用場景不太相同。顧名思義,虛擬時鐘,就是沒有與之綁定的物理管腳。
虛擬時鐘主要用于以下三個場景:
外部IO的參考時鐘并不是設計中的時鐘
FPGA I/O路徑參考時鐘來源于內部衍生時鐘,但與主時鐘的頻率關系并不是整數倍
針對I/O指定不同的jitter和latency
??簡而言之,之所以要創建虛擬時鐘,對于輸入來說,是因為輸入到FPGA數據的捕獲時鐘是FPGA內部產生的,與主時鐘頻率不同;或者PCB上有Clock Buffer導致時鐘延遲不同。對于輸出來說,下游器件只接收到FPGA發送過去的數據,并沒有隨路時鐘,用自己內部的時鐘去捕獲數據。
比如:如下圖所示,在FPGA的A和B端口分別有兩個輸入,其中捕獲A端口的時鐘是主時鐘,而捕獲B端口的時鐘是MMCM輸出的衍生時鐘,而且該衍生時鐘與主時鐘的頻率不是整數倍關系。
這種情況下時序約束如下:
create_clock -name sysclk -period 10 [get_ports clkin]
create_clock -name virclk -period 6.4
set_input_delay 2 -clock sysclk [get_ports A]
set_input_delay 2 -clock virclk [get_ports B]
可以看到,創建虛擬時鐘用的也是create_clock約束,但后面并沒有加get_ports參數,因此被稱為虛擬時鐘。
再舉個輸出的例子,我們常用的UART和SPI,當FPGA通過串口向下游器件發送數據時,僅僅發過去了uart_tx這個數據,下游器件通過自己內部的時鐘去捕獲uart_tx上的數據,這就需要通過虛擬時鐘來約束;而當FPGA通過SPI向下游器件發送數據時,會發送sclk/sda/csn三個信號,其中sclk就是sda的隨路時鐘,下游器件通過sclk去捕獲sda的數據,而不是用自己內部的時鐘,這是就不需要虛擬時鐘,直接使用set_output_delay即可。
注意,虛擬時鐘必須在約束I/O延遲之前被定義。
max/min delay的約束平時用的相對少一些,因為在跨異步時鐘域時,我們往往會設置asynchronous或者false_path。對于異步時鐘,我們一般都會通過設計來保證時序能夠收斂,而不是通過時序約束來保證。
審核編輯:湯梓紅
-
FPGA
+關注
關注
1629文章
21729瀏覽量
602998 -
時序約束
+關注
關注
1文章
115瀏覽量
13416 -
Vivado
+關注
關注
19文章
812瀏覽量
66472 -
時鐘約束
+關注
關注
0文章
15瀏覽量
6015
原文標題:FPGA時序約束之時鐘周期約束
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論