谈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的掌握就算完全入门了。
作者:董培良 电机和电子工程系博士生 英国University of Nottingham
谈VHDL/Verilog的可综合性以及对初学者的一些建议相关推荐
- 以Vivado synthesis支持的Verilog结构来学习 Verilog语句可综合性
查Verilog结构是否可综合 查Verilog 系统task与function是否可综合 查Verilog 基本单元(原语)是否可综合 查Verilog 保留的关键词 文章目录 1 Verilog ...
- RTL设计推荐的各步骤 推荐工具 适合VHDL verilog
初学EDA时候,大家都在找工具而烦恼,有些工具不是没有license 就是不会设置,要不就是不会用,还担心这个以后有人用么? 所以,我通过自己的体会,推荐大家给大家一个学习时候的流程,和一个业界用流程 ...
- VHDL/Verilog编译错误总结
VHDL编译错误总结 Vivado VHDL Verilog Quartus VHDL Verilog Lattice VHDL Verilog Vivado VHDL [Synth 8-2778] ...
- VHDL+Verilog良好的代码编写风格(转载)
良好代码编写风格可以满足信.达.雅的要求.在满足功能和性能目标的前提下,增强代码的可读性.可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每 ...
- 关于Verilog的可综合性
可综合模型的结构 如果程序只用于仿真,那么几乎所有的语法和编程语句都可以使用.但如果程序是用于硬件实现,那么我们就必须保证程序的可综合性,即所编写的程序能被综合器 转化为相应的电路结构.不可综合的HD ...
- 使用VIVADO LICENSE 加密VHDL/Verilog 文件(二)
继上一次编写vivado加密文章之后,细读赛灵思 UG1118,进行详细学习整理如下文.如有疑问可自行阅读英文版本手册. 一.VIVADO加密的TCL命令 Tcl命令在vivado的Tcl Conso ...
- VCS仿真VHDL VERILOG混合脚本
IC小白有感于第一次参与的流片工程,总结了一下参与过程中的Makefile配置,以及一些环境配置,希望能够帮助到大家: 首先VCS要进行VHDL和VERILOG的混合仿真,在进行仿真VHDL时要配置s ...
- verilog always语法_Verilog 最全经验总结(建议收藏)
关注.星标公众号,直达精彩内容 公众号:ZYNQ ID :FreeZynq 1.不使用初始化语句: 2.不使用延时语句: 3.不使用循环次数不确定的语句,如:forever,while等: 4.尽量采 ...
- 老菜鸟趣谈:对编程初学者的一些建议
对编程初学者的建议 PS:这篇文章我只在微信公众号和头条网发布了,忘了在博客里发. 我是程序员,我为程序员代言. 现在真的是编程的黄金年代,程序员从来不曾这样供不应求,特别是嵌入式领域. 现在哪怕是银 ...
最新文章
- 、|| 和 、| 的区别(详尽版)
- Android--用手指移动画面里的照片/onTouchEvent事件判断
- C语言如何产生随机数
- iis的web站点配置
- ad交互式布线如何改变走向_走向开放:如何改变思维和工作方式
- 微服务 注册中心的作用_微服务架构Dubbo之注册中心(Zookeeper)
- [iOS] 响应式编程开发-ReactiveCocoa(一)
- 大话数据结构读书笔记系列(七)图
- Object类的使用
- 三菱四节传送带控制梯形图_四节传送带控制
- 模糊控制洗衣机MATLAB模型,洗衣机的模糊控制MATLAB仿真
- 计算机论文中期考核报告,计算机与人工智能学院硕士研究生中期考核办法
- 大一总结与突然的感悟
- 现货白银入门技巧之白银K线卖出信号
- 游戏画质提升1《X战警金刚狼前传》画质增强修改
- 最强文件搜索神器——Everything
- 读书笔记:[AWL]-2021.9.7
- 基于python-django的neo4j人民的名义关系图谱查询系统
- python语言的实验心得体会范文_实验心得体会范文
- FFT的详细解释,相信你看了就明白了
热门文章
- boost::multi_array模块测试 storage_order-isms
- boost::logic::tribool相关用法的测试程序
- boost::advance用法的测试程序
- boost::fusion::transform用法的测试程序
- boost::fusion::clear用法的测试程序
- boost::function模块boost::lambda::bind用法的测试程序
- OpenCV DIS光流OpticalFlow的实例(附完整代码
- Qt Creator测验Testing
- C语言链表返回第n个到最后的节点的算法(附完整源码)
- 了解哪些c++11特性?