目录
一、序言
二、Set Bus Skew
2.1 基本概念
2.2 设置界面
2.3 命令语法
2.4 报告分析
三、工程示例
3.1 工程代码
3.2 时序报告
四、参考资料
一、序言
在时序约束中,对时钟的约束除了set clock latency,set clock uncertainty,set input jitter外,还有一条set bus skew的约束命令。该命令主要用于跨时钟域的场景中,下面将对set bus skew的使用进行详细的介绍。
二、Set Bus Skew
2.1 基本概念
Set Bus Skew用于在多个跨时钟域路径中设置一个最大的偏斜要求,可以限制用于发送数据的源时钟沿的数目以及被目的时钟沿捕获。和普通路径上的时钟偏斜不同,bus skew对应的是约束下所有路径中最大的捕获时钟偏斜值,该值同时应用到fast corner和slow corner。
Bus skew约束通常用于以下几种跨时钟域的拓扑结构中:
a) 格雷码总线切换中,例如异步FIFOs
b)带有CE,MUX或MUX hold的多比特跨时钟域电路中
c) 配置寄存器的跨时钟域
尽管set_bus_skew命令可以设置一个总线偏斜约束到同步跨时钟域中,但这种做法是多余的,因为setup和hold检查已经可以确保在两个时序安全的同步跨时钟域路径间安全切换。
总线偏斜约束不属于时序例外,和set_data_check一样,它属于时序断言。因此,总线偏斜约束不会被时序例外约束,如set_clock_group,set_false_path,set_max_delay,set_multicycle_path约束影响,仅可能会被route_design优化掉。
约束设置时建议将总线偏斜约束到没有扇出fanout的路径上,并且,每个总线偏斜约束必须覆盖最少两个起点和两个终点。
2.2 设置界面
进入Timing Constraints界面,在左侧Assertions栏中选中Set Bus Skew,右侧即显示Set Bus Skew
设置界面中Specify bus skew设置总线信号上最快的信号和最慢的信号间的偏斜,start points和end points分别设置起点和终点,Through points设置中间路径,也可不设。同时,也可指定只分析rise、fall或都分析
约束from/to的对象,只能为Cells或cell pins或clocks
through的对象则只能为Cells,Nets或Cell Pins
2.3 命令语法
命令格式
set_bus_skew [-from <args>] [-to <args>] [-through <args>] <value>
2.4 报告分析
set_bus_skew的分析报告和普通时序报告结果查看有些不一致。可以通过tcl console使用命令或界面运行Report Bus Skew,进入Reports → Timing → Report Bus Skew
对报告进行显示设置
也命令执行report_bus_skew -delay_type max -max_paths 10 -name bus_skew_2,bus_skew_2为报告名
三、工程示例
3.1 工程代码
设计中跨时钟域是握手机制的一部分,当数据被采样时源时钟发送数据。目的时钟域用了一个4阶同步器来同步发送信号。在4阶同步器之后,信号驱动跨时钟域寄存器的时钟使能端口CE.在这种场景下,必须设置总线偏斜来调整包含CE端口路径上的阶段数,因为它代表了数据有效时目的时钟周期的数目。
module set_bus_skew(src_clk,dest_clk,rst,ce,d,in,out);
input src_clk,dest_clk,rst,ce;
input d;
input [1:0] in;
output reg [1:0] out;
reg [3:0] syn_reg;
reg src_send;
reg [1:0] src_data;
always@(posedge src_clk)beginif(!rst)src_send<=0;else src_send<=d;endalways@(posedge dest_clk)if(!rst)beginsyn_reg[0]<=0;syn_reg[1]<=0; syn_reg[2]<=0; syn_reg[3]<=0; endelsebeginsyn_reg[0]<=src_send;syn_reg[1]<=syn_reg[0]; syn_reg[2]<=syn_reg[1]; syn_reg[3]<=syn_reg[2]; end
assign des_infer=~syn_reg[3];
always@(posedge src_clk)if(!rst)beginsrc_data[0]<=0;src_data[1]<=0;endelse beginsrc_data[0]<=in[0];src_data[1]<=in[1]; endalways@(posedge dest_clk)if(!ce)beginout[0]<=0;out[1]<=0;endelseif(des_infer) beginout[0]<=src_data[0];out[1]<=src_data[1]; endendmodule
综合网表连接图如下图所示
约束文件,源时钟周期为5ns,目的时钟周期为2.5ns,set_bus_skew对两个起点src_data_reg[0]/src_data_reg[1]和两个终点out_reg[0]/out_reg[1]设置总线偏斜约束
create_clock -period 5.000 -name src_clk -waveform {0.000 2.500} [get_ports src_clk]
create_clock -period 2.500 -name dest_clk -waveform {0.000 1.250} [get_ports dest_clk]
set_max_delay -from [get_cells src_send_reg] -through [get_cells {{out_reg[0]} {out_reg[1]}}] 10.000
set_bus_skew -from [get_cells {{src_data_reg[0]} {src_data_reg[1]}}] -to [get_cells {{out_reg[0]} {out_reg[1]}}] 0.100
3.2 时序报告
先对总线偏斜设置为0ns,此时路径时序违例
将总线偏斜约束设置为0.5ns,违例消失,设置的0.5ns补偿违例的0.492ns,因此,结果为0.008ns
四、参考资料
用户手册:ug903-vivado-using-constraints-en-us-2022.2.pdf
链接:https://pan.baidu.com/s/17AK_-J4wRXiFLtLTorlrwg?pwd=mylt
提取码:mylt