|
发表于 2016-5-8 18:41:03
|
显示全部楼层
最近看了一些关于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),但同时也关上了综合工具对电路进行优化的大门。当然,对于有特殊的设计考虑或者经过精心设计的模块,本来就不希望综合工具对电路做出任何改变,这种情况采用门级描述就恰好。
避免使用Gate Level來寫critical parts.這個部份我說一下我的想法.在很久之前,電路合成軟體還不是做的很好時,你用Gate level去寫RTL Code,會干擾到電路合成的結果.但是現在的科技己經進步了,所以這個問題應該是有解決了.並不是不能用Gate level 去寫,只是是因為電路合成軟體的關係.那試想在沒有Verilog HDL 之前,電子工程師是如何開發電路呢,那個時候可是用Gate一個一個拼出來的.
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指的是不是诸如编译码器、多路选择器、加法器等基本的组合电路以及触发器、计数器、移位寄存器等基本的时序电路?
現在的合成軟體己經很進步了.先把電路做pre-compile是否有必要,可以看一下你所使用的電路合成軟體的說明文件.十年前是需要這樣做會加快電路合成的速度,但是十年過去了,我想電路合成軟體演算法應該己經進步了.至於電路的output要做register處理.這個部份我說一個觀念的問題.RTL Level Code.什麼是RTL ,RTL是指Register-Transfer Level,所以當我們常在說我在寫RTL Code指的就是在寫Register-Tranfer Level層級的Code.即然是在寫RTL Code,就是你的輸出都是由Register Output.所以Module output應該是要Register的,這樣比較符合你在寫RTL Code.而電路合成軟體都是希望使用者的Module output都是有Register的.這樣合成演算法會比較單純,但是你如果硬要把Module output用wire來寫,也是可以,我相信現在的軟體應該都可以解決.在很久以前會限定每一個Module應該要多大,也是因為軟體的關係,但是現在應該這個限制都很少了.我還是建議去看一下你所使用的合成軟體的說明文件,裏面會有很多有用的東西.
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组合电路的输出,那得到的个什么东西?
你所說的觀念完全正確.但是我再補充一點.我是比較極端.我都把MUX,DECODER,COUNTER的RTL Code都背起來了.雖然寫成這些電路功能的RTL Code寫法可能有千百種,但是我只背下可以讓電路合成軟體正確合成出我想要電路的coding style.所以我寫的RTL Code都是固定的,這雖然會增加Code的行數,但是這也確保了我寫出來的RTL Code經過電路合成之後,是百分之百正確變成我所想要的電路.
我覺得你不要太拘泥於組合電路是不是有register輸出.其實組合電路也是時序電路的一部份,數位電路設計有大部份是在寫FSM(有限狀態機).在FSM中就同時有組合電路及時序電路.你可以把你的格局放到FSM上,這樣對你的Verilog Coding會有很大的幫助.
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里就是这些基本电路的例化。也就是说,整个设计是三个层次的。我不知道我这样子做是否合理,因为,在这种情况下,貌似综合工具的优化功能就没有用武之地了。
非也.綜合工具優化的功能並不是在這裏,而是在把你寫的RTL Code準備地轉變成Gate Level Code.其實有時候fatten mode也是一個選項.你的Module分的好的好處主要是module reuse.不然如果改天老闆要你改一個小功能,結果因為你的功能partition做的不好,需要重寫整個電路,那真的是太沒有效率了.
个人觉得好的coding style对于数字前端设计很重要,可以规避潜在的问题,更重要的是能提高电路的性能;另外,模块的划分对于最终的电路也有很大的影响,这貌似跟综合工具对于电路边界的处理有关。对于上述的问题,我觉得很大程度上是因为对综合工具在综合过程中的行为不甚了解而导致的,希望论坛里的大牛能指点一二,不胜感激!
如果要找一个最能体现电路设计灵魂的词,应该就是tradeoff了,这是很多大牛的共识。上面的这些问题,应该也没有绝对的正确或错误,归根结底仍然是一个折中的问题,任何事情都是过犹不及。
最后,所有的这些也可以归结为一个词,那就是experience,如果有业界的大牛能谈一谈业界的经验和做法,那就真的是感激涕零了。
最后的最后,希望大家能积极地就以上问题发表意见,如果能把以上问题理的比较清楚,虽然谈不上国家幸甚,民族幸甚,最起码如我一样的小白和菜鸟,真的是幸甚了。
從你的文字中表達出你太拘泥coding style了.這樣會讓你在未來做電路設計時,在寫RTL Code時,會礙手礙腳.經驗很重要沒錯,但是也要有犯錯的勇氣,及學習的肚量.建議你可以掌握幾個原則,也是你之前提到的,我幫你整理一下.
第一點:什麼是好的coding style.語意清楚的RTL Code就是好的RTL Code.人們常可以寫出語法正確的RTL Code(軟體思維),但是卻不知道自己寫的東西會讓綜合軟體會錯意.但是能讓綜合軟體看得懂(語意清楚)的RTL Code其實是很固定的(硬體思維). 回應到你文章裏所說的.设计者应该清楚代码所描述的电路结构.
第二點:讀一下綜合軟體的參考文件(reference manual).每一家EDA做出來的綜合軟體能力大不同.有時因為公司財力的關係,無法使用到最好的綜合軟體時,更應該去看看你們公司用的綜合軟體的文件,因為其中會講一些使用的限制或是建議的coding style. |
|