第六讲VHDL的可综合性(精)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
型在众多接受RTL输入的不同工具之间的便携性。”这项标准化将最 终帮助RTL确认。
主要支持以下类型综合: a) BIT, BOOLEAN, BIT_VECTOR b) CHARACTER and STRING c) INTEGER d) STD_ULOGIC, STD_ULOGIC_VECTOR, STD_LOGIC, and STD_LOGIC_VECTOR e) SIGNED and UNSIGNED
2004年,IEEE批准了一种修订标准IEEE 1076.6-2004,该标准提供了
VHDL RTL综合子集的重要扩展。新改进版包括VHDL几乎每一个特性,
能被用于在RTL级进行建模并综合。此外还包括触发器和锁存器建模 的扩展语义导引。用户将能够以多种不同风格编写一个RTL模型,每
一种都符合标准。此外,这项标准提供了极为重要的保证,即保证模
(2)整数类型 可综合的整数类型定义总是有界的,例如:
对整数类型进行综合时,综合工具首先将其翻译为位矢量,矢量长度仍取能 够满足需要的最短位宽。如果使用默认的整数类型,大部分综合工具按32位 处理,因此,建议使用于类型定义(subtype)明确指出整数的范围,以便于 综合工具进行优化。如果是负整数,通常编码为正数的补码。综合后的电路
一、
VHDL类型
VHDL 语言中的对象有常量 (constant) 、信号 (signal) 和变量 (variable) 三种
,它们都必须定义为如下某种类型。类型定义说明了对象可以使用的数值,并隐 含表示了可以对其进行的操作。
1.可综合类型
面向综合的建摸都支持这样一些类型:枚举类型、整数、一维数组。比较 先进的综合工具现在一般也可以处理二维数组和简单的记录类型。
有统一的方法解决。一般来说,状态编码是把状态值编码为位矢量(bitVector,Std-ulogic-Vector或Std-logic-vector),矢量长度是能够表示 所有状态的最短位宽。例如,State-type的4个状态值可以分别校编码为 “00”,“01“,”10“和”11”,Boolean类型编码办’0’和’1’。
VHDL语言在创立时,主要是为了满足仿真的需要。自从VHDL被用于综合以来, 都是对VHDL的子集进行处理,这就是所谓的可综合的VHDL子集。不同综合工具 支持的可综合子集不尽相同,通常有如下要求:
(1)延时描述(after语句、wait for语句)等被忽略。
仿真时,为了具备一定精度,往往在源代码中含有延时语句。这些延时语
(4)可综合代码应该是同步式的设计。
现在的EDA综合工具普遍推荐使用同步式设计风格,即整个芯片电路的
状态只能在时钟信号有效时发生改变,也就是说,电路状态不会在仅有 数据信号变化而时钟处于无效状态时改变,并且电路中的时钟信号应该
都是从同一主时钟经过分频或其他运算得到。当然设计师也可以尝试其
它风格的设计,如异步式电路,但这时综合工具产生的结果往往还需要 设计师的进一步优化或调整
用信号。
下面用一个例子来说明变量与信号的不同综合结果,其源代码如下。图5.14 分别是结构体A和B对应的综合结果。
三、初值
VHDL中有三种初值;由类型或子类型定义可以得到的默认初值,定义对象 时明确指定的初值和进程入口处显示地赋予对象的初值。
以上三种初值的前两种只在仿真时有意义,在综合时将被忽略。第三种形式将 被综合器处理,形成对应电路。在集成电路设计中,复位时赋予各个信号初值 是很有必要的,否则很有可能出现不定态。因此无论在仿真还是在综合时,都 建议使用系统化的方式给信号和变量赋初值,即上述的第三种形式。
五、顺序语句
顺序语句只能在进程中出现,而且其出现顺序直接影响到硬件行为。VHDL能够描述非
常复杂的数字电路,很大程度上是由于具有丰富的顺序语句。
1.变量赋值
变量的引入使得VHDL具备了极强的造型能力,能够以类似软件编程的方式描述 硬件,特别是在行为综合时,如果没有变量,则描述复杂的ASIC行为几乎是不 可能的。
(1)核举类型
枚举类型通过列出所有可能的取值来定义,例如:
以上Std_ulogic的定义实际是对‘0’‘1‘等字符进行了重载(overload),由
于这个定义已经成为IEEE标淮,并且描述的是电路连线的状态,因此综合
时并不会产生额外硬件。而对于抽象层次更高的BOOLEAN和State-type, 则需要进行状态编码,这也是枚举类型在综合时最主要的问题,现在还没
四、运算符
1.逻辑运算符
逻辑运算符包括表5.4中的not和二元逻辑运算符,其操作数可以是bit和 Std_logic等类型的标量或同长度的矢量对象,也可以是Boolean类型的对象。 这些算符的综合是直截了当的,直接调用逻辑门单元实现即可,但经过优化后 ,这些算符可能被合并或改变。图5.15是对下达VHDL代码中逻辑运算符综合的 结果。
3.if语句
if语句是最频繁出现的条件语句。在综合时,if的处理分三种情况,下面分 别讨论。
d)常量传播。在下面的VHDL代码中,由于数组ROM和ROM(5)的索引都是常数, 因此WORD4实际上也成为常数,在进一步的优化中,WORD4将作为常量被处理。 这就是常量传播。
2.变量和信号
变量和信号有着不同的仿真行为,同样在综合过程中,它们也会产生不同的结 果。一般说来,尽量使用变量能够获得比较好的综合结果,因为这样做使得优化 的余地较大。但是,并不是所有的综合工具都支持变量的综合,这是需要特别注 意的。同时,使用信号可以较好地保持综合前后在 I/O上的一致性(这里把进程 内对信号的读写统称为 I/O),而且在需要锁存中间结果的时候,经常有必要使
第六讲 VHDL的可综合性
6.1
VHDL语言结构向硬件的映射
•EDA工业界普遍认为,有效的VHDL建模风格是控制综合结 果最为有力的手段。 •为了建立有效的VHDL代码,设计师应了解VHDL语言结构与 综合结果的关系。
•应该指出的是,由于综合算法的不同,对于同样的硬件描
述,不同的CAD综合工具可能会得到不同的综合结果。
1992年,IEEE颁布了标准程序包Std_logic_1164,其中定义了9值数据类型 Std_ulogic,即相应的决断类型Std_logic。在第4章也已经介绍了这个程序 包,这里从综合的角度予以讨论。9值数据类型定义如下:
Type std_ulogic is(‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-‘);’0’,’1’,’Z’,’-‘在 仿真和综合时的处理方式是一致的。’U’和‘W’在仿真是是未初始化状态, 综合时通常不必考虑。现在”H’和’L‘在综合时没有统一的方法。仿真时, ‘X’表示未知态;综合时,‘X’一般当作无关态处理,即等价于‘-’。
二.VHDL对象
VHDL语言中有三类对象,常量(constant),变量(Variable),信号
(Signal),它们是VHDL程序中的数据的载体。
1.常量
常量仅被计算一次。在很多情况下,可以通过使用常量引导综合器获 得优化的结果在综合过程中,常量被处理的方式很多,主要有下述情况 。 a)当常量被用来描述真值表、ROM等,或被用于信号赋值,常量在综 合时会形成对应的硬件。
5.&运算符
&运算行为连接运算,通散用于把一组对象捆绑在一起。由于直到1992年VHDL才 引入移位算符,所以也常用连接运算实现移位运算。综合时,一般是在信号之间 提供额外的连线实现这一运算。
6.移位运算
移位运算符是1992年VHDL再次修订后引入的特征,在综合时有两种处理方式。 对于经过锁存的矢量对象,可以在锁存器之间引入附加的数据通路来实现;对 于不需要锁存的矢量对象,处理方式与&运算符相同。
如文件类型。通常可综合类型包括枚举类型(包括自定义状态、预定义Bit类
型和IEEE 9值逻辑类型等)、整数、数组等。其余像浮点数类型、记录类型 等只得到有限支持.而时间类型等完全不能被综合。
(3)进程的书写要服从一定的限制。
在Hale Waihona Puke Baidu真时,VHDL进程可以任意书写。而在综合时,通常要求一个进程内只能
有一个有效时钟,有的工具还有进一步的限制。
4.二元算术运算符
现在的综合工具,特别是高层次综合工具,都能够直接把十,一,×运算综合 为相应的运算线路,部分工具也支持除法运算。mod和rem算符通常不被综合工具支持
。如果使用IEEE颁布的标准算术运算程序包Std-logic-arith,那么还可以直接描述对
Bit或Std-logic类型的标量和矢量对象进行算术运算的电路,并进行综合。通常在综 合过程中,综合器先把运算符映射为相应的加法器等综合库提供的专用运算部件,然 后进行优化,如果某些运算可以用简单线路实现,综合器则用简单线路取代专用运算 部件。
句信况比较复杂,有时是最大延时约束,有时是典型经验值,还有些是人 为加入的,所以现在所有的综合工具都忽略源代码中的延时语句。有些工 具干脆把这些语句处理为语法错误。大部分工具忽略延时语句后,给出警 告提示。而综合时间约束则在综合过程中通过综合命令输入。
(2)支持有限类型。
VHDL具有丰富的类型定义,但是有些类型不具备硬件对应物。不可能被综合,
中,整数以矢量形式出现,但通常只能以整个矢量为单位访问,即不能单独
访问每一位。
(3)数组
现在综合工具都能够处理一维数组,例如
对于word类型,综合工具通常将其综合为总线。My_RAM类型实际是二维的,
这种用两个一维数组代替一个两维数组是常用的综合建模技巧。现在先进的 综合工具如synospys DC可以将其综合为RAM,一般综合工具至少可以把它综 合为寄存器。
2.关系运算符
关系算符的综合没有统一的方法,综合工具常利用被比较数的特点作特定的优化 。图5.16是对”<”运算符综合的例子。
3.一元算术运算符
一元算术运算符有三个,即十,一和abs(取绝对值)。对前两个算符,综合工
具大都可以用组合逻辑线路实现,如图5.17的例子。abs算符的处理比较复杂 ,大部分综合工具尚不能提供支持。
变量在综合时要根据整体代码决定其处理方式,主要有以下几种方式:①用寄存 器锁存变量,也就是说,变量经过综合后形成了寄存器,但是生命期不重叠的变 量可以共享一个硬件寄存器;②在逻辑优化过程中被消去,即没有硬件对应物; ③作为一根硬件连线出现(由组合逻辑输出)。
2.信号赋值
信号只能在同步语句(显式或隐含的wait语句)之后改变状态。通常,综合后的信 号赋值语句会被化简为最简形式。综合工具处理信号的方式类似于变量,但有以 下区别:①如果信号需要寄存器锁存,那么被锁存的信号能与其他信号共享硬件 寄存器;②比较先进的综合工具可以按照设计师的要求,决定是否保持综合前后 信号的一致性;③出现在形如if CLK=’1’and CLK‘Event和then· · end if之间 或wait until CLK=‘0’and CLK’Event这样的时钟沿同步语句之后的信号都要被 锁存,而变量则不一定被锁存。
(4)记录类型
记录类型在定义复杂数据类型时非常方便,能够把不同数据类型的数据组织在一 起统一访问。但是,EDA工业界对综合工具是否应该支持记录类型还没有统一意 见,因此大多数综合工具不提供这种能力或只能把组合了简单数据类型的记录进 行综合。
2.可综合子集
VHDL在 1989年首次公布时,就提供了两个程序包 (package) :Standard 和 TextI(),其中定义了各种预定义数据类型。这些预定义数据类型中,类 型 Integer , Bit , Bit-Vector , Boolean , Character 和子类型 Natural , Positive是可综合的。类型File,Access和Real则不可被综合。
b)在常量作为算术运算的一个操作数出现时,综合工具常会对这一算 术运算实施特定的优化措施。当然,这样一来常量与综合结果中的硬件 就不是一一对应了。例如,优化综合工具用左移一位实现乘 2操作,用 右移一位实现除法操作。
c)常量在作为条件表达式的一部分(例 如下面的代码)时综合工具会对整个语 法结构进行布尔优化。
主要支持以下类型综合: a) BIT, BOOLEAN, BIT_VECTOR b) CHARACTER and STRING c) INTEGER d) STD_ULOGIC, STD_ULOGIC_VECTOR, STD_LOGIC, and STD_LOGIC_VECTOR e) SIGNED and UNSIGNED
2004年,IEEE批准了一种修订标准IEEE 1076.6-2004,该标准提供了
VHDL RTL综合子集的重要扩展。新改进版包括VHDL几乎每一个特性,
能被用于在RTL级进行建模并综合。此外还包括触发器和锁存器建模 的扩展语义导引。用户将能够以多种不同风格编写一个RTL模型,每
一种都符合标准。此外,这项标准提供了极为重要的保证,即保证模
(2)整数类型 可综合的整数类型定义总是有界的,例如:
对整数类型进行综合时,综合工具首先将其翻译为位矢量,矢量长度仍取能 够满足需要的最短位宽。如果使用默认的整数类型,大部分综合工具按32位 处理,因此,建议使用于类型定义(subtype)明确指出整数的范围,以便于 综合工具进行优化。如果是负整数,通常编码为正数的补码。综合后的电路
一、
VHDL类型
VHDL 语言中的对象有常量 (constant) 、信号 (signal) 和变量 (variable) 三种
,它们都必须定义为如下某种类型。类型定义说明了对象可以使用的数值,并隐 含表示了可以对其进行的操作。
1.可综合类型
面向综合的建摸都支持这样一些类型:枚举类型、整数、一维数组。比较 先进的综合工具现在一般也可以处理二维数组和简单的记录类型。
有统一的方法解决。一般来说,状态编码是把状态值编码为位矢量(bitVector,Std-ulogic-Vector或Std-logic-vector),矢量长度是能够表示 所有状态的最短位宽。例如,State-type的4个状态值可以分别校编码为 “00”,“01“,”10“和”11”,Boolean类型编码办’0’和’1’。
VHDL语言在创立时,主要是为了满足仿真的需要。自从VHDL被用于综合以来, 都是对VHDL的子集进行处理,这就是所谓的可综合的VHDL子集。不同综合工具 支持的可综合子集不尽相同,通常有如下要求:
(1)延时描述(after语句、wait for语句)等被忽略。
仿真时,为了具备一定精度,往往在源代码中含有延时语句。这些延时语
(4)可综合代码应该是同步式的设计。
现在的EDA综合工具普遍推荐使用同步式设计风格,即整个芯片电路的
状态只能在时钟信号有效时发生改变,也就是说,电路状态不会在仅有 数据信号变化而时钟处于无效状态时改变,并且电路中的时钟信号应该
都是从同一主时钟经过分频或其他运算得到。当然设计师也可以尝试其
它风格的设计,如异步式电路,但这时综合工具产生的结果往往还需要 设计师的进一步优化或调整
用信号。
下面用一个例子来说明变量与信号的不同综合结果,其源代码如下。图5.14 分别是结构体A和B对应的综合结果。
三、初值
VHDL中有三种初值;由类型或子类型定义可以得到的默认初值,定义对象 时明确指定的初值和进程入口处显示地赋予对象的初值。
以上三种初值的前两种只在仿真时有意义,在综合时将被忽略。第三种形式将 被综合器处理,形成对应电路。在集成电路设计中,复位时赋予各个信号初值 是很有必要的,否则很有可能出现不定态。因此无论在仿真还是在综合时,都 建议使用系统化的方式给信号和变量赋初值,即上述的第三种形式。
五、顺序语句
顺序语句只能在进程中出现,而且其出现顺序直接影响到硬件行为。VHDL能够描述非
常复杂的数字电路,很大程度上是由于具有丰富的顺序语句。
1.变量赋值
变量的引入使得VHDL具备了极强的造型能力,能够以类似软件编程的方式描述 硬件,特别是在行为综合时,如果没有变量,则描述复杂的ASIC行为几乎是不 可能的。
(1)核举类型
枚举类型通过列出所有可能的取值来定义,例如:
以上Std_ulogic的定义实际是对‘0’‘1‘等字符进行了重载(overload),由
于这个定义已经成为IEEE标淮,并且描述的是电路连线的状态,因此综合
时并不会产生额外硬件。而对于抽象层次更高的BOOLEAN和State-type, 则需要进行状态编码,这也是枚举类型在综合时最主要的问题,现在还没
四、运算符
1.逻辑运算符
逻辑运算符包括表5.4中的not和二元逻辑运算符,其操作数可以是bit和 Std_logic等类型的标量或同长度的矢量对象,也可以是Boolean类型的对象。 这些算符的综合是直截了当的,直接调用逻辑门单元实现即可,但经过优化后 ,这些算符可能被合并或改变。图5.15是对下达VHDL代码中逻辑运算符综合的 结果。
3.if语句
if语句是最频繁出现的条件语句。在综合时,if的处理分三种情况,下面分 别讨论。
d)常量传播。在下面的VHDL代码中,由于数组ROM和ROM(5)的索引都是常数, 因此WORD4实际上也成为常数,在进一步的优化中,WORD4将作为常量被处理。 这就是常量传播。
2.变量和信号
变量和信号有着不同的仿真行为,同样在综合过程中,它们也会产生不同的结 果。一般说来,尽量使用变量能够获得比较好的综合结果,因为这样做使得优化 的余地较大。但是,并不是所有的综合工具都支持变量的综合,这是需要特别注 意的。同时,使用信号可以较好地保持综合前后在 I/O上的一致性(这里把进程 内对信号的读写统称为 I/O),而且在需要锁存中间结果的时候,经常有必要使
第六讲 VHDL的可综合性
6.1
VHDL语言结构向硬件的映射
•EDA工业界普遍认为,有效的VHDL建模风格是控制综合结 果最为有力的手段。 •为了建立有效的VHDL代码,设计师应了解VHDL语言结构与 综合结果的关系。
•应该指出的是,由于综合算法的不同,对于同样的硬件描
述,不同的CAD综合工具可能会得到不同的综合结果。
1992年,IEEE颁布了标准程序包Std_logic_1164,其中定义了9值数据类型 Std_ulogic,即相应的决断类型Std_logic。在第4章也已经介绍了这个程序 包,这里从综合的角度予以讨论。9值数据类型定义如下:
Type std_ulogic is(‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-‘);’0’,’1’,’Z’,’-‘在 仿真和综合时的处理方式是一致的。’U’和‘W’在仿真是是未初始化状态, 综合时通常不必考虑。现在”H’和’L‘在综合时没有统一的方法。仿真时, ‘X’表示未知态;综合时,‘X’一般当作无关态处理,即等价于‘-’。
二.VHDL对象
VHDL语言中有三类对象,常量(constant),变量(Variable),信号
(Signal),它们是VHDL程序中的数据的载体。
1.常量
常量仅被计算一次。在很多情况下,可以通过使用常量引导综合器获 得优化的结果在综合过程中,常量被处理的方式很多,主要有下述情况 。 a)当常量被用来描述真值表、ROM等,或被用于信号赋值,常量在综 合时会形成对应的硬件。
5.&运算符
&运算行为连接运算,通散用于把一组对象捆绑在一起。由于直到1992年VHDL才 引入移位算符,所以也常用连接运算实现移位运算。综合时,一般是在信号之间 提供额外的连线实现这一运算。
6.移位运算
移位运算符是1992年VHDL再次修订后引入的特征,在综合时有两种处理方式。 对于经过锁存的矢量对象,可以在锁存器之间引入附加的数据通路来实现;对 于不需要锁存的矢量对象,处理方式与&运算符相同。
如文件类型。通常可综合类型包括枚举类型(包括自定义状态、预定义Bit类
型和IEEE 9值逻辑类型等)、整数、数组等。其余像浮点数类型、记录类型 等只得到有限支持.而时间类型等完全不能被综合。
(3)进程的书写要服从一定的限制。
在Hale Waihona Puke Baidu真时,VHDL进程可以任意书写。而在综合时,通常要求一个进程内只能
有一个有效时钟,有的工具还有进一步的限制。
4.二元算术运算符
现在的综合工具,特别是高层次综合工具,都能够直接把十,一,×运算综合 为相应的运算线路,部分工具也支持除法运算。mod和rem算符通常不被综合工具支持
。如果使用IEEE颁布的标准算术运算程序包Std-logic-arith,那么还可以直接描述对
Bit或Std-logic类型的标量和矢量对象进行算术运算的电路,并进行综合。通常在综 合过程中,综合器先把运算符映射为相应的加法器等综合库提供的专用运算部件,然 后进行优化,如果某些运算可以用简单线路实现,综合器则用简单线路取代专用运算 部件。
句信况比较复杂,有时是最大延时约束,有时是典型经验值,还有些是人 为加入的,所以现在所有的综合工具都忽略源代码中的延时语句。有些工 具干脆把这些语句处理为语法错误。大部分工具忽略延时语句后,给出警 告提示。而综合时间约束则在综合过程中通过综合命令输入。
(2)支持有限类型。
VHDL具有丰富的类型定义,但是有些类型不具备硬件对应物。不可能被综合,
中,整数以矢量形式出现,但通常只能以整个矢量为单位访问,即不能单独
访问每一位。
(3)数组
现在综合工具都能够处理一维数组,例如
对于word类型,综合工具通常将其综合为总线。My_RAM类型实际是二维的,
这种用两个一维数组代替一个两维数组是常用的综合建模技巧。现在先进的 综合工具如synospys DC可以将其综合为RAM,一般综合工具至少可以把它综 合为寄存器。
2.关系运算符
关系算符的综合没有统一的方法,综合工具常利用被比较数的特点作特定的优化 。图5.16是对”<”运算符综合的例子。
3.一元算术运算符
一元算术运算符有三个,即十,一和abs(取绝对值)。对前两个算符,综合工
具大都可以用组合逻辑线路实现,如图5.17的例子。abs算符的处理比较复杂 ,大部分综合工具尚不能提供支持。
变量在综合时要根据整体代码决定其处理方式,主要有以下几种方式:①用寄存 器锁存变量,也就是说,变量经过综合后形成了寄存器,但是生命期不重叠的变 量可以共享一个硬件寄存器;②在逻辑优化过程中被消去,即没有硬件对应物; ③作为一根硬件连线出现(由组合逻辑输出)。
2.信号赋值
信号只能在同步语句(显式或隐含的wait语句)之后改变状态。通常,综合后的信 号赋值语句会被化简为最简形式。综合工具处理信号的方式类似于变量,但有以 下区别:①如果信号需要寄存器锁存,那么被锁存的信号能与其他信号共享硬件 寄存器;②比较先进的综合工具可以按照设计师的要求,决定是否保持综合前后 信号的一致性;③出现在形如if CLK=’1’and CLK‘Event和then· · end if之间 或wait until CLK=‘0’and CLK’Event这样的时钟沿同步语句之后的信号都要被 锁存,而变量则不一定被锁存。
(4)记录类型
记录类型在定义复杂数据类型时非常方便,能够把不同数据类型的数据组织在一 起统一访问。但是,EDA工业界对综合工具是否应该支持记录类型还没有统一意 见,因此大多数综合工具不提供这种能力或只能把组合了简单数据类型的记录进 行综合。
2.可综合子集
VHDL在 1989年首次公布时,就提供了两个程序包 (package) :Standard 和 TextI(),其中定义了各种预定义数据类型。这些预定义数据类型中,类 型 Integer , Bit , Bit-Vector , Boolean , Character 和子类型 Natural , Positive是可综合的。类型File,Access和Real则不可被综合。
b)在常量作为算术运算的一个操作数出现时,综合工具常会对这一算 术运算实施特定的优化措施。当然,这样一来常量与综合结果中的硬件 就不是一一对应了。例如,优化综合工具用左移一位实现乘 2操作,用 右移一位实现除法操作。
c)常量在作为条件表达式的一部分(例 如下面的代码)时综合工具会对整个语 法结构进行布尔优化。