Vivado是Xilinx系列FPGA開(kāi)發(fā)環(huán)境。本文記載收錄了vivado常用開(kāi)發(fā)技巧,隨機(jī)記錄、隨時(shí)更新。。。
任何Xilinx相關(guān)問(wèn)題都可到WELCOME TO XILINX SUPPORT!查詢
1. STA
靜態(tài)時(shí)序分析(Static Timing Analysis, STA):簡(jiǎn)介及內(nèi)容導(dǎo)航
VIVADO的綜合屬性ASYNC_REG
1.1. 同步器
在XDC中作如下約束,表示對(duì)名字末尾為_cdc_to
的寄存器不進(jìn)行STA
set_false_path -through [get_pins -hier *cdc_to*]
同時(shí),對(duì)于跨時(shí)鐘域的同步寄存器,要作如下聲明。這樣這幾個(gè)同步寄存器就可以接收異步信號(hào),且會(huì)布局到同一個(gè)SLICE/CLB來(lái)提高M(jìn)ean Time Between Failure(MTBF)
(*ASYNC_REG = "TRUE"*)reg res_cdc_to;
(*ASYNC_REG = "TRUE"*)reg res_d1;
1.2. Report Timing Summary
詳細(xì)報(bào)告可以點(diǎn)擊Open Implemented Design下的Report Timing Summary,之后在右側(cè)TIming一欄中選擇具體的路徑顯示延遲
上圖中,我們將From觸發(fā)器看作是UFF0,To觸發(fā)器看作是UFF1,則時(shí)序路徑可簡(jiǎn)化為如下圖
名詞解釋如下
● Slack:建立時(shí)間裕量
● Levels:邏輯級(jí)數(shù),從UFF0/Q到UFF1/D之間組合邏輯器件的個(gè)數(shù)
● Fanout:表示從這一點(diǎn)連接到了幾個(gè)目的端點(diǎn),fanout = 1就表示連接了1個(gè)目的端點(diǎn)
● From To:發(fā)起觸發(fā)器與捕獲觸發(fā)器
● Total Delay:路徑UFF0/CK到UFF1/D的總延遲,即
T
C
K
2
Q
U
F
F
0
+
T
U
F
F
0
/
Q
_
t
o
_
U
F
F
1
/
D
T_{CK2Q}^{UFF0}+T_{UFF0/Q\_to\_UFF1/D}
TCK2QUFF0?+TUFF0/Q_to_UFF1/D?
● Logic Delay:路徑UFF0/CK到UFF1/D的邏輯元件延遲,包括觸發(fā)器延遲
T
C
K
2
Q
U
F
F
0
T_{CK2Q}^{UFF0}
TCK2QUFF0?
● Net Delay:路徑UFF0/CK到UFF1/D的走線延遲
由此可見(jiàn),Total Delay = Logic Delay + Net Delay
之后雙擊Path 5那一行,得到該時(shí)序路徑的時(shí)序報(bào)告,如下
Summary一欄:
● slack:建立時(shí)間裕量,為正表示這條路徑是滿足建立時(shí)間要求
● source:源端觸發(fā)器,即時(shí)序分析的起點(diǎn),發(fā)射沿(Launch Edge)
● destination:目的觸發(fā)器,即時(shí)序分析的終點(diǎn),鎖存沿(Latch Edge)
● path group:時(shí)序分析的時(shí)鐘源
● path type:路徑類型,此路徑為建立時(shí)間的分析
● requirement:時(shí)序要求,設(shè)定為25MHz,所以就是40ns
● data path delay:路徑UFF0/CK到UFF1/D的總延遲,即
T
C
K
2
Q
U
F
F
0
+
T
U
F
F
0
/
Q
_
t
o
_
U
F
F
1
/
D
T_{CK2Q}^{UFF0}+T_{UFF0/Q\_to\_UFF1/D}
TCK2QUFF0?+TUFF0/Q_to_UFF1/D?
● logic levels:邏輯級(jí)數(shù),從UFF0/Q到UFF1/D之間組合邏輯器件的個(gè)數(shù)
● clock path skew:時(shí)鐘到達(dá)目的寄存器和源寄存器之間的時(shí)間差值
● clock uncertainty :時(shí)鐘的不確定度,包括skew和jitter
Source Clock Path一欄:
● Delay Type:路徑CLK到UFF0/CK產(chǎn)生時(shí)延的項(xiàng)目。從表中可見(jiàn)是IO-走線-IBUF-走線-BUFG-走線
● Incr(ns):每個(gè)項(xiàng)目的時(shí)延。例如IBUF時(shí)延是1.749ns、BUFG實(shí)驗(yàn)室0.120ns
● Path(ns):截止到目前項(xiàng)目,時(shí)延的累加和。例如IO-走線-IBUF-走線-BUFG的時(shí)延累計(jì)為3.709ns
Data Path一欄:
● Delay Type:路徑UFF0/CK到UFF1/D產(chǎn)生時(shí)延的項(xiàng)目。從表中可見(jiàn)是FDRE-走線
● Arrival Time:即路徑CK到UFF1/D的時(shí)延總和
以及下圖
Destination Clock Path一欄:
● Delay Type:路徑CLK到UFF1/CK產(chǎn)生時(shí)延的項(xiàng)目,考慮了時(shí)鐘周期、時(shí)鐘不確定度和建立時(shí)間
● Required Time:即
T
c
l
k
+
T
C
L
K
2
U
F
F
1
/
C
K
+
T
c
l
k
_
p
e
r
m
i
s
s
i
m
o
n
?
T
c
l
k
_
u
n
c
e
r
t
a
i
n
?
T
s
e
t
u
p
U
F
F
1
T_{clk}+T_{CLK2UFF1/CK}+T_{clk\_permissimon}-T_{clk\_uncertain}-T_{setup}^{UFF1}
Tclk?+TCLK2UFF1/CK?+Tclk_permissimon??Tclk_uncertain??TsetupUFF1?
并且滿足 Slack = Required Time - Arrival Time
《基于Xilinx的時(shí)序分析、約束和收斂》目錄與傳送門(mén)
2. 編譯
2.1. 一直卡在route_design問(wèn)題
綜合能通過(guò)說(shuō)明能生成網(wǎng)表,但布局布線一直不成功,可能是沒(méi)地方放了。
可查看工程名.runs/synth_1/runme.log
信息,文中顯示number of nodes with overlaps
一直在刷新,且等號(hào)右邊的值一直不為零,為零才表示布局布線找到可行解。并且每次迭代iteration
WNS一直為負(fù),導(dǎo)致卡在route design。
可能的原因如下:
- IP核設(shè)置不合理,例如multiplier用的是LUTs就會(huì)導(dǎo)致布線時(shí)間長(zhǎng),應(yīng)該為Mults。
- 設(shè)置了多個(gè)同名IP核,建議建立新的工程重新設(shè)置IP
- BUFR改為BUFG等clock buffer使用是否正確
可通過(guò)回溯更改內(nèi)容鎖定問(wèn)題位置。
Router is stuck at “Number of Nodes with overlaps…”
What is “Number of Nodes with overlaps” parameter in implementation?
3. 綜合
《Vivado Design Suite User Guide Synthesis - UG901》
Vivado使用技巧(24):HDL/XDC中設(shè)置綜合屬性
3.1. Report
在點(diǎn)擊Open Implemented Design之后,可以在TCL中直接輸入以下指令獲取部分報(bào)告
vivado之report
利用率報(bào)告 report_utilization
功耗報(bào)告 report_power
擁塞 report_design_analysis -congestion
時(shí)序違例路徑 report_design_analysis -max_paths 50 -setup
工程編譯完成之后,點(diǎn)擊Open Implemented Design,之后tcl中輸入以下內(nèi)容即可顯示最差的50條路徑
report_design_analysis -max_paths 50 -setup
3.2. IOB
為了保證FPGA輸入輸出接口的時(shí)序,一般會(huì)要求將輸入管腳首先打一拍再使用,輸出接口也要打一拍再輸出FPGA。這樣做的目的是為了讓這打一拍的寄存器約束到IO Buffer(IOB)上,從而使得每一次編譯輸入或者輸出的時(shí)序不會(huì)發(fā)生改變。
這是因?yàn)?,IOB是FPGA上距離IO最近的寄存器,并且位置固定。當(dāng)你輸入或者輸出采用了IOB約束,那么就可以保證從IBUF到達(dá)寄存器或者從寄存器到達(dá)OBUF之間的走線延遲最短,即輸入端走線為IO-IBUF-ILOGIC-...
,輸出端走線為...-OLOGIC-OBUF-IO
最大限度保證時(shí)序滿足要求,同時(shí)由于IO的位置是固定的,所以每一次編譯都不會(huì)造成輸入或者輸出的時(shí)序發(fā)生改變。
哪些信號(hào)需要置于IOB呢?對(duì)于關(guān)鍵輸入輸出信號(hào),對(duì)時(shí)序有要求的信號(hào),都要布置到IOB上,其他電平信號(hào)則無(wú)需布置、時(shí)鐘信號(hào)無(wú)需布置、LVDS非時(shí)鐘信號(hào)只需布置p端。
FPGA基礎(chǔ)資源之IOB的應(yīng)用
配置
可在XDC中對(duì)接口信號(hào)作約束
set_property IOB true [get_ports {port_name}]
或者是在verilog中作約束,如下所示
(*IOB = "TRUE"*)output res_o,
...
(*IOB = "TRUE"*) reg a;
同時(shí)在verilog中要保證:輸入信號(hào)以及輸出信號(hào)和其所直連的寄存器之間 不能存在任何時(shí)序邏輯、任何組合邏輯和走線分支。且那個(gè)直連的寄存器,就會(huì)被放入IOB中。
檢查
工程編譯完成后,打開(kāi)Open Implemented Design,再下方Tcl Console中輸入tclapp::install ultrafast
后回車(chē)
之后再在Tcl Console中輸入xilinx::ultrafast::report_io_reg
后回車(chē),則出現(xiàn)IO Ports Summary 表格
其中
● Info為Unconnected的信號(hào),無(wú)需布置
● Info為No Input FF的信號(hào),其ILOGIC為0,表示該輸入信號(hào)未連接到IOB
● Info為No Output FF的信號(hào),其OLOGIC為0,表示該輸出信號(hào)未連接到IOB
● Info無(wú)信息的信號(hào),其ILOGIC為1或OLOGIC為1,表示該信號(hào)已連接到IOB。雙向信號(hào)要ILOGIC和OLOGIC均為1
3.3. 安全狀態(tài)機(jī)
狀態(tài)機(jī)中的default語(yǔ)句意思是異常狀態(tài)下?tīng)顟B(tài)機(jī)能跳轉(zhuǎn)到正常狀態(tài),但EDA工具會(huì)對(duì)default語(yǔ)句自動(dòng)忽視,這是對(duì)狀態(tài)機(jī)進(jìn)行優(yōu)化的結(jié)果。
而安全狀態(tài)機(jī)模式改變了狀態(tài)機(jī)編碼方式,在異常狀態(tài)下也能跳轉(zhuǎn)至正常狀態(tài),應(yīng)當(dāng)進(jìn)行配置。
vivado 如何設(shè)置安全狀態(tài)機(jī)模式
配置
推薦的寫(xiě)法是,在verilog中將 所有狀態(tài)機(jī)的狀態(tài)寄存器加入安全聲明,并且位寬與實(shí)際使用一致,即定義如下
(*fsm_safe_state = "reset_state"*) reg [2:0] cur_state;
檢查
編譯完畢后,打開(kāi)工程目錄下/*.runs/synth_1/runme.log
若顯示如下內(nèi)容,則表示安全狀態(tài)機(jī)配置成功
Implemented safe state 'reset_state' for state register 'cur_state_reg' in module '...'
encoded FSM with state register 'cur_state_reg' using encoding 'Hamming 2' in module '...'
若只顯示如下內(nèi)容,沒(méi)有顯示Implemented safe state...
,則表示配置失敗
encoded FSM with state register 'cur_state_reg' using encoding 'one-hot' in module '...'
3.4. DONT_TOUCH
DONT_TOUCH 屬性可以用于保護(hù)信號(hào)或module不會(huì)在綜合、布局布線階段被優(yōu)化掉。與 KEEP 和 KEEP_HIERARCHY 屬性相比,DONT_TOUCH還能在布局布線時(shí)起作用,而且有更高的優(yōu)先級(jí)。可用于等效寄存器、等效組合邏輯保留。
示例代碼如下:
(*DONT_TOUCH = "TRUE"*) wire sig1;
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;
VIVADO學(xué)習(xí)筆記之–DONT_TOUCH
Vivado防止信號(hào)被綜合掉的三種方法
Vivado綜合屬性系列之七 DONT TOUCH
3.5. MAX_FANOUT
可通過(guò)Open Implementation Design之后,在tcl中寫(xiě)入如下語(yǔ)句顯示幾個(gè)最大扇出的路徑
report_high_fanout_nets
report_high_fanout_nets -help
設(shè)置寄存器和組合邏輯信號(hào)的最大扇出限制(即最大驅(qū)動(dòng)元件數(shù)量)。超出該設(shè)置值時(shí),會(huì)復(fù)制一個(gè)完全相同的寄存器或組合邏輯。
(* MAX_FANOUT=50 *) reg sig1; //Verilog示例
Vivado那些事兒—扇出分析與優(yōu)化
4. Device Primitive Instantiation
即Vivado源語(yǔ),可看作是參數(shù)化的IP,可直接設(shè)置參數(shù)例化IP,無(wú)需在IP Catalog中設(shè)置好了再例化。
下面介紹幾種常用的源語(yǔ)。
4.1. IO Components
Input/Output Differential Buffers (IBUFDS/OBUFDS)
對(duì)于FPGA設(shè)計(jì)者來(lái)說(shuō),需要將外部輸入的差分信號(hào)轉(zhuǎn)成單端信號(hào)、或?qū)味诵盘?hào)轉(zhuǎn)成差分信號(hào)輸出,需要用到IBUFDS和OBUFDS兩個(gè)源語(yǔ),例化如下
IBUFDS #(
.DIFF_TERM ("TRUE" ), // Differential Termination
.IBUF_LOW_PWR ("TRUE" ), // Low power="TRUE", Highest performance="FALSE"
.IOSTANDARD ("LVDS" ) // Specify the input I/O standard
) IBUFDS_inst (
.O (data_clk_tmp ), // Buffer output
.I (data_clk_p ), // Diff_p buffer input (connect directly to top-level port)
.IB (data_clk_n ) // Diff_n buffer input (connect directly to top-level port)
);
OBUFDS #(
.IOSTANDARD ("LVDS" ), // Specify the output I/O standard
.SLEW ("SLOW" ) // Specify the output slew rate
) OBUFDS_inst (
.O (tx_frame_p ), // Diff_p output (connect directly to top-level port)
.OB (tx_frame_n ), // Diff_n output (connect directly to top-level port)
.I (tx_frame ) // Buffer input
);
Output Double Data Rate(ODDR)
4.2. Clock Buffers
Xilinx FPGA輸入輸出緩沖 BUF 的使用
4.3. Xilinx Parameterized Macros(XPM)
XILINX-VIVADO IP參數(shù)化方法(XPM)
《Vivado Design Suite 7 SeriesFPGA and Zynq-7000 SoCLibraries Guide》 - ug953
可以參數(shù)化例化IP,例如FIFO、Dual port RAM等,可以從 vivado內(nèi)的Language Templates中尋找。
XPM IP自身的RTL設(shè)計(jì)文件路徑在xxx\Xilinx\Vivado\2019.1\data\ip\xpm
注意XPM中MEMORY_SIZE
、FIFO_WRITE_DEPTH
單位都是bit,必須為2的次冪
4.4. Unimacros
《Vivado Design Suite 7 SeriesFPGA and Zynq-7000 SoCLibraries Guide》 - ug953
也是一種參數(shù)化例化IP的方法,詳見(jiàn)文檔說(shuō)明
5. 工程目錄組織
可以直接參考RTL Project Directory,了解一個(gè)工程的文件夾目錄如何組織。
6. ECO (Engineering Change Order)
ECO指的是Engineering Change Order,即工程變更指令。目的是為了在設(shè)計(jì)的后期,快速靈活地做小范圍修改,從而盡可能的保持已經(jīng)驗(yàn)證的功能和時(shí)序。ECO的叫法算是從IC設(shè)計(jì)領(lǐng)域繼承而來(lái),其實(shí)在以往的FPGA設(shè)計(jì)上已被廣泛采用。簡(jiǎn)單來(lái)說(shuō),ECO便相當(dāng)于ISE上的FPGA Editor。
工程編譯完畢后,在/xxx.runs/impl_1/
目錄下有*_opt.dcp, *_place.dcp, *_route.dcp
三個(gè)文件,分別對(duì)應(yīng)opt_design、placed_design和routed_design之后的文件,可根據(jù)對(duì)網(wǎng)表修改程度的大小,選擇某一階段的DCP文件進(jìn)行ECO。
ECO可實(shí)現(xiàn)修改ILA、增加/刪除/修改內(nèi)部CELL、RAM/ROM/FF初值等功能。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-506265.html
Vivado-ECO修改網(wǎng)表進(jìn)行加速debug
Vivado ECO實(shí)例教程一 增加LUT(GUI操作)
“揭秘” Xilinx FPGA 的 ECO 功能
《Vivado Design Suite User Guide Implementation》 - ug904 - Chapter 3 - Vivado ECO Flow文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-506265.html
到了這里,關(guān)于FPGA開(kāi)發(fā)環(huán)境 Vivado的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!