子模块级sgdc和top层sgdc兼容问题
模块块级sgdc文件在TOP级别不兼容,导致SOC的结果不匹配。差异在于模块级“时钟名称”定义与TOP层定义不匹配,例如各种约束中的“时钟/from_clk/to_clk”用法。时钟名称总是唯一的,并与定义它的特定引脚/端口相关联。在TOP级运行时,任何模块级定义的时钟名称都无效。
有两种方法可以处理此问题
1. Use if/else as mentioned below. we need to define the designName variable in .prj or sgdc file.
setvar designName perif_top
if {$designName == perif_top} {
qualifier -name "ABC" -from_clk "cfgClk" -to_clk "apbCoreClk"
} else {
qualifier -name "ABC" -from_clk “klamath.U_core.U_global_top.U_clk_gen.U_occ_top.\occ_inst[8].occ_U .fastClkOut” -to_clk “klamath.U_core.U_global_top.U_clk_gen.U_uart0_cfg_clk_gate.sync_U2.sclkgx4_u0.Q”
}
2. Use “clock tag” instead of clock name if constraint supports it. And match the block level tag with TOP tag.
qualifier -name "ABC" -from_clk_tag "cfgClk" -to_clk_tag "apbCoreClk"
上述两种方法都是自顶向下的方法,非常耗时,并且严重依赖于TOP级定义。理想的解决方案当然是使用hierarchical abstract文件而不是sgdc文件,因此我们不必处理这些依赖性/差异。
如果在语法中使用时钟,时钟差异也会影响constraints and waivers。