1、基本概念
推薦閱讀,Ally Zhou編寫的《Vivado使用誤區與進階》系列文章,熟悉基本概念、tcl語句的使用。
《Vivado使用誤區與進階》電子書開放下載!!
2、Vivado中的語法例程
1)語法例程
約束的語句可以參考vivado中的,注意其中的rise_data是指由上升沿采樣的數據,默認由fall發出。實際使用時也可以由rise發出rise_data,并由rise采樣,比如以太網MAC IP中的用法。
??
2)input約束
input delay:外部時鐘發送沿到數據頭的最大/最小延時;
-
中心對齊DDR:
采樣時,時鐘沿直接采樣自己下方的數據即可。由發送方調整好對齊關系。
-
Edge-Aligned(clock directly to FF)DDR
? ? ? 邊沿對齊,時鐘邊沿和數據邊沿同時變化(數據不是該時鐘沿發出的,而是上一個沿發出的),采樣時可對clk延時1/4周期時間完成中心對齊采樣。
?
-
Edge-Aligned(clock with MMCM)DDR
注意此處的MMCM是指phase shift mode采用waveform ,而不是latency模式。采用latency模式的時的約束同clock directly to FF。
3)output約束
output delay:數據頭到達采樣沿的最大最小時間(這是下游器件對FPGA管腳處的時序要求)。不論是skew based還是setup/hold based,都是告知FPGA數據頭/尾到采樣沿需要的時間max/min。
3、時序分析
? ? input,output中的-max用于分析setup,-min用于分析hold。vivado中對output做時序分析的點在FPGA的輸出管腳端,即在此處比大小slack。
4、forwarded clock
源同步輸出時的clock處理方式用ODDR轉發,相位不翻轉180°時用如下源語及約束,反相180時.D1(1'b0),.D2(1'b1),時鐘約束中增加-invert。
? ?ODDRE1 #(
? ? ? .IS_C_INVERTED(1'b0), ? ? ? ? ? // Optional inversion for C
? ? ? .IS_D1_INVERTED(1'b0), ? ? ? ? ?// Unsupported, do not use
? ? ? .IS_D2_INVERTED(1'b0), ? ? ? ? ?// Unsupported, do not use
? ? ? .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version for simulation functionality (ULTRASCALE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
? ? ? .SRVAL(1'b0) ? ? ? ? ? ? ? ? ? ?// Initializes the ODDRE1 Flip-Flops to the specified value (1'b0, 1'b1)
? ?)
? ?ODDRE1_clk (
? ? ? .Q(O_src_clk), ? // 1-bit output: Data output to IOB
? ? ? .C(W_rsc_clk), ? // 1-bit input: High-speed clock input
? ? ? .D1(1'b1), // 1'b1 -same with clk,1'b0 -invert to clk
? ? ? .D2(1'b0), // 1'b0 -same with clk,1'b1 -invert to clk
? ? ? .SR(!I_rst_n) ?// 1-bit input: Active-High Async Reset
? ?);?
create_generated_clock -name O_src_clk -source [get_pins clk_wiz_0_inst/clk_out1] -multiply_by 1 [get_ports O_src_clk]