今天讲一个非常简单的设计思想,这个东东也是IC设计方法里的基本矛盾之一:模块划分与overdesign。
模块划分乃是IC设计最基本也最经典的概念之一。该步骤出现在芯片架构设计之初。多方设计人员一起讨论,决定要做什么功能,各个功能究竟要做到什么程度。然后将整个芯片切分成多个逻辑清晰的子模块,决定由谁来实现各个子模块,通常伴随着一些嘴仗跟讨价还价。讨论结束之后,每个人就会大致清楚自己要实现什么功能,然后双方会写作接口文档和自己模块的功能定义及大致框图。再接下来,各方进一步确定接口的信号名、位宽以及操作时序。最后开始各自独立研发,coding自己的模块。
模块划分允许多个IC设计人员同时协作,不需要考虑接口以外别人会怎么做,而只需要考虑自己的模块怎么做就行。毫无疑问,提高了工作效率。
但是并不一定会提高设计质量,因为它会带来overdesign的问题。
什么是overdesign?就是过度设计,IC设计人员因为不了解与之对接的模块是怎么coding的,也不关心对方是怎么coding的,导致很多情况下,考虑了过多的可能性,而把自己的设计搞得过于复杂。明明可以优化的地方,没有做到优化;明明不需要的东西,却增加了上去。
模块划分是很经典的概念,搞IC设计的人都知道,教科书也爱讲。但是没有人讲overdesign,因为这并不是一个经典的概念,也没有引起该有的重视。
很可惜的是,overdesign是很容易发生的事情。IC设计人员倾向于只在乎自己的功能模块,一旦接口定义完之后,就不会考虑对方会怎么做,只需要对方提供恰当的接口时序,对于对方的内部的行为不闻不问。
一个很常见的现象,就是IC设计人员在写作自己的模块的时候,会倾向于用很多buffer,而非实时处理。我先收到对方的内容,然后buffer住,这样我可以有更大的设计自由度决定何时处理。因为设计人员对对方模块没有精确的预期,不确定对方模块能否立即回应,多久回应,并且不愿冒风险假设对方模块会何时回应,所以更倾向于假设无论对方何时回应我都能够处理,这样自己的模块才更加strong。设计人员会认真考虑很多边界情况,即便这些边界情况不会发生,他也会做到自己的design里面去以防万一。
这些overdesign现象,主要原因是因为我们不了解对方的内部设计,有些时候又懒得沟通,深挖细节,所以采用一种保险稳妥的设计方案。有时候会导致,明明双方可以并行的地方,我们做不到并行,明明不需要的资源,我们无谓的加了上去。有时候对方给我们一根内部信号就能解决我们的控制难题,我们因为不知道对方有这个信号,所以自己兜兜转转费大量精力才搞定。
所以,在设计架构定义完成之后,每个设计者在对自己的模块有了深入细致思考之后,其实还需要一个设计步骤,双方需要再次开会,确定设计中有哪些可以压缩的地方,有哪些重复设计或者过度考虑的地方。这个会议的存在将会对整体架构进行一次优化,达到更高的设计水准。
简单来说,有两次会议非常重要。一次是在架构定义之初,各方开会决定怎么做模块划分,并对各个模块的功能有一个基本的讨论。另一次是各方对自己的模块进行了深入到RTL层的细致思考之后,再开一次会,确定各方的细致架构合在一起有什么冗余或者低效的地方,进行架构优化。两次会议,一次为“分”,一次为“合”,才是最合理的设计流程。
当然,很多团队并没有开第二次会议的习惯,如果有的话,你会惊讶于overdesgin的现象有多么普遍,也会惊讶于搞设计的人有多么闭门造车。
欢迎大家关注我的微信公众号:半导学社。