SDC无法为静态时序分析定义约束

时间:2018-08-30 15:35:23

标签: tcl verilog fpga timing ice40

我目前正在研究一个采用莱迪思半导体公司的低功耗FPGA Ice40的项目。

用于设计FPGA程序的程序称为IceCube2。

设计应以相对较高的时钟频率运行。 对于某些相当复杂的操作,我需要降低更新率。 现在,我经常阅读,您应该使用时钟启用信号以及快速时钟来获得最佳结果。

因此,必须使用SDC语言来约束多周期时钟,以表明该逻辑还有一些额外的时间来完成其任务(因为时钟使能信号会降低更新速率)。 SDC是源自TCL的语言。

如果未添加此约束,则静态时序分析将失败。 但是,几个月来,我在定义这些约束时遇到了很多麻烦。 我不太了解SDC语法,因此很难找到一个很好的来源。 icecube2中有一个工具可以生成SDC代码,但我认为它没有那么有用。

我用Verilog编写代码。在我的设计中,有一个顶层模块,其中包含寄存器,如:

reg  MCC2_data_available_irq_o;
reg  MCC2_buffer_quarter_irq_o;

此外,我包括一个模块“ div_stage_entity ”。在此模块中,有 一些寄存器,看起来像:

reg [DIVISOR_BIT_WIDTH+QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0] MCC2_minu   [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0];    
reg [DIVISOR_BIT_WIDTH-1:0] MCC2_subtra [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS:0];                                               
reg [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0] MCC2_quot [QUOT_POST_COMMA_BITS+QUOT_PRE_COMMA_BITS-1:0];                        

我添加了名称前缀 MCC2 ,以表示必须将时钟约束应用于这些寄存器。 Icecube中的约束编辑器现在输出如下所示的SDC代码:

set_multicycle_path  -from [get_clocks {clk_f}]  -to [get_pins {div_stage_entity.MCC2_subtra_2_[12]/D}] 2 
set_multicycle_path  -from [get_clocks {clk_f}]  -to [get_pins {div_stage_entity.MCC2_subtra_0_[1]/D}] 2 
set_multicycle_path  -from [get_clocks {clk_f}]  -to [get_pins {div_stage_entity.genblk3[1].MCC2_minu[1][8]/D}] 2 
set_multicycle_path  -from [get_clocks {clk_f}]  -to [get_pins {div_stage_entity.genblk3[1].MCC2_minu[1][12]/D}] 2  

整个文件长约300行。维护该文件将是一件很痛苦的事情。因此,我想将这些约束合并在一起。 我想要类似的东西:

set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {MCC2_*/D}] 2
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.MCC2_*/D}] 2
set_multicycle_path -from [get_clocks {clk_f}] -to [get_pins {div_stage_entity.genblk*.MCC2_*/D}] 2

但是,这些约束被忽略了。运行时序检查时,收到的路径不符合时序。 该报告如下所示:

Start            read_adr_freeze_4_LC_10_5_3/lcout
End              MCC2_data_available_irq_o_LC_14_1_2/in3
Reference        clk_f
Setup Constraint 11240(p)
Path Slack       -2985(p)

Capture Clock Arrival Time(clk_f:R#2)      11240
+ Master Clock Source Latency                  0
+ Capture Clock Path Delay                  3512
- Setup Time                                -728
------------------------------------    --------
End-of-path required time (ps)             14023

Launch Clock Arrival Time(clk_f:R#1)           0
+ Master Clock Source Latency                  0
+ Launch Clock Path Delay                   3512
+ Clock To Q                                1391
+ Data Path Delay                          12106
------------------------------------    --------
End-of-path arrival time (ps)              17008

负松弛表示路径未通过定时检查。如果约束正确应用, 捕获时钟的到达时间应为〜22ns(周期时间为11.1ns)。报告中的到达时间为11.24ns。这表明完全没有应用约束。

此外,显示的路径不是在寄存器处结束(将显示为“ / D”),而是在组合逻辑中的某处(“ / in3”)结束。 对我来说,后面的部分没有任何意义。我敢肯定,这是一个寄存器,而不是一些闩锁。

如何将这样的约束合并在一起?看起来IceCube仅支持有限的通配符,还有其他可能性吗?有人知道这个奇怪的时间报告可能意味着什么吗?

0 个答案:

没有答案