相关阅读
Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm=1001.2014.3001.5482
简介
常规多级触发器方案主要用于控制信号跨时钟域同步,该方案将目标时钟域中的触发器按照链状方式排列,如图1所示。
图1 常规多级触发器方案
图2是Ac_sync01规则提供的Spreadsheet,其中展示了跨时钟域相关细节。
图2 Ac_sync01规则提供的Spreadsheet
相关参数或约束
num_flops约束
默认情况下,Spyglass要求触发器链中至少存在两级触发器,使用SGDC约束中的num_flops命令可以指定最少的触发器数量,下面给出了一个例子。
// test.sgdc
num_flops -from_clk cdc_example.clk_a -to_clk cdc_example.clk_b -value 3
图3展示了这种情况下使用两级触发器进行跨时钟域同步时出现Ac_unsync01错误。
图3 两级触发器方案错误
allow_combo_logic参数
默认情况下,Spyglass允许通过组合逻辑跨时钟域,将allow_combo_logic参数设置为no可以禁止这种情况,下面给出了一个例子。
// test.prj
set_parameter allow_combo_logic no
图4展示了这种情况下通过组合逻辑跨时钟域时出现Ac_unsync01错误(实际上,即使allow_combo_logic参数设置yes,也只是不出现Ac_unsync01错误,但Ac_glitch03错误会出现,即Spyglass识别到毛刺)。
图4 组合逻辑跨时钟域错误
allow_combo_logic约束
作用与allow_combo_logic参数相同,区别在于可以指定一个模块,下面给出了一个例子。
// test.sgdc
allow_combo_logic -name "MD1"
output_not_used约束
默认情况下,Spyglass不允许触发器链中的触发器(除最后一级触发器)有多个扇出,output_not_used约束可以设置一个输出端口为不使用的,允许触发器链中的触发器有额外扇出到该输出端口,下面给出了一个例子。
// test.sgdc
output_not_used -name "cdc_example.action_b"
图5展示了这种情况下触发器链中的触发器有额外扇出到输出端口。
图5 允许额外扇出
allow_half_sync参数
默认情况下,Spyglass允许半同步器,即触发器链中的某些触发器由目标时钟的不同边沿触发,将allow_half_sync参数设置为no可以禁止这种情况,下面给出了一个例子。
// test.prj
set_parameter allow_half_sync no
图6展示了这种情况下使用半同步器时出现Ac_unsync01错误。
图6 半同步器错误
strict_double_flop参数
当strict_double_flop参数设置为yes时,仅当源触发器与目标触发器之间存在另一个触发器(其实这种情况下,该触发器才被视为源触发器),并且该触发器的时钟信号与源触发器相反,才会视为已同步,下面给出了一个例子。
// test.prj
set_parameter strict_double_flop yes
图7展示了满足严格双触发器的情况。
图7 严格双触发器
最后顺带一提,该跨时钟域方案支持源对象为触发器或黑盒,但如果strict_double_flop参数设置为yes,则不允许源对象为黑盒。