我目前正在研究一个采用莱迪思半导体公司的低功耗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仅支持有限的通配符,还有其他可能性吗?有人知道这个奇怪的时间报告可能意味着什么吗?