热度 2| ||
许久不更新了,感觉生活少了什么似的。埋头苦干,到头来收获了什么?是变强了也变秃了,还是TO一个又一个片子的成就感?仁者见仁智者见智。这近一年来,在诸多项目中耕耘,也挣扎。struggle这个单词挺有意思,奋斗、挣扎。工作占据了几乎全部的日常,到头来我到底是收获了还是失去了?这是就想到一个词,balance,如何能平衡工作与生活?平衡精神与肉体?大概是需要很长的日子去探索。那么在后端设计中,如何实现时钟树的平衡呢?也是一个值得思考的问题。
不管是做事还是做tree,大抵都要先有个目标。好了,不再啰嗦,记录一下项目中的时钟树的调节操作。
学习时钟结构,了解同步时钟,异步时钟,生成时钟以及分频时钟的结构分布。
了解子模块的时钟长度
了解时钟频率,设置相应的target skew
用工具生成spec,学习spec,根据需要修改spec
以一个简化的例子来记录时钟树的调节。subsystem的core,里面包含一个hard macro。简化时钟为一个主时钟core_clk, 一路下去,分频为一个div_clk, 之后分别驱动hard macro和一堆flip flop。
第一步,按照sdc生成spec,工具自动做tree。结果,reg2macro的hold violation有 -1ns,debug tree发现macro这一路总长1.5ns,flip flop只有500ps。原来是macro内部的clock没有被考虑在balance中。工具只认到macro的cp端。
第二步,反标macro的tree长,设置1ns的insertion delay,让macro这一路比其他的短了1ns来保持总体的平衡。结果,所有的flip flop都长到了1ns,但是macro这一路还是1.5ns。原因是,原始的ff只能长到500ps,macro没办法比他少1ns,只能拉长所有的tree。但是,由于来自同一个主干,垫的buffer都在common path,macro也相应的别垫长了。问题没有解决。
第三步,干预spec,给macro这一路单独建tree,把macro隔离出来。
在macro ck pin前一级找一个buffer,或者自己插一个ck buffer 叫做my_buffer
create_ccopt_clock_tree -name my_macro_tree -source my_buffer/ck
create_ccopt_skew_group -name my_macro_tree -source my_buffer/ck -exclusive_sinks macro/ck
set_ccopt_property target_insertion_delay 0.010 -skew_group my_macro_tree
这个10ps的insertion delay可以根据需要修改。然后给另一对ff也创建类似的group,设target insertion delay 1ns
这样ccopt_design -cts之后,reg2macro的hold的violation基本在10ps左右,可以根据情况调节。
利用恰饭时间,记录一个调tree的小case。