精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

時鐘周期約束

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

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

1. Create_clock

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

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

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

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

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


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


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

? 方式一

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


? 方式二

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


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

對于高速收發器的時鐘,我們也以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]

當系統中有多個主時鐘,且這幾個主時鐘之間存在確定的相位關系時,需要用到-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,若不寫wavefrom參數,則默認是占空比為50%且第一個上升沿出現在0時刻。使用report_clocks指令可以查看約束是否生效。還是上面的CPU的例子,把約束都還原到最初的狀態。執行report_clocks后,如下所示,我們只列出其中幾項內容。

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。這樣既會增加內存開銷,也會延長編譯時間。

2. create_generated_clock

其使用方法為:

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

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

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

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

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

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


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


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

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

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

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 

這個約束常用的方法有三種,第一種用法是當兩個主時鐘是異步關系時,使用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]]

4. 創建虛擬時鐘

虛擬時鐘通常用于設定對輸入和輸出的延遲約束,這個約束其實是屬于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延遲之前被定義。

5. 最大最小延遲約束

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


設置方式為:

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

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

編輯:hfy
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1626

    文章

    21665

    瀏覽量

    601815
  • 時序約束
    +關注

    關注

    1

    文章

    115

    瀏覽量

    13409
  • Vivado
    +關注

    關注

    19

    文章

    808

    瀏覽量

    66324
收藏 人收藏

    評論

    相關推薦

    FPGA的IO口時序約束分析

      在高速系統中FPGA時序約束不止包括內部時鐘約束,還應包括完整的IO時序
    發表于 09-27 09:56 ?1717次閱讀

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

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

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

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

    FPGA時鐘周期約束講解

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

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

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

    FPGA 高級設計:時序分析和收斂

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

    關于時序約束

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

    關于FPGA時序約束的一點總結

    其他總結:get_registers 對應多周期約束;get_ports 對應時鐘約束get_nets 對應IO約束get_clocks 對應跨時鐘
    發表于 09-13 21:58

    FPGA開發之時序約束周期約束

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

    添加時序約束的技巧分析

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

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

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

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

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

    FPGA設計之時序約束

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

    時鐘周期約束詳細介紹

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

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

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