首发于 FPGA外太空
Verilog可编程语言(综合)

Verilog可编程语言(综合)

在接触FPGA的时候,我们都是会第一个先接触到硬件描述语言(HDL),和C语言不同的是硬件描述语言描述的是硬件,而不是我们常用的软件应用。IEEE这个缩写不知道大家是否熟悉,IEEE是电气和电子工程师协会缩写,是一个组织的名称,而这个组织是世界性的也就是说地球人都知道。这个组织有一项活动就是制订某些技术的标准和规范,从而达到更多的人能够使用某项技术。

说到这里,不免会有人心里疑惑,我是否可以不按照他制订的规范去操作。回答是可以的,但是IEEE制订的规范都是大多数人使用的,如果你不打算使用他的规范和标准,你自己就要建立属于你的规范标准。举个例子,IEEE标准下的Verilog HDL使用reg进行寄存器定义。你可以使用rge,也可以使用ger等等,但是你的综合软件需要做相关的交互,这样你就得自己开发一个属于自己的开发软件,因为我们用的主流FPGA开发软件都是遵循IEEE协议的。所以一般笔者都是踏踏实实学习主流规范硬件描述语言,比如Verilog HDL和VHDL,因为笔者没有那个能力去开发一个自己的语言和对应交互的软件。

Verilog HDL和VHDL使用都比较广泛,尽管两种语言有不同的地方,但是也有相似之处。从语言阅读看,Verilog比较接近C语言风格,大家应该都是先接触C语言,所以更偏向于Verilog。

不知道大家在入门Verilog的时候有没有接触这样一个信息,就是不要把它当C语言学习,要当做电路,要知道写出来的模块是完成一个什么样的电路功能的。说得容易做得难啊,学来学去还是觉得当C语言的思路学比较好,就是因为有这个思想才使得有些人在这个道理越走越偏,写出来的代码永远都是小打小闹的,因为有很多代码的编写是要考虑电路方面的,当然今天不讨论这个问题,因为这个问题比较泛,需要一点一点积累才能体会其中的奥妙,不是你我一两句就能概括的。

这次笔者想和大家探讨的是这个硬件描述语言的认识。从我们拿到第一块FPGA板,有些工程师手里应该也会有一本讲解Verilog的书(或者VHDL),打开这本书,我们发现里面很多语法,完成这个功能,完成那个功能。可能在FPGA板子上进行调试过的人知道,在软件进行一系列操作的时候,会遇到过一个这样的问题:你的代码不可综合。特别是一些初学者,整天把不可以综合,可综合挂在嘴里,却不知道其中的奥秘。

我们先来看看,什么是综合?综合就是把Verilog语言生成逻辑电路。比如你写一个二分频的程序,它最终呈现的是一个D触发器。那么是谁来完成综合这个工作呢?回答是软件,我们常常把这个软件称之为综合器。我们常说的不可综合就是说综合器这个软件不能把这个语言转化为逻辑电路。大家都知道,软件是人为设计的,它不支持就是不支持,没有任何理由。所以,当我们看一些书籍并没有明确指出哪些语句可以综合或者不可以,因为大家使用的综合软件不一样,这个看软件的支持能力。但是有一些语言是大家都认定可以综合的,使用在不同公司的软件都可以达到综合出逻辑电路的效果(但是效果不一定是相同的)。也有一些语言,某些公司的综合软件不支持,有些公司的综合软件支持,这得看对应软件的说明文档。打个比方,ISE就不支持System Verilog,Synopsys公司的综合软件就支持。有些公司的综合器,对于某些写法会报错,但是相同的写法在有些公司的软件上它会直接忽略掉。也就是说你的语言能不能变成一个逻辑电路,这是我们在编写代码的时候,需要去思考的一个问题。

纵观Verilog代码的语法,大众软件认可的可综合语法不是很多,相对于这个语法库来说可能就是一小嘬。这就是我们常说的,写来写去也就那几句语法。那剩下的语法怎么办,被抛弃了吗,毕竟我们都是要生成电路的。其实在FPGA开发过程,还有一个重要的环节,就是仿真。剩下的不可综合的语法常常用于仿真文件的编写,很多不可综合的语法灵活性比较高,如果你编写的仿真激励都是可综合来构建模块的话,工程比较大的话那是相当难受的。

随着时代的发展,也有很多以前大家认为不可综合的语法慢慢可综合了。那个这个语法到底可不可综合?我应该怎么判断?很简单,打开你使用的开发软件,编写一段简单程序,跑起来,看看生成的RTL是什么就知道了。

说了这些,主要是想帮大家缕清一些思路,让大家明白一些其中的道理。上面所说的,综合就是把语言变成电路。那么把语言变成电路之后还要做什么?这就是涉及到一些时序方面的问题,如果你研究到这一个方面,应该就会理解为什么把程序看做电路来编程。以后有机会笔者再和大家探讨一下关于综合后,FPGA需要进行的布局布线和编程所涉及到的一些时序的问题。

发布于 2018-01-06 13:26

文章被以下专栏收录