首先必须要明确的是如果程序只用于仿真,那么几乎所有的语法和编程语句都可以使用。但如果程序是用于硬件实现,那么我们就必须保证程序的可综合性,即所编写的程序能被综合器转化为相应的电路结构。不可综合的HDL语句在用综合工具综合时将被忽略或者报错。对于这样的一个事实的存在,可以这么认为:HDL语言是硬件描述语言(HardWare Description Language)而不是正真意义上的硬件设计语言(HardWare Descine Language),虽然只用一字之差,但已经从字面的角度暴露出一些存在的问题!那这样的话,必然在可综合的方面存在一些差异。任何符合HDL语法标准的代码都是对硬件行为的一种描述,但不一定能够对应成电路的可设计信息。行为描述可以基于不同的层次,如:系统级,算法级,RTL级,门级,开关级。而有些时候我们试图做的是让软件去综合算法级或更加抽象的硬件行为描述。这个时候往往会产生可综合的问题。对于只能接受RTL或者更低层次描述的EDA软件来说实在是很难的实现!这些存在的东西最多也就是被仿真软件仿真下吧,在加上各种EDA软件的对于Veriolog HDL语言支持的差异,更加的会存在可综合的问题。但是值得庆幸的是,虽然不同的综合工具对Verilog HDL语法结构的支持不尽相同,但Verilog HDL中某些典型的结构是很明确地被所有综合工具支持或不支持的。
(1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。
(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。
在上述这么多的可综合的风险的存在下,我们有必要遵循一定的编程规则:
要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:
(14)避免在case语句的分支项中使用x值或z值。
要写代码前必须对具体的硬件有一个比较清晰的概念但是想一次完成可综合代码就太夸张了,verilog的自顶向下设计方法就是从行为建模开始的,功能验证了以后再转向可综合模型.太在意与可综合令初期设计变得太累
很同意这种看法,在做逻辑结构设计时,综合的因素是要考虑的,但是有很多东西不能考虑的过于细致,就是在设计的时候不能过于紧卡时延,面积等因素,因为这样以来综合后优化的余量就会很小,反而不利与设计的优化,如果在时延和面积要求不是很紧张的情况下,其实代码写的行为级,利用综合工具进行优化也是一种方法。偶就听说有一家很有名的公司,非常相信综合工具的优化能力,从来不作综合后仿真的,hehe.当然,如果面积和时延的要求很高,最好还是把代码写的底层一点,调用库单元时,也要充分考虑其面积和时延的因素。
同时,我们也可以增加自己的判断,如果要有一个相对客观的标准的话,一般来说,在RTL级的描述中,所以逻辑运算和加减运算,以及它们的有限次组合都是可综合的。但是最可靠的,还是要靠具体的实践来证明!正如开头所说,各个厂家的EDA软件之间是存在一定的差异的!
参考资料:
《电脑语句》http://blog.163.com/liyin_ping_happy@126/blog/static/4993226320088151161336/
《浅谈VHDL/Verilog HDL的可综合性以及对初学者的一点建议》http://hi.baidu.com/200600651/blog/item/fef93d1e7b243fcea68669ca.html
《基于Verilog HDL语言的可综合性设计》http://www.ahcit.com/lanmuyd.asp?id=2955
文章评论(0条评论)
登录后参与讨论