verilog语言的可综合性和仿真特性

verilog语句的可综合性说明

1.语句可综合概念

综合就是将HDL语言转化成与,非,或门等等基本逻辑单元组成的门级连接。因此,可综合语句就是能够通过EDA工具自动转化成硬件逻辑的语句。

读者首先必须明确的是HDL语言不是针对硬件设计而开发的语言,只是目前被设计人员用来设计硬件。这是因为HDL语言只是硬件描述语言,并不是硬件设计语言,也就是说任何符合HDL语法标准的语句都是对硬件行为的描述,但是并不一定可以直接,简单的对应硬件电路信息。

行为描述可以基于不同层次,如算法级,寄存器传输级(RTL),门级等等。目前大多数EDA工具来说,RTL级以及更低层次的才能被综合(xilinx出了HLS工具可以实现算法级,但是并不是用的HDL语言,是C语言)。

例如要实现一个延时后计算的运算,在代码中写下

        always@(posedge clk)

            #5 a <= a+1;

这样的代码,这句话并没有任何语法错误,仿真也会按照在5ns后实现a累加1,但是目前任何EDA软件都没法将他转换成硬件电路。大家可以深层次思考其中的原因,#5的实现,在FPGA里面只能通过时钟计数去实现,然而如果时钟频率并不能保证刚刚分出5ns怎么办?最重要的是,即便5ns计数没有任何误差,计数完成后计算a=a+1,本质上是一个状态机跳转过程。第一个状态是计数,计数满后跳向状态2,第二个状态是实现a <= a+1。这些过程需要多个时钟周期,并且需要状态机配合,根本无法在一个时钟周期内完成。因此,这种语句对于EDA而言,要综合成硬件电路太抽象,无法将其转化为硬件逻辑。

2.如何判断语句是否可综合

在实际设计中,EDA工具综合结果以及相应的综合报告是判断语句可综合与否的根本标准。但是实际设计中不可能每一句都去尝试用编译器编一下,以查看结果,因此在设计的时候就需要设计者能够判断这些语句能否综合。不同厂家的编译器可综合的能力不同,所以可综合的语句对于不同的编译器而言存在略微的差异,值得庆幸的是,这些差异是极个别的,并不多,需要大家平时使用各种编译工具的时候注意积累。

其实在可综合与否的判断上,人的判断是远强于EDA工具的。对于一段代码,如果设计者都不能思考出一种数字电路去实现,那么EDA工具也不能,就像上面的代码一样。当然,也有可能是设计者经验和知识不足,不能思考出可行的电路。例如,加法器,多路选择器,编码器,译码器是大家很熟悉的电路,所以很容易综合出来。加法器对应代码a <= b + c;多路选择器对应代码a = in ? b : c;或者if语句,编码/译码器对应case语句。但是像延时语句,initial语句都不是可综合的,因为没有直观的对应电路,必须要写出更具体的代码去实现,不然对verilog而言要几个时钟周期,要哪些过程都是不清楚,不可控的,这样自然没法综合,有的编译器除法也是不能直接综合的。

此外,虽然有直观对应电路,但是FPGA不支持的也无法综合,不仅仅是verilog,调用的原语,IP等等FPGA硬件不支持都无法综合,所以这也要求大家对所使用的FPGA结构很了解才能高效的写出高质量代码。比如,双边沿触发电路,也就是上下边沿都能打拍缓存数据的触发器,在DDR里面可以,是可以实现的电路,但是FPGA里面没有双沿触发器,所以无法综合。再比如输出差分LVDS,有对应的单端转差分电路,但是如果FPGA没有集成这个电路,那么也就没法输出LVDS。建议大家了解这些东西可以看公众号里面讲FPGA结构那个板块,同时多看官方的文档,所有器件特性在手册上都非常清楚,最好阅读英文原版,中文版有的资料翻译不对容易引起误解。

当然,最开始这样的直观判断是不准确的,最终都需要EDA工具的检验,当读者发现自己能够正确判断一段代码是否可综合以及为什么可综合的时候,说明以及理解verilog HDl设计的本质。

verilog仿真特性的说明

语句的仿真特性是相对语句的可综合特性而言的但二者并不独立和相对。二者的区别在于可综合语句可用于仿真,而专门面向仿真语句虽然可以述任何电路行为,但却是不可综合的。由于Verilog HDL语言最初就是为了完成仿真而发明的,从语法数量讲,可综合语句只是Verilog HDL语言中的一个较少的子集。从用户开发上讲,可综合设计是最重要的,只有可综合设计才能将用户的思想最终实现在硬件平台上,所有仿真语句都是验证可综合设计而存在的。

从概念上讲,用最精简的语句描述最复杂的硬件是硬件描述语言的本质,但不可综合语句同样重要。在实际中利用verilog HDL语言完成开发时,就是为了得到1个满足的、可综合的程序。但如何得到一个满足功能的正确程序呢?在设计阶段只能通过仿真才能得到。因此设计人员在开发功能模块时,需要了解外围电路特点以及二者之间是否够协作?这就要求开发外围电路的Verilog HDL代码。然而外围电路的Verilog HDL的代码和功能模块的Venlog HDL代码有本质区别,这是因为在实际中,外围电路是客观存在的,无须重新设计,设计人员只要将其模拟出来,完成功能模块的测试即可,因此可以用不可综合的语句(专门用于仿真的语句)来实现,而不必管它是否能在硬件平台上实现。在目前的电子开发行业中,VerilogHDL开发工作也因上述原因分为两类: 一 类是可综功能模块开发;另一类就是专门用于测试的仿真模块开发,都有广阔的应用领域。对单个设计人员来讲,在编 Verilog HDL程序时,首先应该明确代码是用仿真的还是综合的,要是用来综合的话,就必须严格地使用可综合的语句。如果代码是用于仿真,则非常灵活,不必在意硬件实现,可以使用verilog HDL所有语句,只要能够更好的描述电路行为。

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
xilinx_wiki 头像