|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 winever 于 2014-3-7 20:04 编辑
最近看了一些关于verilog coding style的文章,产生了一些疑问,还请论坛里的大牛指点一下。简而言之,我的疑问就是verilog应该怎么写,才能将电路描述的更准确,综合以后产生的电路更合理???
我先把我看到的一些文章里的想法说一说,供大家讨论。如果论坛里的大牛能结合语言和工具将这个问题深入浅出地阐述一下,那就再好不过了。在此,小弟先谢过了!
1. Partition the design into small functional blocks, and use a behavioural style for each block. Avoid gate level descriptions except for critical parts of the design.------"The Veriolg Golden Reference Guide", DOULOS, Version 1.0, August 1996.
这句话的字面意思是:把系统按照功能划分成小的子模块,每个子模块用行为级描述,除了关键部分外,避免使用门级描述。为什么避免用门级描述?我的理解是,门级描述已经将电路的结构细化到各种逻辑门(如与非,或非,反相器等),不利于综合工具的进一步优化。更直白地来讲,门级描述对于综合工具来讲就是“所见即所得”,这降低了综合工具在综合过程中所付出的努力(effort),但同时也关上了综合工具对电路进行优化的大门。当然,对于有特殊的设计考虑或者经过精心设计的模块,本来就不希望综合工具对电路做出任何改变,这种情况采用门级描述就恰好。
2. Where possible, register module outputs and keep the critical path in one block. Placing the registers on module out-puts also simplifies the compilation process because timing budgets for registered module outputs are not needed. Instantiating a set of pre-compiled basic building blocks can reduce the complexity of the design and the associated compile effort even for larger modules. The last point is to keep most of the logic in the leaf modules.This simplifies the compilation process because the top-level modules will need little or no compilation and constraints can more easily be propagated down the hierarchy. ------“Writing Successful RTL Descriptions in Verilog”, Mike Parkin, Sun Microsystems, Inc.
这里所说的register module outputs是指模块的输出采用reg型,还是说在模块的输出端加上register?我比较倾向于后一种,因为并不是说把输出的数据类型定义为reg型,实际的输出就一定是经过寄存的。我们知道,always语句中必须用reg型,但电平敏感的always语句实际上是被综合成组合逻辑的,而组合逻辑的输出是不经过寄存的,组合逻辑在任何时候都是输入变则输出跟着变(除了存在一些门延时和连线延时)。那么具体到写verilog,具体到一个module,register module outputs这个tip应该如何实现呢?当然,上面也提到了register module outputs的好处:如果一个module的outputs被register了,那么在综合的时候,就不用对这个module的outputs做时序分析了?这显然涉及到了综合工具的行为,希望论坛里的大牛指点迷津。上面还提到,如果一个大的module中包含一些已经综合过的基本模块,就可以降低这个module的复杂性以及对这个module综合时所花费的effort。我对pre-compiled的理解是经过综合的,即已经被综合成了门级网表。最后两句话的字面意思是把绝大多数的电路都放在最小,最基本(leaf)的模块中,这样顶层模块在综合的时候就几乎不费effort,并且综合时所设置的约束可以很容易传递到设计的底层。那么,结合前面的那个pre-compiled,我是不是可以这样理解:要把一个设计尽量分解到一些小模块,使设计层次化,大的module由一些小的module例化而成,而顶层的module又是由这些大的module例化而成。另外,这些所谓的leaf module应该被细分到什么程度呢?显然,第1条中不赞成门级描述,那么这里的leaf modules指的是不是诸如编译码器、多路选择器、加法器等基本的组合电路以及触发器、计数器、移位寄存器等基本的时序电路?
3.One goal of logic synthesis is to produce an optimal netlist that is independent of the original structure. Until this goal is achieved, controlling the structure of a logic description is one of the best ways to ensure an optimal implementation.
------“Writing Successful RTL Descriptions in Verilog”, Mike Parkin, Sun Microsystems, Inc.
第一句话好像在说综合工具能够得到一个不受verilog源代码结构影响的最佳的电路网表,但这貌似只是综合工具的一个目标而已,还没实现。所以,后一句又说,设计人员必须清楚地知道自己的代码所描述的电路是什么,这样才能确保得到一个好的设计。更直白地来说,你要告诉综合工具你写的代码是个什么电路,是decoder?还是mux?不能写一个四不像的东西让综合工具自己去判断,这样得到的电路可能逻辑上没有问题,但性能可能上不去。也就是说,一段代码必须规范、标准、干脆、利索,是组合电路就是组合电路,是时序电路就是时序电路,不要拖泥带水。但是这貌似又跟第二条中register module outputs有点儿矛盾,因为组合电路本身的输出是不register的。register组合电路的输出,那得到的个什么东西?
4.The use of structure to control the synthesis process is the main ingredient for success when writing RTL descriptions. The designer should code the RTL to reflect the desired hardware structure.
------“Writing Successful RTL Descriptions in Verilog”, Mike Parkin, Sun Microsystems, Inc.
这两句话说明了系统结构的划分对电路的重要性,设计者应该清楚代码所描述的电路结构。简单来说,如何将一个设计划分成若干个module,这对于最终的电路有重要的影响。
5.最后我说一下我自己以前写verilog的习惯。我以前习惯于把电路分解到基本的组合电路和时序电路,比如说编译码器、多路选择器、计数器、触发器等,这些基本的组合和时序电路用行为级描述。top-level是几个大module的例化,大module是按照功能划分的,然后大的module里就是这些基本电路的例化。也就是说,整个设计是三个层次的。我不知道我这样子做是否合理,因为,在这种情况下,貌似综合工具的优化功能就没有用武之地了。
个人觉得好的coding style对于数字前端设计很重要,可以规避潜在的问题,更重要的是能提高电路的性能;另外,模块的划分对于最终的电路也有很大的影响,这貌似跟综合工具对于电路边界的处理有关。对于上述的问题,我觉得很大程度上是因为对综合工具在综合过程中的行为不甚了解而导致的,希望论坛里的大牛能指点一二,不胜感激!
如果要找一个最能体现电路设计灵魂的词,应该就是tradeoff了,这是很多大牛的共识。上面的这些问题,应该也没有绝对的正确或错误,归根结底仍然是一个折中的问题,任何事情都是过犹不及。
最后,所有的这些也可以归结为一个词,那就是experience,如果有业界的大牛能谈一谈业界的经验和做法,那就真的是感激涕零了。
最后的最后,希望大家能积极地就以上问题发表意见,如果能把以上问题理的比较清楚,虽然谈不上国家幸甚,民族幸甚,最起码如我一样的小白和菜鸟,真的是幸甚了。 |
|