首页 > > > 谈VHDLVerilog的可综合性以及对初学者的一些建议.pdf

谈VHDLVerilog的可综合性以及对初学者的一些建议.pdf

谈VHDLVerilog的可综合性以及对初学者的一些建议.pdf

上传者: wanghao198901 2013-12-08 评分1 评论0 下载0 收藏10 阅读量598 暂无简介 简介 举报

简介:本文档为《谈VHDLVerilog的可综合性以及对初学者的一些建议pdf》,可适用于硬件技术领域,主题内容包含谈VHDLVerilog的可综合性以及对初学者的一些建议一、HDL不是硬件设计语言过去笔者曾碰到过不少VHDL或VerilogHDL的初学者问一些相符等。

谈 VHDL/Verilog的可综合性以及对初学者的一些建议 一、HDL不是硬件设计语言 过去笔者曾碰到过不少 VHDL或 Verilog HDL的初学者问一些相似的问题,诸如如何实现除法、开根号, 如何写循环语句等等。在这个论坛上,也时常能看到一些网友提出这一类的问题。 对于这些问题,首先要明确的是 VHDL和 Veriglog并非是针对硬件设计而开发的语言,只不过目前被我们 用来设计硬件。HDL是 Hardware Description Language的缩写,正式中文名称是“硬件描述语言”。也就 是说,HDL并不是“硬件设计语言(Hardware Design Language)”。别看只差这一个单词,正是这一个单词 才决定了绝大部分电路设计必须遵循 RTL的模式来编写代码,而不能随心所欲得写仅仅符合语法的 HDL 代码。 二、HDL的来历 之所以是“硬件描述语言”,要从 HDL的来历说起。 VHDL于 1980年开始在美国国防部的指导下开发,完成于 1983年,并于 1987年成为 IEEE的标准。当 初开发这种语言,是出于美国国防部采购电子设备的需要。美军的装备采购自私人企业,时常要面对这样 一种风险:如果某种武器大量装备部队,而其中某个零件的供应商却在几年后倒闭了,那这种武器的再生 产、维修和保养都会出现大问题。而电子设备、尤其是集成电路的内部结构较为复杂,若出现前面所说的 情况要找其他公司生产代用品非常困难。于是美国防部希望供应商能以某种形式留下其产品的信息,以保 证一旦其破产后能由其他厂商迅速生产出代用品。 显然,当初的设计文档显然是不能交出来的,这在美国会涉及商业机密和知识产权问题。于是美国防部就 想出了一种折衷的方法——描述硬件的语言,也就是 VHDL。通过 VHDL,供应商要把自己生产的集成电 路芯片的行为描述出来:比如说,加了什么样的信号后过多少时间它能输出什么等等。这样,如果有必要 让其他厂商生产代用品,他们只需照着 VHDL文档,设计出行为与其相同的芯片即可。这样的代用品相当 于是新厂商在不了解原产品结构的情况下独立设计的,所以不太会涉及知识侵权。 Verilog HDL也形成于差不多的年代,是由 Gateway Design Automation公司大约在 1983年左右开发的。 其架构同 VHDL相似,但主要被用来进行硬件仿真。或许私人公司更注重实用,Verilog要比 VHDL简洁 得多。 由此可见,这两种最流行的用于电路设计的语言,没有一种是为了设计硬件而开发的(更何况 80年代还没 有现在的那些功能强大的 EDA软件呢)。因此,当初制订 HDL语言标准的时候,并没有考虑这些代码如何 用硬件来实现。换句话说,有些代码写起来简单,实现起来却可能非常复杂,或者几乎不可能实现。 三、HDL代码的可综合性 现在回到最初的问题上。为什么诸如除法、循环之类的 HDL代码总是会出错? 由上一部分可知,任何符合 HDL语法标准的代码都是对硬件行为的一种描述,但不一定是可直接对应成电 路的设计信息。行为描述可以基于不同的层次,如系统级,算法级,寄存器传输级(RTL)、门级等等。以目 前大部分 EDA软件的综合能力来说,只有 RTL或更低层次的行为描述才能保证是可综合的。而众多初学 者试图做的,却是想让软件去综合算法级或者更加抽象的硬件行为描述。 比如说,要想实现两个变量相除的运算,若在代码中写下 C=A/B,你将会发现只有一些模拟软件在前仿真 中能正确执行这句代码,但几乎任何软件都不能将其综合成硬件。不要怪软件太笨。试想一下,如果我们 自己笔算除法是怎么做的?从高位到低位逐次试除、求余、移位。试除和求余需要减法器,商数和余数的 中间结果必须有寄存器存储;而此运算显然不能在一个时钟周期里完成,还需要一个状态机来控制时序。 一句简单的 C=A/B同所有这些相比显得太抽象,对于只能接受 RTL或更低层次描述的 EDA软件来说确实 太难实现。而如果代码是类似于(Verilog) always @(posedge clk) c<=A/B; 这样的,要求除法在一个时钟延上完成,那更是不可能实现的。(注:有些 FPGA的配套软件提供 乘除法的运算模块,但也只能支持直接调用,不支持把形如 C=A/B的语句综合成除法模块。) 又比如,一个很多初学者常见的问题是试图让 HDL进行循环运算,形同(Verilog): for (i=0; iparity = parity xor data[i]; 一些功能比较简单的综合软件会完全拒绝综合循环语句;而一些功能较强的软件仅当 wordlength是常数的 时候能综合;当 wordlength为变量时,任何软件都不能综合上面的语句。这是因为硬件规模必须是有限的、 固定的。当综合软件遇到循环语句时,总是将其展开成若干条顺序执行的语句,然后再综合成电路。若 wordlength是常数,则展开的语句数是确定的,具有可综合性;而若它是变量时,展开的语句数不确定, 对应的硬件电路数量也不能确定,无法被综合。或许有人说用计数器就能实现变量循环,但这情形又和上 面的除法运算相同。那需要额外的硬件,用来存储中间结果和进行时序控制,象上面那样的循环语句对此 描述得太抽象,软件接受不了。 四、如何判断自己写的代码是可综合的? 用一句简单的话概括:电脑永远没有你聪明。具体来说,通常 EDA软件对 HDL代码的综合能力总是比人 差。对于一段代码,如果你不能想象出一个较直观的硬件实现方法,那 EDA软件肯定也不行。比如说,加 法器、多路选择器是大家都很熟悉的电路,所以类似 A+B-C,(A>B)?C:D这样的运算一定可以综合。而除 法、开根、对数等等较复杂的运算,必须通过一定的算法实现,没有直观简单的实现方法,则可以判断那 些计算式是不能综合的,必须按它们的算法写出更具体的代码才能实现。此外,硬件无法支持的行为描述, 当然也不能被综合(比如想在 FPGA上实现DDR内存那样的双延触发逻辑,代码很容易写,但却不能实现)。 不过,这样的判断标准非常主观模糊,遇到具体情况还得按设计人员自己的经验来判断。如果要一个相对 客观的标准,一般来说:在 RTL级的描述中,所有逻辑运算和加减法运算、以及他们的有限次组合,基本 上是可综合的,否则就有无法综合的可能性。当然,这样的标准仍然有缺陷,更况且 EDA的技术也在不断 发展,过去无法综合的代码或许将来行,某些软件不支持的代码换个软件或许行。比如固定次数的循环, 含一个常数参数的乘法运算等等,有些 EDA软件支持对它们的综合,而有些软件不行。 所以,正确的判断仍然要靠实践来积累经验。当你可以较准确判断代码的可综合性的时候,你对 HDL的掌 握就算完全入门了。

该用户的其他资料

  • 名称/格式
  • 评分
  • 下载次数
  • 资料大小
  • 上传时间

用户评论

0/200
    暂无评论
上传我的资料

相关资料

资料评价:

/ 2
所需积分:1 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!