用DC综合异步电路

一般来说是不能用同步电路的综合工具来综合异步电路。同步电路会自动插入缓冲器,而这些缓冲器可能毁坏QDI电路的时序特性。然而手动生成门级网表又如何保证DRC能满足流片要求呢?在我看来,为了满足max transition和max capacitence要求,缓冲器仍然是不可避免的。使用综合工具来综合异步电路仍然有可取之处。

回到主题。在这个帖子里,我会讲一些用DC综合异步电路的基本问题:

  1. 异步元件库
    实际上这个并不是很重要。当然我们需要建一个基本的硬件元件库。对于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不被拆解。
  2. timing loop
    异步电路有很多timing loop。无论是否设定延迟优化约束,这些timing loop都必须被打断。否则DC很可能会产生错误的结果或者使用过多的内存而产生内部错误。
    打断这些timing loop可以用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了。在这里也可以看到直接用目标原件搭建异步元件库的好处。
  3. 限制buffer的使用
    元件库往往提供了不同驱动能力的缓冲器,从很小到很大。而实际的综合过程中,禁止使用驱动能力过小或过大的缓冲器往往能得到更好的时序并减少运行时间。驱动能力过小的缓冲器对时序没有太大的帮助,可能增大走线的难度同时增加了门数量(placement时间变长)。过大的缓冲器有较大的输入负载并有着较高的动态功耗。
  4. 限制max_transition和max_capacitence
    实际实验发现,即使没有设定任何延时约束,使用合适的DRC约束仍然能改变电路的速度性能。这里给出的建议是使用适中的max_transition和max_capacitence会得到较好的速度结果。
  5. 使用set_max_delay来约束延时
    显然在没有时钟的情况下我们不能使用clock来约束电路。用virtual clock往往也是行不通的。异步电路的控制电路较为复杂,直接使用virtual clock意味着使用input port到output port的简单约束。然而这种约束得到的关键路径往往和实际的关键路径相差甚远。用set_max_delay来设定更为细化的路径约束有更好的结果。需要指出的是,DC默认set_max_delay的起点不能是其他时序路径的中间点。也就是说,一旦一个pin被设为一个path的起点,那么它也被设上了disable_timing的属性。所以,用set_max_delay来打断timing loop也是一个有效的方法(在该约束的理解上,SoC encounter和ICC不同,所以最好使用ICC为布局布线工具)。
  6. 合理的约束
    所有的路径最好都有约束。这里包括关键路径和主要的反馈路径。但是他们有区别。对于关键路径我们需要它尽量得快,但是反馈路径,只要足够快就可以。所以在约束的时候,对于关键路径可以过约束,但是对于反馈路径,一定不能过约束。
  7. 使用不同的权重
    DC的slack计算是negtive_slack*weight。通过控制不同路径的weight,我们就能够告诉DC先解决那些路径的时序问题(DC先解决slack最大的路径)。设定不同路径的权重可以使用group_path命令。
  8. min library
    同步电路往往使用min_max分析。用max library分析setup,同时用min library分析hold。对于异步电路来说,我们不需要分析hold问题(max_delay属于setup,min_delay属于hold)。这样我们就可以把min library换成typical library。这样有一个好处,就是DC生成的sdf文件中,min_delay实际上是typ_delay。如果需要得到在typical环境下的速度性能,仿真的时候使用sdf的min delay就可以了。
Advertisements

火车票在伦敦用地铁换站需要买地铁票吗?

TNND,我终于拿到葡萄牙的申根签证了。头一回遇到一个申根签证居然花了我1个月,都快赶上申请个美国签证了。葡萄牙人还真是让人头疼。不说这个了。

到葡萄牙的一个小地方开会,我需要从伦敦stansted机场起飞。买的火车票要在伦敦Euston站坐地铁换到Tottenham Hale站。火车票上写了包含Virgin的火车和所有connections(连接的火车),但是这个到底包不包含地铁呢?呵呵,我知道某些爱玩的人肯定知道答案,但对我是个问题,着实让我头疼了一把。

查了好多地方,看起来有些老外也不明白,最后终于找到个地方写了。最后的答案是:

Travelling ‘via’ London
Rail tickets for journeys via London can be used on London Underground or First Capital Connect’s Thameslink route between London terminals at no additional cost. For example, a Brighton to Leeds ticket is valid on London Underground between Victoria and Kings Cross.
You can ‘break your journey’ and leave the Underground service en route. However, you’ll need to buy another ticket in order to continue your journey.
Travelling to a station within London
Single and return tickets are also available for through journeys to London Underground and the Docklands Light Railway.
http://mobile.nationalrail.co.uk/stations_destinations/connections/crossing_london.html

只要火车票的行程中表明了要用地铁转乘,那么这就包含了在伦敦坐地铁的费用。(老外的交通系统还是很发达的,不知咱们那天也能把天上地下的交通工具都给统一起来。不过他们的交通工具是真的贵呀。我基本上出门靠走。)

无语