Vivado使用入門之二:網(wǎng)表物理約束
一、背景
? ? ? ? 在工程設(shè)計(jì)中為了保證上板后功能正常,需對(duì)設(shè)計(jì)定義相關(guān)的約束要求。約束根據(jù)設(shè)計(jì)對(duì)象的不同可分為時(shí)序約束(對(duì)時(shí)鐘)和物理約束(對(duì)網(wǎng)表),根據(jù)流程可劃分為綜合約束和實(shí)現(xiàn)約束,本文主要講解物理約束,示例器件為xc7k410tfbv900?,vivado版本為2019.1。
二、物理約束
2.1 概念
????物理約束包括I/O位置約束,網(wǎng)表單元約束,布局約束,布線約束,約束的內(nèi)容是保存在XDC(Xilinx Design Constraints)文件或Tcl腳本中,在打開工程時(shí)被加載進(jìn)入工程中,載入工程后也可以對(duì)約束進(jìn)行修改。大部分約束的格式為“set_property <propert_name> <value> <object list> ,區(qū)域約束的格式存在差異,格式為“create_pblock block_name re size_pblock [get_pblocks block_name]” -add {cell}
2.2 網(wǎng)表約束
????網(wǎng)表約束主要是對(duì)如端口ports,引腳pin,線nets和單元cells對(duì)象,使綜合和實(shí)現(xiàn)過程按照指定的方式和進(jìn)行處理。
????網(wǎng)表約束主要有四個(gè)
a) CLOCK_DEDICATED_ROUTE
b) MARK_DEBUG
c) DONT_TOUCH
d) LOCK_PINS
2.2.1 CLOCK_DEDICATED_ROUTE
????????CLOCK_DEDICATED_ROUTE作用對(duì)象為net,時(shí)鐘信號(hào)正常是只能通過時(shí)鐘樹到達(dá)目的對(duì)象的時(shí)鐘引腳,設(shè)置改屬性后,時(shí)鐘信號(hào)可走普通線路到達(dá)目的對(duì)象。缺點(diǎn)是通常走普通線路時(shí)延較大,容易導(dǎo)致時(shí)序違例。改屬性設(shè)置為false即為允許時(shí)鐘從輸入端口到達(dá)BUFG或MMCM走普通線路。
以一個(gè)簡(jiǎn)單的異步清零寄存器為例,為了構(gòu)造時(shí)鐘信號(hào)需要走普通線路才能到達(dá)的場(chǎng)景,特地將clk端口和FF約束到不同的半?yún)^(qū),使用的器件為xc7k480tffv1156-1 (active)
XDC約束內(nèi)容
運(yùn)行到place時(shí)報(bào)錯(cuò),符合預(yù)期,clk端口無法跨越半個(gè)芯片區(qū)域到達(dá)BUFG,只能到達(dá)所屬半?yún)^(qū)的BUFG

對(duì)clk net添加屬性CLOCK_DEDICATED_ROUTE,布局布線通過
左下角的clk端口通過普通布線路徑到達(dá)BUFG

2.2.2 MARK_DEBUG
????????在RTL中對(duì)net設(shè)置MARK_DEBUG,net上的信號(hào)會(huì)自動(dòng)地被加入到Debug上,查看Debug上信號(hào)的波形,進(jìn)行功能的確認(rèn)。添加DEBUG有以下幾種方式
方法1、可直接在RTL代碼中對(duì)net、reg對(duì)象標(biāo)注
方法2:Schematic中添加
在Schematic圖中選定要標(biāo)記的net,右鍵彈出設(shè)置欄,選擇Mark Debug,標(biāo)記前如下圖

標(biāo)記后,在Debug窗口對(duì)out_OBUF設(shè)置Set Up Debug

彈出Set Up Debug窗口

設(shè)置采樣率和輸入通道階段數(shù)

設(shè)置完成后,在Netlist和Net Properties種,out_OBUF前面有debug標(biāo)志,Schematic中out_BUF連接的各個(gè)pin也帶有標(biāo)志,如紅框所示。

2.2.3?DONT_TOUCH
????DONT_TOUCH主要是仿真單元或net被優(yōu)化掉,對(duì)于一些邏輯檢測(cè)或調(diào)試很有必要,并且對(duì)于一些高扇出的單元,手動(dòng)復(fù)制的寄存器添加屬性后也不會(huì)被優(yōu)化。具體的使用方面可參照之前的文章Vivado綜合屬性系列之七 DONT TOUCH?或CSDN網(wǎng)址:https://blog.csdn.net/zyp626/article/details/130715598
2.2.4?LOCK_PINS
LOCK_PINS用于指定LUT的邏輯約束(I0,...,I5)和Device上LUT單元的物理位置(A1,...,A6)的映射關(guān)系,比較常用的場(chǎng)景是將處于關(guān)鍵路徑上的LUT的映射到Device中LUT的A5和A6,可以減小時(shí)延。
以示例工程中的cnt_t_1[3]_i_3_1(LUT6)為例,inst映射到device的關(guān)系見左下角紅框,I0對(duì)應(yīng)A4

Tcl Console設(shè)置LOCK_PINS屬性,I0,I1分別映射為A6,A5
結(jié)果如圖所示,映射關(guān)系已更改,符合預(yù)期

也可在Device中直接選中LUT6網(wǎng)表,右鍵后點(diǎn)擊Lock Cell Input Pins

2.3?位置約束
????????網(wǎng)表在device中的狀態(tài)分為兩種:固定位置和非固定位置,固定位置是指被用戶通過設(shè)置XDC約束,或者在cell對(duì)象中使用了IS_LOC_FIXED/IS_BEL_FIXED三種方式進(jìn)行了手動(dòng)布局,三種方式效果相同。非固定位置需要實(shí)現(xiàn)工具對(duì)網(wǎng)表進(jìn)行布局,通過該方式布局后,網(wǎng)表會(huì)有IS_LOC_FIXED/IS_BEL_FIXED屬性
? ? 本節(jié)主要講解固定位置的設(shè)置,在device界面上,可直接對(duì)網(wǎng)表進(jìn)行位置約束,約束的階段即可是綜合后的網(wǎng)表,也可以是實(shí)現(xiàn)后的網(wǎng)表,以跨時(shí)鐘域的代碼為例
在Netlist窗口的Leaf Cells欄中包含了工程的所有網(wǎng)表,同時(shí)在“Window->Device”打開device窗口,

將左側(cè)device的CLB放大,鼠標(biāo)右鍵選中左側(cè)的sum_OBUF_inst_i_1(LUT2),將其拖入到右側(cè)的CLB中的LUT位置,保存即設(shè)置了該網(wǎng)表的約束,同時(shí)device上對(duì)應(yīng)位置有背景顏色標(biāo)記

查看網(wǎng)表的cell properties,fixed已被勾選,表示被約束了

在Constraints打開工程的約束文件,在xdc文件中出現(xiàn)了sum_OBUF_inst_i_1的LOC約束

2.4?布線約束
???????布線約束主要是對(duì)net的布線資源進(jìn)行控制,效果和Vivado工具直接布線相同。在綜合階段,要對(duì)net進(jìn)行布線的話,net的driver和load必須先進(jìn)行約束,否則在device界面不會(huì)顯示net。布線約束有route和assign routing mode兩種方式。
2.4.1 route
????????仍舊以2.3節(jié)的設(shè)計(jì)為例,綜合后的網(wǎng)表圖如下,對(duì)ff_s1進(jìn)行布線約束,對(duì)應(yīng)的driver和load為ff_s1_reg,ff_s2_reg。

在device中對(duì)ff_s1_reg和ff_s2_reg進(jìn)行位置約束后,在右側(cè)的layers->nets中可知無布線約束的net為unrouted net,顯示深紅色,ff_s1在device中為圖中的斜線

也可選中net執(zhí)行Report Net Route Status

選中net,右鍵選擇“Route”,進(jìn)行布線約束,原先的ff_s1布線約束后經(jīng)過了一些switchbox

選中該net再執(zhí)行fix routing將約束固定,保存修改,查看xdc約束內(nèi)容,包含了FIXED_ROUTE屬性的約束,即完成了布線約束

2.4.2 assign routing mode
????assign routing mode模式布線約束操作與route類似,選中要布線約束的net,右鍵后選擇Assign Routing Mode進(jìn)入設(shè)置界面

選擇load net delay進(jìn)入設(shè)置load界面,Cell Pins中會(huì)顯示該net所連接的load,此處只有一個(gè),未選擇時(shí)“OK”圖標(biāo)

點(diǎn)擊第一行,此時(shí)“OK”高亮,點(diǎn)擊"OK",

????????進(jìn)入Routing Assignment界面,下圖右側(cè)中,Assgined Nodes顯示的是將布線約束的net分為了多個(gè)Net Gap,通俗理解即分為多段,在該欄中任選一行,左側(cè)Device中對(duì)應(yīng)藍(lán)色高亮顯示該Net。
????????在Neighbor Nodes選中任意一個(gè)nodes后,Neighbor Nodes中會(huì)對(duì)應(yīng)顯示該net的node在Base Tile中的其他可連接的nodes。

在Aaaigned Nodes中也可以對(duì)任意一個(gè)Nodes執(zhí)行刪除,或在該Nodes前后添加Net Gap

設(shè)置Assigned nodes后,點(diǎn)擊下方的“Assign Routing”圖標(biāo),彈出左側(cè)的Assign Routing窗口,點(diǎn)擊“OK”進(jìn)行Fix Routing,最后ctrl+s保存約束

XDC約束文件中新增ff_s1的FIXED_ROUTE約束,對(duì)應(yīng)內(nèi)容展示了約束net所經(jīng)過的路徑

三、參考
官方用戶手冊(cè)《ug903-vivado-using-constraints》