原创 Verilog HDL 可综合的初步分析

2010-8-22 11:50 3106 4 4 分类: FPGA/CPLD
这个问题的由来:硬件描述语言(HDL)编程的成功在于能不能综合。

       首先必须要明确的是如果程序只用于仿真,那么几乎所有的语法和编程语句都可以使用。但如果程序是用于硬件实现,那么我们就必须保证程序的可综合性,即所编写的程序能被综合器转化为相应的电路结构。不可综合的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赋值语句的可综合性,在建模时应注意以下要点:


    (1)不使用初始化语句。

    (2)不使用带有延时的描述。

    (3)不使用循环次数不确定的循环语句,如forever、while等。

    (4)不使用用户自定义原语(UDP元件)。

    (5)尽量使用同步方式设计电路。

    (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。

    (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。

    (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。

    (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。

    (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

    (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。

    (12)避免混合使用上升沿和下降沿触发的触发器。

    (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。


    (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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条