• FPGA设计时序约束五、设置时钟不分析路径


    一、背景

        在进行时序分析时,工具默认对所有的时序路径进行分析,在实际的设计中,存在一些路径不属于逻辑功能的,或者不需要进行时序分析的路径,使用set_false_path对该路径进行约束,时序分析时工具将会直接忽略路径不进行分析。

    1.1 设置false path的场景   

    可以设置为false path的路径包括

    a)跨时钟域中添加的进行两次同步的逻辑单元

    b) 只在FPGA通电启动时的寄存器

    c)复位或测试的逻辑模块

    d)异步的分布式RAM中读时钟和写时钟之间的路径

    下面,展示一个对于上面提到的非功能单元的路径,在两个触发器中级联了两个选择器,选择器的选项信号相同。

     

    1.2 set_false_path的优势

    a)减少运行时间:将一些路径设置为false path后,时序分析工具无需耗费时间对该路径进行分析,也不需要对非功能模块路径进行优化,可以节省时间

    b)提高QOR(quality of results):将路径设置为false path可以极大地提高QOR,综合,布局后的质量,优化设计也会极大地受工具尝试解决的时序问题影响。

        因为如果非功能模块的路径存在时序违例时,工具可能尝试去修复这些违例,这不仅会导致设计因为逻辑复制而变大,也可能因为非功能模块有更大的违例而忽略了实际功能模块的违例问题。只有正确的设置约束才能获取最好的结果。

    二、set_false_path

    2.1 设置说明

    进入Timing Constraints,选择Exceptions中Set False Path

     

    Set False Path设置界面如下

     

    Start Point:设置false path的起点,可以为Cell pins,clocks,cells,I/O ports;

    Through Points:设置false path经过的中间路径,可以为Nets,cells,cell pins;

    End Points:设置false path的终点,可以为Cell pins,clocks,cells,I/O ports;

     

    Setup/Hold:设置False path的路径的分析类型为Setup 或hold,不勾选时,两者都会为False Path

    Rise/Fall:设置False path的路径中生效的边沿,不勾选时,不会进行边沿区分

    Remove existing path exceptions before setting false path:勾选后,如果设置的路径上已存在其他exceptions约束,则会将其覆盖,不勾选则保留原有的约束。

    备注:当使用through时没有设置-from和-to参数时需注意,所有经过through设置的线路都会被视为false path。

    2.2 细节区分

    a)多个-through时,顺序不同结果不同,下面两条约束不是等价的,第一条表示先通过cell1/pin1,再通过cell2/pin2的路径,第二条约束则相反

    1. set_false_path -through cell1/pin1 -through cell2/pin2
    2. set_false_path -through cell2/pin2 -through cell1/pin1

    b)get_cells连接多个单元时,表示从复位端口reset到多个cells(ff1_reg,ff2_reg,ff3_reg)中的路径都将设为false path

    set_false_path -from [get_ports reset] -to [get_cells {ff1_reg ff2_reg ff3_reg}]

    c)不对两个异步时钟clk1,clk2间的路径进行分析,只会将从clk1到clk2间的路径设置为false path

    set_false_path -from [get_clocks clk1] -to [get_clocks clk2]

    d)如果要对clk1到clk2,clk2到clk1的路径都设置为false path,则需要两条约束命令

    1. set_false_path -from [get_clocks clk1] -to [get_clocks clk2]
    2. set_false_path -from [get_clocks clk2] -to [get_clocks clk1]

    e)当需要对多个异步时钟间都不进行时序分析时,对异步时钟两两间设置false path则太繁琐,此时可使用set_clock_groups代替

    set_clock_groups -name clk_group -asynchronous -group [get_clocks clk1] -group [get_clocks clk2] -group [get_clocks clk3]

    f)在两个寄存器间的非正常逻辑功能路径中,设置false path可以只使用两个through,而不用指定start point和end point

     

    命令中MUX1/a0和MUX2/a1位置不能换,交换后则表示先经过MUX2/a1再经过MUX1/a0

    set_false_path -through [get_pins MUX1/a0] -through [get_pins MUX2/a1]

    f)对于异步双端口分布式RAM,写操作和RAM的时钟是同步的,读操作可以不同步,因此,在写时钟和读时钟间设置false path符合设计需求,rd_clk为读时钟,wr_clk为写时钟,有两种约束方式可以实现

     

    方法一、设置从写寄存器到读寄存器的false path

    set_false_path -from [get_cells <write_registers>] -to [get_cells <read_registers>]

     方法二、设置从写使能端口WE到RAM的路径

    set_false_path -from [get_cells -hier -filter {REF_NAME =~ RAM* && IS_SEQUENTIAL && NAME =~ <PATTERN_FOR_DISTRIBUTED_RAMS>}]

    三、工程示例

    工程代码

    1. module timing(clk1,clk2,clk3,clk4,ce,d1,d2,out,ff1_2,ff4 );
    2. input clk1,clk2,clk3,clk4,ce,d1,d2;
    3. output out,ff1_2,ff4;
    4. reg ff1,ff1_2,ff2,ff3,ff4;
    5. wire comb,comb4;
    6. always@(posedge clk1,negedge ce)
    7. begin
    8. if(!ce)
    9. begin
    10. ff1<=0;
    11. ff1_2<=0;
    12. end
    13. else begin
    14. ff1<=d1;
    15. ff1_2<=ff1;
    16. end
    17. end
    18. always@(posedge clk2,negedge ce)
    19. begin
    20. if(!ce)
    21. ff2<=0;
    22. else begin
    23. ff2<=d2;
    24. end
    25. end
    26. assign comb=ff1*ff2;
    27. always@(posedge clk3,negedge ce)
    28. begin
    29. if(!ce)
    30. ff3<=0;
    31. else begin
    32. ff3<=comb;
    33. end
    34. end
    35. assign out=ff3;
    36. assign comb4=ff1_2*out;
    37. always@(posedge clk4,negedge ce)
    38. begin
    39. if(!ce)
    40. ff4<=0;
    41. else begin
    42. ff4<=comb4;
    43. end
    44. end
    45. endmodule

    主时钟和生成时钟约束

    1. create_clock -period 10.000 -name create_clk1 -waveform {0.000 5.000} [get_ports clk1]
    2. create_generated_clock -name gen_clk_2 -source [get_pins ff1_reg/C] -divide_by 4 -add -master_clock create_clk1 [get_pins ff2_reg/C]
    3. create_generated_clock -name gen_clk_3 -source [get_pins ff1_reg/C] -multiply_by 4 -add -master_clock create_clk1 [list [get_pins ff2_reg/C] [get_pins ff3_reg/C]]
    4. create_generated_clock -name gen_clk_4 -source [get_pins ff1_reg/C] -edges {1 4 5} -edge_shift {0.000 1.000 0.000} -add -master_clock create_clk1 [get_pins ff4_reg/C]

    未设置set_false_path时,异步时钟路径create_clk1存在到gen_clk_4的路径,下图蓝色线所示路径

     

    设置create_clk1到gen_clk_4的false path约束,inter-clock paths中只剩gen_clk_3到gen_clk_4的路径,无create_clk1到gen_clk_4的路径

    set_false_path -from [get_clocks create_clk1] -to [get_clocks gen_clk_4]

     

    四、参考资料

    用户手册:ug903-vivado-using-constraints-en-us-2022.2.pdf

    链接:https://pan.baidu.com/s/17AK_-J4wRXiFLtLTorlrwg?pwd=mylt 

    提取码:mylt  

  • 相关阅读:
    原型设计模式
    SLAM从入门到精通(数据回放工具之rosbag)
    字节迎来新 CFO,或重启上市;马斯克以 440 亿美元收购 Twitter;FFmpeg 支持 JPEG-XL|极客头条
    Hadoop启动后jps发现没有DateNode解决办法
    SAP 电商云 Spartacus UI SiteContextUrlParams 的实现明细介绍
    前端开发规范
    学习阿里如何进行数据指标体系的治理
    Linux sed命令增删改查 附代码
    第三十章 使用 CSP 进行基于标签的开发 - 控制流
    精品Python的农村振兴平台防贫助农
  • 原文地址:https://blog.csdn.net/zyp626/article/details/133838215