找回密码
 注册
关于网站域名变更的通知
查看: 172|回复: 2
打印 上一主题 下一主题

VIVADO时序约束及STA基础简介

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-21 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 STGing 于 2022-9-26 19:15 编辑
3 P+ F( k  z2 f% L4 f0 S% m% Q* T( s
一、前言
; E1 F: H/ l9 E4 n% p6 {无论是FPGA应用开发还是数字IC设计,时序约束和静态时序分析(STA)都是十分重要的设计环节。在FPGA设计中,可以在综合后和实现后进行STA来查看设计是否能满足时序上的要求。本文阐述基本的时序约束和STA操作流程。; ?) g5 J/ D- [+ c: [. p, l
9 g8 q! @6 y0 w3 p# ~
二、时序约束与XDC脚本
- F; A8 t4 |% Z0 c+ z. j  时序约束的目的就是告诉工具当前的时序状态,以让工具尽量优化时序并给出详细的分析报告。一般在行为仿真后、综合前即创建基本的时序约束。Vivado使用SDC基础上的XDC脚本以文本形式约束。以下讨论如何进行最基本时序约束相关脚本。
. J; Y. {. y7 x% U4 t1 时序约束首要任务是创建主时钟,主时钟即为时钟引脚进入时钟信号或高速收发器生成时钟。[create_clock]2 Q: S9 v. P6 }8 U9 _8 {/ N% `
  create_clock -name clk_name -period N -waveform {pos_time neg_time} [get_ports port_name] (划线部分可选): |# {- O/ m6 Y: t% N+ S0 K% h5 {
  创建两个异步的主时钟:
- K9 X+ n( E9 B) C0 L1 K1 p+ o  create_clock -name clk_a -period 10 [get_ports clk_a]8 E: D1 G6 W0 f: |1 I
  create_clock -name clk_b -period 15 [get_ports clk_b]
1 }8 c  k! w* i- f  set_clock_groups -asynchronous -group clk_a -group clk_b9 C( }* u1 H& i, e1 @
  当两个主时钟是异步关系,它们生成时钟同样是异步关系:+ n4 _  F" Y1 a
  set_clock_groups -asynchronous -group [get_clocks clk_a -include_generated_clocks] \& g* ^1 y' H+ s$ s; |: U
  -group [get_clocks clk_b -include_generated_clocks]/ R, f2 J- o* X% t- n. V
  差分时钟仅约束P端口:
/ K1 O  H# P$ D% y  create_clock -name clk -period 10 [get_ports clk_p]' f$ U2 n1 e# d1 w
  高速收发器生成时钟作为主时钟:0 A$ p9 J" v0 [/ L
  create_clock -name gt0_txclk -period 8  [get_pins GT0/.../TXOUTCLK]
; C+ h  G1 A# I  有一种特殊情况无需与具体引脚绑定,即创建虚拟时钟。该约束用于设定输入/输出延迟。需要创建虚拟时钟的场景是输入FPGA的数据由FPGA内部产生时钟采样,如串口通信。% A0 E* ]( x) p8 a
  create_clock -name clk_v -period 5
) U% y% V# ], ]2 创建主时钟后,需要约束生成时钟:[create_generated_clock]
- W+ h7 z4 ?, p- E* a! s  生成时钟分为两种。由PLL MMCM等专用时钟单元生成产生的时钟信号,Vivado会自动产生相关约束。还有一种是自定义生成时钟,一般为逻辑分频得到。
  ^, f+ u; ?6 U# i3 E% Y  时钟源是时钟端口:
6 n; B8 Q/ |( x  create_generated_clock -name clk_div -source [get_ports clk] -divide_by 2 [get_pins rega/Q] 意思是在rega单元的Q引脚上的时钟信号clk_div是由clk经过2分频得到的生成时钟。" B% A5 ^4 Y9 q- K: P" X
  时钟源是引脚:# F3 ]) h6 ]7 P& X
  create_generated_clock -name clk_div -source [get_pins rega/C] -divide_by 2 [get_pins rega/Q]9 Q' O& y- P/ J7 c
  除了使用-divide_by -multiply_by表示主时钟和生成时钟的频率关系,也可以用 -edges实现更精确的表达:9 M" Y" x8 K3 i; a+ X
  create_generated_clock -name clk_div -source [get_pins rega/C] -edges {1 3 5} [get_pins rega/Q]
" v8 e8 i" Z5 _' r  相移关系使用-edge_shift命令描述。
/ n5 ~& b( H* r' o  该约束命令还常用于重命名时钟信号:1 A* j" M* D$ v7 ]) H: G
  create_generated_clock -name clk_rename [get_pins clk_gen/.../CLKOUT0]
8 T- }0 _1 N3 |2 @) q: {3 创建时钟组:[set_clock_groups]6 i0 l# j6 m0 M+ Y) J" _
  a. 异步时钟情况:
' F/ Q0 W+ G) P7 F, Y  set_clock_groups -asynchronous -group clk_a -group clk_b  clk_a和clk_b是异步时钟。% F* q* A7 n: P) B+ n5 R% x! |9 z
  b. 物理互斥情况:& G% y2 T, D( V- u
  create_clock -name clk_a -period 10 [get_ports clk]4 J" W2 f% }. }! j* z  E( g
  create_clock -name clk_b -period 8 [get_ports clk] -add
& C1 P2 f% l% X- H  create_clock -name clk_c -period 5 [get_ports clk] -add
! E3 E$ |: ~3 n# W% s4 X4 w" Q  set_clock_groups -physically_exclusive -group clk_a -group clk_b -group clk_c$ Q/ J, N' ^0 Q( f
  该种情况仅是为了观察clk引脚时钟信号周期依次为10ns 8ns和5ns时,时序是否收敛。因此这三个时钟物理上不同时存在。  E+ G! F- D/ ]' h( h
  c. 逻辑互斥情况:
7 A  Y" |! Z; ]8 e; `  set_clock_groups -logically_exclusive\  @0 z0 q+ n0 `: i
  -group [get_clocks -of [get_pins clk_core/.../CLKOUT0]] -group [get_clocks -of [get_pins clk_core/.../CLKOUT1]]
) C7 G8 ^8 D, H2 z  clkout0和clkout1送入到BUFGMUX中,后续根据sel信号确定选择哪一个作为工作时钟。此时clkout0和clkout1同时存在电路中,但仅有一个会作为后续电路工作时钟,因此逻辑上互斥。9 D7 c, h1 M- \7 T" b$ w* N
  特殊用法:当asynchronous 的group只有一个,说明改组内时钟是同步的,但与其他所以时钟异步。  w- p8 r6 _% v1 A4 _: v; X/ I' m; }
4 设置伪路径:[set_false_path]# a- ^* B! p" p+ U
  设置伪路径后,不再对特殊路径进行时序分析。特殊路径如测试逻辑、添加同步电路后的跨时钟域路径等。在两个时钟域之间应该相互设置为set_false:. y8 Y# z& y! T8 @/ X
  set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]
* q" U6 e% F7 _0 X  f5 _% c  set_false_path -from [get_clocks clk_b] -to [get_clocks clk_a]
0 H2 q- p/ `: q# L$ p& w
! x* Z8 Q& t6 l! l" G  K! M; i' B  Z

VIVADO时序约束及STA基础简介.pdf

498.37 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-9-21 13:14 | 只看该作者
本帖最后由 Maskman 于 2022-9-26 20:12 编辑
' T# Y# W# G8 H' ^0 \" s: N6 b$ W* x8 [  N3 N
时序约束和静态时序分析都是十分重要的设计环节,能为后续设计节约大量的资源和时间,

该用户从未签到

3#
发表于 2022-9-21 13:23 | 只看该作者
本帖最后由 jack_are 于 2022-9-26 20:12 编辑
$ H% ^. U- b8 x0 T' v) n6 z# j; e+ h$ l$ M
时序约束的目的就是告诉工具当前的时序状态。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-5 23:26 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表