http://benjaminweber-space.spaces.live.com/Blog/cns!902D90E6B6C36ACF!1177.entry用DC综合异步电路
一般来说是不能用同步电路的综合工具来综合异步电路。同步电路会自动插入缓冲器,而这些缓冲器可能毁坏QDI电路的时序特性。然而手动生成门级网表又如何保证DRC能满足流片要求呢?在我看来,为了满足max transition和maxcapacitence要求,缓冲器仍然是不可避免的。使用综合工具来综合异步电路仍然有可取之处。
回到主题。在这个帖子里,我会讲一些用DC综合异步电路的基本问题:
- 异步元件库
实际上这个并不是很重要。当然我们需要建一个基本的硬件元件库。对于4-phase的异步电路来说,同步电路的元件库就基本够用。比如说一个C-element就可以用如下的语句描述:
assign Z = (I1&I2) | (I1&Z) |(I2&Z);
这种方式看 起来很好,但是在后面会遇到问题。更好的方式是使用目标元件库来搭建一个C-element,比如:
module c2 ( a0, a1, q );
input a0;
input a1;
output q;
AO222EHD U1 ( .A1(q), .A2(a0), .B1(q), .B2(a1), .C1(a0), .C2(a1),.O(q) );
endmodule
这样做的好处有两点:我们可以直接找到一个C-element的pin;在必要的时候可以使用dont_touch来保护C-element不被拆解。 - timing loop
异 步电路有很多timing loop。无论是否设定延迟优化约束,这些timingloop都必须被打断。否则DC很可能会产生错误的结果或者使用过多的内存而产生内部错误。
打断这些timingloop可以用set_disable_timing命令。以下给出了如何把所有C-element的反馈回路打断:
foreach_in_collection celln[get_references-hierarchical c2_*] {
set_disable_timing [get_object_name $celln]/U1 -from A1 -to O
set_disable_timing [get_object_name $celln]/U1 -from B1 -to O
}
这里我们使用get_references来获得所有的C-element。对于每一个C-element,从反馈pin到输出的时间计算都被禁止,这样一个C-element就不存在timing loop了。在这里也可以看到直接用目标原件搭建异步元件库的好处。 - 限制 buffer的使用
元件库往往提供了不同驱动能力的缓冲器,从很小到很大。而实际的综合过程中,禁止使用驱动能力过小或过大的缓冲器往往能得到更好的时序并减少运行时间。驱动能力过小的缓冲器对时序没有太大的帮助,可能增大走线的难度同时增加了门数量(placement时间变长)。过大的缓冲器有较大的输入负载并有着较高的动态功耗。 - 限制max_transition和max_capacitence
实际实验发现,即使没有设定任何延时约束,使用合适的DRC约束仍然能改变电路的速度性能。这里给出的建议是使用适中的max_transition和max_capacitence会得到较好的速度结果。 - 使用set_max_delay来约束延时
显然在没有时钟的情况下我 们不能使用clock来约束电路。用virtualclock往往也是行不通的。异步电路的控制电路较为复杂,直接使用virtual clock意味着使用input port到outputport的简单约束。然而这种约束得到的关键路径往往和实际的关键路径相差甚远。用set_max_delay来设定更为细化的路径约束有更好的结果。需要指出的是,DC默认set_max_delay的起点不能是其他时序路径的中间点。也就是说,一旦一个pin被设为一个path的起点,那么它也被设上了disable_timing的属性。所以,用set_max_delay来打断timingloop也是一个有效的方法(在该约束的理解上,SoC encounter和ICC不同,所以最好使用ICC为布局布线工具)。 - 合理的约束
所有的路径最好都有约束。这里包括关键路径和主要的反馈路径。但是他们有区别。对于关键路径我们需要它尽量得快,但是反馈路径,只要足够快就可以。所以在约束的时候,对于关键路径可以过约束,但是对于反馈路径,一定不能过约束。 - 使用不同的权重
DC的slack计算是negtive_slack*weight。通过控制不同路径的weight,我们就能够告诉DC先解决那些路径的时序问题(DC先解决slack最大的路径)。设定不同路径的权重可以使用group_path命令。 - min library
同步电路往往使用min_max分析。用max library分析setup,同时用minlibrary分析hold。对于异步电路来说,我们不需要分析hold问题(max_delay属于setup,min_delay属于hold)。这样我们就可以把min library换成typicallibrary。这样有一个好处,就是DC生成的sdf文件中,min_delay实际上是typ_delay。如果需要得到在typical环境下的速度性能,仿真的时候使用sdf的min delay就可以了。