在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8953|回复: 21

[讨论] 关于verilog coding style对逻辑综合结果的影响之讨论及如何更好地写verilog

[复制链接]
发表于 2014-3-7 20:01:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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,如果有业界的大牛能谈一谈业界的经验和做法,那就真的是感激涕零了。
最后的最后,希望大家能积极地就以上问题发表意见,如果能把以上问题理的比较清楚,虽然谈不上国家幸甚,民族幸甚,最起码如我一样的小白和菜鸟,真的是幸甚了。
发表于 2014-3-10 10:07:00 | 显示全部楼层
也是菜鸟,一起讨论,我觉得你能静下心写这么多文字去思考挺好,我也说说自己的想法
针对你的疑问:我觉得就是在写代码时要想这段代码会翻译成怎样的电路
2、3:register module outputs,这个就是你理解的那个,做代码检查时,一些组合逻辑的输出,它通常都会建议你打一拍出来,这样输出给其他模块时可以保证时序,但有时我们就是需要组合输出,所以不用打一拍,只要你能够保证不会出现时序问题就行。
那些leaf模块,比如同步电路,上升沿检查电路,最好做成小模块调用,这样方便后端做优化。比如两级dff同步电路吧,你做成一个模块,后端就会把这两个dff靠的很近保证时序,但如果你直接写在大module里,两个dff有可能隔得很远,时序就不能保证了。
 楼主| 发表于 2014-3-10 11:14:17 | 显示全部楼层
回复 2# haimo


    谢谢haimo的回复!关于register module outputs,如果说每一个块组合逻辑的输出端都寄存,那么多个这样的模块连起来,实际上就形成了两端是寄存器,中间是组合逻辑的结构,这其实就是流水线。而时序分析里所谓的建立保持时间,以及组合逻辑的传播延时,貌似都是根据典型的流水线结构来定义的。这也让我回想起最初接触DC的时候,如果能在电路中找到这种典型的流水线结构,那么时序约束就会比较好写,因为每一个建立保持时间的定义都很明确;相反,如果找不到这种典型的流水线结构,那么就会感觉时序约束无从下手,因为根本就找不到建立保持时间的确切含义。另外,haimo关于leaf模块的阐述,也对我很有启发:对系统模块的划分,并不是要细分到电路的最小单元,而是要细分到功能的最小单元,虽然可操作性仍不强,但这个感性的认识很重要。最后,再次感谢haimo参与讨论!
发表于 2014-3-10 15:26:40 | 显示全部楼层
可以搜一下STARC,是东芝、松下、瑞萨、富士通几家公司合编的rtl风格教材,里面对需要怎么写、为什么要这么写、不这么写会有什么后果都说得很详细,比较靠谱。
 楼主| 发表于 2014-3-10 20:29:30 | 显示全部楼层
回复 4# orlye


    非常感谢orlye推荐的资料,我觉得这种大公司出的教材应该是很有权威性和实用性的,所以特地把这个资料放到论坛上,大家如有需要的话可以下下来看,或者给我个邮箱,我发给大家。http://bbs.eetop.cn/viewthread.php?tid=439090&extra=
发表于 2015-11-1 17:42:43 | 显示全部楼层
回复 5# winever


   十分的感谢啊
发表于 2015-11-10 21:30:43 | 显示全部楼层
楼主有心了,资料先拿走学习了,赞一个!
发表于 2016-1-20 22:21:26 | 显示全部楼层
回复 5# winever
高手啊,赞,我觉得需要整个代码设计风格的专题
发表于 2016-1-24 13:07:30 | 显示全部楼层
thank you for your sharing,
发表于 2016-3-4 10:38:05 | 显示全部楼层
谢谢楼主的分享,小白拿去学习一下,再次感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-24 14:42 , Processed in 0.033096 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表