0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA時序案例分析之時鐘周期約束

454398 ? 來源:科學(xué)計算technomania ? 作者:貓叔 ? 2020-11-19 11:44 ? 次閱讀

時鐘周期約束

時鐘周期約束,顧名思義,就是我們對時鐘的周期進行約束,這個約束是我們用的最多的約束了,也是最重要的約束。

下面我們講一些Vivado中時鐘約束指令。

1. Create_clock

在Vivado中使用create_clock來創(chuàng)建時鐘周期約束。使用方法為:

create_clock -name  -period  -waveform { } [get_ports ]

這里的時鐘必須是主時鐘primary clock,主時鐘通常有兩種情形:一種是時鐘由外部時鐘源提供,通過時鐘引腳進入FPGA,該時鐘引腳綁定的時鐘為主時鐘:另一種是高速收發(fā)器(GT)的時鐘RXOUTCLK或TXOUTCLK。對于7系列FPGA,需要對GT的這兩個時鐘手工約束:對于UltraScale FPGA,只需對GT的輸入時鐘約束即可,Vivado會自動對這兩個時鐘約束。

如何確定主時鐘是時鐘周期約束的關(guān)鍵,除了根據(jù)主時鐘的兩種情形判斷之外,還可以借助Tcl腳本判斷。

在vivado自帶的example project里面,打開CPU(HDL)的工程,如下圖所示。


把工程的xdc文件中,create_clock的幾項都注釋掉。這里解釋下端口(Port)和管腳(Pin)。get_ports獲取的是FPGA的IO端口,get_pins獲取的是FPGA內(nèi)部子模塊的Pin,具體的我們在第14講的Tcl命令中會講到。


再Open Synthesized Design或者Open Implementation Design,并通過以下兩種方式查看主時鐘。

? 方式一

運行tcl指令report_clock_networks -name mainclock,顯示結(jié)果如下:


? 方式二

運行tcl指令check_timing -override_defaults no_clock,顯示結(jié)果如下:


Vivado中的tcl命令行相當(dāng)好用,有很多的功能,大家可以開始習(xí)慣用起來了。

對于高速收發(fā)器的時鐘,我們也以Vivado中的CPU example工程為例,看下Xilinx官方是怎么約束的。

# Define the clocks for the GTX blocks
create_clock -name gt0_txusrclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt0_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]
create_clock -name gt2_txusrclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt2_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]
create_clock -name gt4_txusrclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt4_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]
create_clock -name gt6_txusrclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt6_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]

當(dāng)系統(tǒng)中有多個主時鐘,且這幾個主時鐘之間存在確定的相位關(guān)系時,需要用到-waveform參數(shù)。如果有兩個主時鐘,如下圖所示。


則時鐘約束為:

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]

約束中的數(shù)字的單位默認是ns,若不寫wavefrom參數(shù),則默認是占空比為50%且第一個上升沿出現(xiàn)在0時刻。使用report_clocks指令可以查看約束是否生效。還是上面的CPU的例子,把約束都還原到最初的狀態(tài)。執(zhí)行report_clocks后,如下所示,我們只列出其中幾項內(nèi)容。

Clock Report

Clock           Period(ns)  Waveform(ns)    Attributes  Sources
sysClk          10.000      {0.000 5.000}   P           {sysClk}
gt0_txusrclk_i  12.800      {0.000 6.400}   P           {mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt0_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK}
...


====================================================
Generated Clocks
====================================================

Generated Clock   : clkfbout
Master Source     : clkgen/mmcm_adv_inst/CLKIN1
Master Clock      : sysClk
Multiply By       : 1
Generated Sources : {clkgen/mmcm_adv_inst/CLKFBOUT}

Generated Clock   : cpuClk_4
Master Source     : clkgen/mmcm_adv_inst/CLKIN1
Master Clock      : sysClk
Edges             : {1 2 3}
Edge Shifts(ns)   : {0.000 5.000 10.000}
Generated Sources : {clkgen/mmcm_adv_inst/CLKOUT0}
...

一般來講,我們的輸入時鐘都是差分的,此時我們只對P端進行約束即可。如果同時約束了P端和N端,通過report_clock_interaction命令可以看到提示unsafe。這樣既會增加內(nèi)存開銷,也會延長編譯時間。

2. create_generated_clock

其使用方法為:

create_generated_clock -name  /
                       -source  /
                       -multiply_by  /
                       -divide_by  /
                       -master_clock  /
                       

從名字就能看出來,這個是約束我們在FPGA內(nèi)部產(chǎn)生的衍生時鐘, 所以參數(shù)在中有個-source,就是指定這個時鐘是從哪里來的,這個時鐘叫做master clock,是指上級時鐘,區(qū)別于primary clock。

它可以是我們上面講的primary clock,也可以是其他的衍生時鐘。該命令不是設(shè)定周期或波形,而是描述時鐘電路如何對上級時鐘進行轉(zhuǎn)換。

這種轉(zhuǎn)換可以是下面的關(guān)系:
-簡單的頻率分頻
-簡單的頻率倍頻
-頻率倍頻與分頻的組合,獲得一個非整數(shù)的比例,通常由MMCM或PLL完成
-相移或波形反相
-占空比改變
-上述所有關(guān)系的組合

衍生時鐘又分兩種情況:
① Vivado自動推導(dǎo)的衍生時鐘
② 用戶自定義的衍生時鐘

首先來看第一種,如果使用PLL或者MMCM,則Vivado會自動推導(dǎo)出一個約束。大家可以打開Vivado中有個叫wavegen的工程,在這個工程中,輸入時鐘經(jīng)過PLL輸出了2個時鐘,如下圖所示。


但在xdc文件中,并未對這2個輸出時鐘進行約束,只對輸入的時鐘進行了約束,若我們使用report_clocks指令,則會看到:


注:有三個約束是因為PLL會自動輸出一個反饋時鐘

自動推導(dǎo)的好處在于當(dāng)MMCM/PLL/BUFR的配置改變而影響到輸出時鐘的頻率和相位時,用戶無需改寫約束,Vivado仍然可以自動推導(dǎo)出正確的頻率/相位信息。劣勢在于,用戶并不清楚自動推導(dǎo)出的衍生鐘的名字,當(dāng)設(shè)計層次改變時,衍生鐘的名字也有可能改變。但由于該衍生時鐘的約束并非我們自定義的,因此可能會沒有關(guān)注到它名字的改變,當(dāng)我們使用者這些衍生時鐘進行別的約束時,就會出現(xiàn)錯誤。

解決辦法是用戶自己手動寫出自動推導(dǎo)的衍生時鐘的名字,也僅僅寫出名字即可,其余的不寫。如下所示。

create_generated_clock -name  /
                       -source 

這一步很容易會被提示critical warning,其實有個很簡單的方法,就是name和source都按照vivado中生成的來。具體我們到后面的例子中會講到。

3. set_clock_groups

使用方法為:

set_clock_groups -asynchronous -group  -group 
 set_clock_groups -physically_exclusive  -group  -group 

這個約束常用的方法有三種,第一種用法是當(dāng)兩個主時鐘是異步關(guān)系時,使用asynchronous來指定。這個在我們平時用的還是比較多的,一般稍微大點的工程,都會出現(xiàn)至少兩個主時鐘,而且這兩個時鐘之間并沒有任何的相位關(guān)系,這時就要指定:

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

第二種用法是當(dāng)我們需要驗證同一個時鐘端口在不同時鐘頻率下能否獲得時序收斂時使用。比如有兩個異步主時鐘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

第三種用法就是當(dāng)我們使用BUFGMUX時,會有兩個輸入時鐘,但只會有一個時鐘被使用。比如MMCM輸入100MHz時鐘,兩個輸出分別為50MHz和200MHz,這兩個時鐘進入了BUFGMUX,如下圖所示。


在這種情況下,我們需要設(shè)置的時序約束如下:

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]]

4. 創(chuàng)建虛擬時鐘

虛擬時鐘通常用于設(shè)定對輸入和輸出的延遲約束,這個約束其實是屬于IO約束中的延遲約束,之所以放到這里來講,是因為虛擬時鐘的創(chuàng)建,用到了本章節(jié)講的一些理論。虛擬時鐘和前面講的延遲約束的使用場景不太相同。顧名思義,虛擬時鐘,就是沒有與之綁定的物理管腳。

虛擬時鐘主要用于以下三個場景:
? 外部IO的參考時鐘并不是設(shè)計中的時鐘
? FPGA I/O路徑參考時鐘來源于內(nèi)部衍生時鐘,但與主時鐘的頻率關(guān)系并不是整數(shù)倍
? 針對I/O指定不同的jitter和latency

簡而言之,之所以要創(chuàng)建虛擬時鐘,對于輸入來說,是因為輸入到FPGA數(shù)據(jù)的捕獲時鐘是FPGA內(nèi)部產(chǎn)生的,與主時鐘頻率不同;或者PCB上有Clock Buffer導(dǎo)致時鐘延遲不同。對于輸出來說,下游器件只接收到FPGA發(fā)送過去的數(shù)據(jù),并沒有隨路時鐘,用自己內(nèi)部的時鐘去捕獲數(shù)據(jù)。

如下圖所示,在FPGA的A和B端口分別有兩個輸入,其中捕獲A端口的時鐘是主時鐘,而捕獲B端口的時鐘是MMCM輸出的衍生時鐘,而且該衍生時鐘與主時鐘的頻率不是整數(shù)倍關(guān)系。


這種情況下時序約束如下:

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]

可以看到,創(chuàng)建虛擬時鐘用的也是create_clock約束,但后面并沒有加get_ports參數(shù),因此被稱為虛擬時鐘。

再舉個輸出的例子,我們常用的UART和SPI,當(dāng)FPGA通過串口向下游器件發(fā)送數(shù)據(jù)時,僅僅發(fā)過去了uart_tx這個數(shù)據(jù),下游器件通過自己內(nèi)部的時鐘去捕獲uart_tx上的數(shù)據(jù),這就需要通過虛擬時鐘來約束;而當(dāng)FPGA通過SPI向下游器件發(fā)送數(shù)據(jù)時,會發(fā)送sclk/sda/csn三個信號,其中sclk就是sda的隨路時鐘,下游器件通過sclk去捕獲sda的數(shù)據(jù),而不是用自己內(nèi)部的時鐘,這是就不需要虛擬時鐘,直接使用set_output_delay即可。

注意,虛擬時鐘必須在約束I/O延遲之前被定義。

5. 最大最小延遲約束

顧名思義,就是設(shè)置路徑的max/min delay,主要應(yīng)用場景有兩個:
? 輸入管腳的信號經(jīng)過組合邏輯后直接輸出到管腳
? 異步電路之間的最大最小延遲


設(shè)置方式為:

set_max_delay  [-datapath_only] [-from ][-to ][-through ]
set_min_delay  [-from ] [-to ][-through ]

max/min delay的約束平時用的相對少一些,因為在跨異步時鐘域時,我們往往會設(shè)置asynchronous或者false_path。對于異步時鐘,我們一般都會通過設(shè)計來保證時序能夠收斂,而不是通過時序約束來保證。

編輯:hfy
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21736

    瀏覽量

    603315
  • 時序約束
    +關(guān)注

    關(guān)注

    1

    文章

    115

    瀏覽量

    13425
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    812

    瀏覽量

    66523
收藏 人收藏

    評論

    相關(guān)推薦

    FPGA的IO口時序約束分析

      在高速系統(tǒng)中FPGA時序約束不止包括內(nèi)部時鐘約束,還應(yīng)包括完整的IO時序
    發(fā)表于 09-27 09:56 ?1747次閱讀

    FPGA時序約束之衍生時鐘約束時鐘分組約束

    FPGA設(shè)計中,時序約束對于電路性能和可靠性非常重要。在上一篇的文章中,已經(jīng)詳細介紹了FPGA時序約束
    發(fā)表于 06-12 17:29 ?2742次閱讀

    FPGA時序約束之偽路徑和多周期路徑

    前面幾篇FPGA時序約束進階篇,介紹了常用主時鐘約束、衍生時鐘
    發(fā)表于 06-12 17:33 ?1817次閱讀

    FPGA時鐘周期約束講解

    時鐘周期約束是用于對時鐘周期約束,屬于時序約束中最
    發(fā)表于 08-14 18:25 ?888次閱讀

    Xilinx FPGA編程技巧之常用時序約束詳解

    寄存器到寄存器約束往往指的是周期約束,周期約束的覆蓋范圍包括: 覆蓋了時鐘域的時序要求 覆蓋了同步數(shù)據(jù)在內(nèi)部寄存器之間的傳輸
    發(fā)表于 04-12 17:39

    FPGA 高級設(shè)計:時序分析和收斂

    FPGA/ASIC 時序定義的基礎(chǔ)概念。后面要講到的其它時序約束都是建立在周期約束的基礎(chǔ)上的,很多其它
    發(fā)表于 06-17 17:07

    關(guān)于時序約束

    時可以引用這個標(biāo)識符,大大方便了派生時鐘的定義?! ∫环N特殊情況的周期約束是相關(guān)時鐘。前面提到周期約束不會覆蓋異步路徑,如圖1所示的D路徑。但是如果兩個
    發(fā)表于 02-03 14:13

    關(guān)于FPGA時序約束的一點總結(jié)

    其他總結(jié):get_registers 對應(yīng)多周期約束;get_ports 對應(yīng)時鐘約束get_nets 對應(yīng)IO約束get_clocks 對應(yīng)跨時鐘
    發(fā)表于 09-13 21:58

    FPGA開發(fā)之時序約束周期約束

    時序約束可以使得布線的成功率的提高,減少ISE布局布線時間。這時候用到的全局約束就有周期約束和偏移約束。
    發(fā)表于 02-09 02:56 ?719次閱讀

    添加時序約束的技巧分析

    。 在添加全局時序約束時,需要根據(jù)時鐘頻率劃分不同的時鐘域,添加各自的周期約束;然后對輸入輸出端口信號添加偏移
    發(fā)表于 11-25 09:14 ?2605次閱讀

    FPGA時序約束的概念和基本策略

    A 時序約束的概念和基本策略 時序約束主要包括周期約束(FFS到FFS,即觸發(fā)器到觸發(fā)器)和偏移約束
    的頭像 發(fā)表于 09-30 15:17 ?5096次閱讀

    FPGA約束、時序分析的概念詳解

    A 時序約束的概念和基本策略 時序約束主要包括周期約束(FFS到FFS,即觸發(fā)器到觸發(fā)器)和偏移約束
    的頭像 發(fā)表于 10-11 10:23 ?5555次閱讀
    <b class='flag-5'>FPGA</b>的<b class='flag-5'>約束</b>、<b class='flag-5'>時序</b><b class='flag-5'>分析</b>的概念詳解

    FPGA設(shè)計之時序約束

    上一篇《FPGA時序約束分享01_約束四大步驟》一文中,介紹了時序約束的四大步驟。
    發(fā)表于 03-18 10:29 ?1671次閱讀
    <b class='flag-5'>FPGA</b>設(shè)計<b class='flag-5'>之時序</b><b class='flag-5'>約束</b>

    時鐘周期約束詳細介紹

    時鐘周期約束:?時鐘周期約束,顧名思義,就是我們對時鐘周期進行
    的頭像 發(fā)表于 08-05 12:50 ?3766次閱讀

    FPGA時序約束的原理是什么?

    FPGA開發(fā)過程中,離不開時序約束,那么時序約束是什么?簡單點說,FPGA芯片中的邏輯電路,從輸
    發(fā)表于 06-26 14:42 ?718次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>時序</b><b class='flag-5'>約束</b>的原理是什么?