FPGA设计时序约束十五、Set_Bus_Skew

本文详细介绍了Vivado工具中的SetBusSkew命令,用于解决跨时钟域通信中的时钟偏斜问题。文章涵盖了SetBusSkew的基本概念、设置界面、命令语法以及在工程示例中的应用,还提到了如何通过报告分析和设置来优化设计。
摘要由CSDN通过智能技术生成

目录

一、序言

二、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)
    begin
    if(!rst)
        src_send<=0;
    else 
        src_send<=d;
    end

always@(posedge dest_clk)
    if(!rst)
        begin
            syn_reg[0]<=0;
            syn_reg[1]<=0;  
            syn_reg[2]<=0;  
            syn_reg[3]<=0;      
        end
    else
        begin
            syn_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)
        begin
        src_data[0]<=0;
        src_data[1]<=0;
        end
    else 
        begin
        src_data[0]<=in[0];
        src_data[1]<=in[1];            
        end

always@(posedge dest_clk)
    if(!ce)
        begin
        out[0]<=0;
        out[1]<=0;
        end
    else
        if(des_infer) 
            begin
            out[0]<=src_data[0];
            out[1]<=src_data[1];           
            end

endmodule

综合网表连接图如下图所示

 

约束文件,源时钟周期为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   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值