VHDL代码设计规范.docx

上传人:b****3 文档编号:10241287 上传时间:2023-05-24 格式:DOCX 页数:49 大小:142.53KB
下载 相关 举报
VHDL代码设计规范.docx_第1页
第1页 / 共49页
VHDL代码设计规范.docx_第2页
第2页 / 共49页
VHDL代码设计规范.docx_第3页
第3页 / 共49页
VHDL代码设计规范.docx_第4页
第4页 / 共49页
VHDL代码设计规范.docx_第5页
第5页 / 共49页
VHDL代码设计规范.docx_第6页
第6页 / 共49页
VHDL代码设计规范.docx_第7页
第7页 / 共49页
VHDL代码设计规范.docx_第8页
第8页 / 共49页
VHDL代码设计规范.docx_第9页
第9页 / 共49页
VHDL代码设计规范.docx_第10页
第10页 / 共49页
VHDL代码设计规范.docx_第11页
第11页 / 共49页
VHDL代码设计规范.docx_第12页
第12页 / 共49页
VHDL代码设计规范.docx_第13页
第13页 / 共49页
VHDL代码设计规范.docx_第14页
第14页 / 共49页
VHDL代码设计规范.docx_第15页
第15页 / 共49页
VHDL代码设计规范.docx_第16页
第16页 / 共49页
VHDL代码设计规范.docx_第17页
第17页 / 共49页
VHDL代码设计规范.docx_第18页
第18页 / 共49页
VHDL代码设计规范.docx_第19页
第19页 / 共49页
VHDL代码设计规范.docx_第20页
第20页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

VHDL代码设计规范.docx

《VHDL代码设计规范.docx》由会员分享,可在线阅读,更多相关《VHDL代码设计规范.docx(49页珍藏版)》请在冰点文库上搜索。

VHDL代码设计规范.docx

VHDL代码设计规范

文件会签页

文件标题

VHDL编码规范(试用版)

文件编号

授权

分发清单

 

加盖受控章

签名

签名

编制

审核

部门

部门

签名

签名

审核

审核

部门

部门

签名

签名

审核

审核

部门

部门

签名

签名

审核

审核

部门

部门

签名

签名

审核

审核

部门

部门

签名

签名

审核

审核

部门

部门

签名

签名

审核

审核

部门

部门

审批

签名

批准

签名

生效日期:

文件历史记录

文件编号

现行版本

V1.0

文件标题

VHDL代码设计规范

文件履历

版次

编制

日期

更改内容(条款)

 

 

VHDL代码设计规范

(评审稿)

文件编号:

 

编制:

审核:

 

 

VHDL代码设计规范

(定稿)

文件编号:

编制:

审核:

可靠性审核:

标准化:

批准:

 

1.目的

规范VHDL的设计风格,保证代码的可读性、重用性及与现有EDA工具的一致性,从而形成对设计代码的标准化管理。

2.范围

本标准规定了VHDL代码设计规范。

本标准适用于COMBA公司技术中心。

3.术语说明

本规范使用的术语解释如下:

级别:

指该规则遵循的级别,有两个级别,分别为推荐和规定。

推荐:

表示在一般情况下必须遵循该规则。

规定:

表示必须严格遵守该规则。

说明:

对此规则或准则的必要的解释。

示例:

对此规则举例进行说明,示例分为正例和反例。

正例:

对此规则或准则给出的正确示例。

反例:

对此规则或准则给出的反面示例。

4.规范列表

编号

级别

规则

书写规范

R1.

规定

一个文件只包含一个模块,文件命名、模块命名、实体命名必须相同。

文件名及其后缀必须小写.

R2.

规定

顶层文件命名方式使用器件型号、工程名与_top结合。

第二层文件后缀使用_module,第三层文件使用_block,第四层之后不做定义。

R3.

规定

模块使用功能进行划分,第二层文件及下面的模块命名,第一个单词需要与第二层文件一致。

R4.

推荐

代码编写之前,以文档的方式,进行命名约定

R5.

规定

命名要有实际意义。

R6.

规定

命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。

信号、变量等的命名最后的也一定要求是字母,中间的可以是数字或者其他合法符号。

R7.

规定

模块、信号、变量等的命名不大于64个字符

R8.

推荐

实体,结构名用大写标识

R9.

推荐

行为级、结构级的结构体命名分别以“BEH_实体名”和“STR_实体名”区分。

如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名.

R10.

规定

单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。

R11.

推荐

模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。

R12.

规定

模块内部定义的信号、变量采用首字母大写命名。

首字母符合说明的要求

R13.

规定

非顶层模块端口信号命名方式采用I_portname、O_portname分别对应输入、输出端口信号。

R14.

规定

顶层模块端口信号命名要求与原理图命名一致或者是相关意义的英文单词或者字母

R15.

规定

时钟信号必须用后缀“_clk”进行命名

R16.

规定

对于微处理器接口的寄存器,必须包含reg标志。

用下划线分开该寄存器功能特征

R17.

规定

对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。

多次采样加数字区分

R18.

规定

一些常用的基本信号按说明统一后缀命名

R19.

规定

多比特信号,应该使用相同的比特顺序,都采用downto描述。

R20.

规定

VHDL的保留字用小写

R21.

规定

调用IEEE标准库时,“IEEE”用大写,其余用小写。

R22.

规定

每个VHDL源文件应该在文件头注释文件的基本信息

R23.

规定

每个信号,变量和端口的定义都要有注释

R24.

规定

每个进程使用“--------”隔开。

如果一个功能模块由几个进程组成,使用”--*****”隔开。

R25.

推荐

对于内部表,注释说明表的组成、表的内容及作用

R26.

规定

用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格

R27.

推荐

每行字符数推荐不大于90,最大不能超过120

R28.

规定

模块端口每行定义一个。

根据端口功能进行区分,类间用空行分开

R29.

推荐

调用模块使用“=>”方式进行端口映射,总线到总线映射时(xdowntoy)要写全

R30.

规定

调用模块进行端口实例时,一行代码只实例一个信号。

顺序必须与原模块保持一致

R31.

规定

功能集中或有很强的相关性的变量信号声明放在一起,类间用空行或注释分开

R32.

规定

端口、信号、变量定义需要对齐,端口实例化需要对齐

R33.

规定

运算符与信号之间必须有空格分开

设计规范

R34.

规定

全局复位信号使用器件提供的全局信号管脚

R35.

推荐

当采用异步复位时,推荐使用同步释放的方式

R36.

规定

每个输出管脚和内部定义的信号都应该通过复位信号赋初值

R37.

推荐

全局时钟输入在管脚够用的情况下必须使用器件全局时钟输入管脚

R38.

推荐

尽量不要在设计中对同一时钟的上升沿和下降沿混合使用,建议使用上升沿,可以考虑使用高频时钟替代时钟沿的混用

R39.

推荐

避免使用内部的产生的信号(如分频信号)作为时钟信号

R40.

规定

如果一定使用分频时钟的话,必须使用全局布线资源。

R41.

规定

避免使用门控时钟

R42.

推荐

FPGA的输入时钟至少有一个本地时钟,用作CPU接口或监控时钟。

R43.

推荐

逻辑控制推荐使用状态机实现

R44.

规定

状态机的各个状态,使用参数表示

R45.

推荐

状态机编码:

在速度可以满足要求的情况下,不推荐使用one_hot编码;进行二进制编码且状态机的处理流程比较单一时,推荐使用格雷码。

R46.

规定

并行信号总线,如果与采样时钟异步,必须进行两次采样比较,才能作为采样的结果使用

R47.

规定

对与时钟异步的信号进行沿检测,需要先采样该信号,再对该信号的采样信号进行沿检测

R48.

规定

对于异步信号,必须先进行同步,不能直接使用。

R49.

推荐

顶层文件只作为内部模块的互联,一般不再包含逻辑

R50.

推荐

内部模块间端口尽量避免使用inout类型端口

R51.

规定

所有端口禁止使用buffer类型端口

R52.

规定

异步进程的敏感列表中一定要列全所有敏感信号

R53.

推荐

使用括号表示优先级

R54.

推荐

使用参数化设计

R55.

规定

所有预留输入管脚与起来送到一个垃圾输出管脚;所有预留输出管脚根据系统要求输出无效电平

R56.

规定

计数器(signal)按2的整数次幂方式定义,使用时,注意对不用状态的处理

R57.

推荐

模块划分应该以功能为原则

R58.

推荐

模块划分区分面积敏感和速度敏感的部分,将它们分在不同模块

R59.

推荐

建议每个进程只处理一个信号或只处理一组时序密切相关的信号

R60.

规定

组合逻辑中,每一个if语句,必须有一个else语句。

如果else不会发生,或不进行操作,else条件下加上空语句

R61.

推荐

if嵌套不宜太多

设计常识

R62.

推荐

if和case语句

R63.

推荐

状态机的设计

R64.

推荐

流水线操作

R65.

规定

顶层模块的输入输出端口信号的命名采用IO_portname的方式。

5.规范

本规范分为书写规范、设计规范以及其他设计注意事项,下面分别进行说明。

5.1.书写规范

5.1.1.命名规范

R1.一个文件只包含一个模块,文件命名、模块命名、实体命名必须相同。

文件名必须小写。

级别:

规定

说明:

文件类型为.vhd。

如果文件名与模块名不一致,有些编译器不能识别,而且名字不一致,也不利于将文件与模块对应,不利于文件的管理。

示例:

请参阅例:

文件模块命名。

R2.顶层文件命名方式使用器件型号与_top结合。

第二层文件后缀使用_module,第三层文件使用_block,第四层之后不做定义。

级别:

规定

说明:

一般顶层文件命名使用器件名加工程名再加“_top”,如“xc3s1000bga456_rru_top”,第二层文件使用“_module”,如“ad5320_module”,第三层文件使用“_block”,如“sync_corr_block”。

如果是最基本的元件,如DPRAM、FIFO等,按照DPRAM、FIFO命名规则为优先。

R3.第二层模块使用功能进行划分,第二层文件下面的文件命名第一个单词需要与第二层文件一致。

级别:

规定

说明:

逻辑模块使用功能进行划分,为了每一个模块的文件按照顺序排列在一起,方便文件管理,需要该模块的文件命名全部使用相同的单词作为第一个单词。

R4.代码编写之前,以文档的方式,进行命名约定。

级别:

推荐

说明:

命名约定包括模块命名、端口信号命名等。

R5.命名要有实际意义。

级别:

规定

说明:

具有一定意义的命名比写上好几行的注释要好得多。

示例:

如同步模块sync_module,同步模块中的相关子模块sync_corr_block。

R6.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。

信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。

级别:

规定

说明:

由于某些综合工具对于总线类型的信号,综合的结果为总线名加上数字编号。

如果信号/变量名最后一个字母也使用数字的话,容易混扰。

R7.模块、信号、变量等的命名不大于64个字符

级别:

规定

说明:

太长的命名不方便阅读。

R8.实体,结构名用大写标识

级别:

推荐

说明:

使用大写容易与一般的信号端口区分。

R9.行为级、结构级的结构命名分别以“BEH_实体名”和“STR_实体名”区分。

如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名.

级别:

推荐

R10.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。

级别:

规定

示例:

如大小为512X8的双口RAM(其中512为数据深度,8为数据宽度),命名为Xx_512x8_dpram,调用时,例化名可以为U_xx_512x8_dpram,其中xx说明双口RAM的作用。

R11.模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。

级别:

推荐

说明:

因为综合、布线工具的工具,一般都将使用实例标志输出报告,如果没有表示模块的名字,不利于阅读报告。

其中n表示多次实例化的编号,xx表示模块调用的特性(如用途等)。

如果只调用一次,那么就不必使用数字,直接就是‘U_xx_元件名’

示例:

如HDLC发送模块hdlc_trans,调用时例化名可以为:

U0_hirs_hdlc_trans,U1_e1_hdlc_trans;对于三态输出单元tri,调用时例化名可以为M_cpuio_tri。

R12.模块内部定义的信号、变量采用首字母大写命名。

首字母符合说明的要求。

级别:

规定

说明:

首字符要求如下表:

例子

说明

信号

S_cpu_addr

信号使用“S_”开头

变量

V_data_buf

变量使用“V_”开头

常量

C_rssi_addr

常量使用“C_”开头

数组

A_rssi

数组使用“A_”开头

R13.非顶层模块端口信号命名方式采用I_portname、O_portname分别对应输入、输出端口信号。

级别:

规定

说明:

“I_”表示输入;“O_”表示输出。

R14.顶层模块端口信号命名要求与原理图命名一致或者是相关意义的英文单词或者字母。

级别:

规定

说明:

由于顶层文件的端口就是外部管脚,如果与原理图命名不一致,不利于理解模块与其它器件的连接关系。

R15.时钟信号必须用后缀“_clk”进行命名。

级别:

规定

说明:

如果设计当中包括多个时钟,可以加上根据时钟的频率等特性说明,之间以下划线分开,如模块内部的时钟信号采用I_xx_clk(其中xx代表时钟的特性),如I_15_36M_clk表示15.36MHz的时钟信号。

示例:

请见例:

时钟命名

R16.对于微处理器接口的寄存器,必须包含reg标志。

用下划线分开该寄存器功能特征。

级别:

规定

示例:

如一个版本的寄存器命名为:

S_version_reg。

R17.对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。

多次采样加数字区分。

级别:

规定

示例:

多次采样,如:

第1次采样命名为S_portname_1buf;第2次采样命名为:

S_portname_2buf;依次类推。

R18.一些常用的基本信号按说明统一后缀命名。

级别:

规定

说明:

以下列出的常用的信号缩写,作为同类信号的后缀。

信号类型

后缀

时钟信号

clk

系统复位信号

rst

数据总线

data

地址总线

addr

读使能

rd

写使能

wr

中断信号

int

写指针

wp

读指针

rp

计数器

cnt

寄存器

reg

请求信号

req

应答信号

ack

R19.多比特信号,应该使用相同的比特顺序,都采用downto描述。

级别:

规定

说明:

有利于代码的阅读

R20.VHDL的保留字用小写。

级别:

规定

R21.调用IEEE标准库时,“IEEE”用大写,其余用小写。

级别:

规定

示例:

如:

libraryIEEE;

useIEEE.std_logic_1164.all;

5.1.2.注释规范

R22.每个VHDL源文件应该在文件头注释文件的基本信息。

级别:

规定

说明:

每个VHDL源文件应在开始处注明模块名称、引用模块(顶层模块中不需要说明引用模块)、功能描述、设计时间及版权信息,设计人、修改记录等。

顶层模块需指出使用的逻辑器件

示例:

请参阅例:

文件头注释或代码模板。

R23.每个信号,变量和端口的定义都要有注释。

级别:

推荐

说明:

对每个信号,变量和端口的作用作个简单说明。

R24.每个进程使用“--------”隔开。

如果一个功能模块由几个进程组成,使用”--*****”隔开。

级别:

规定

说明:

增加代码的可读性

示例:

请参阅例:

进程间隔注释或代码模板。

R25.对于内部表,注释说明表的组成、表的内容及作用。

级别:

推荐

说明:

加上注释可以增加对表的理解。

5.1.3.其他书写规范

R26.用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格。

级别:

规定

说明:

用缩进方式使得代码有层次感,使代码的整洁、美观,便于阅读。

由于TAB键在不同编辑器中解释不一定相同,为了避免不同编辑器下缩进混乱,不能使用TAB键

建议:

为了编写程序的方便,可以使用Utral_edit等编辑工具,使用TAB键进行编写程序,然后将TAB键转化为空格键,这样,就可以有TAB键的方便,也避免了缩进的问题;

R27.每行字符数推荐不大于90,最大不能超过120。

级别:

推荐

说明:

以便于在不同的计算机上阅读代码,不需要进行横向移屏才能够阅读。

R28.模块端口每行定义一个。

根据端口功能进行区分,类间用空行分开。

级别:

规定

说明:

端口分类方式根据实际情况决定,只要利于进行端口的理解就可以。

R29.调用模块使用“=>”方式进行端口映射,总线到总线映射时(xdowntoy)要写全。

级别:

规定

说明:

有利于代码的阅读和查错。

R30.调用模块进行端口映射时,一行代码只映射一个信号。

顺序必须与原模块保持一致

级别:

规定

说明:

有利于代码的阅读。

R31.功能集中或有很强的相关性的变量信号声明放在一起,类间用空行或注释分开。

级别:

规定

说明:

有利于代码的阅读。

示例:

请见例:

变量信号声明

R32.端口、信号、变量定义需要对齐;模块实例化时,端口映射需要对齐。

级别:

规定

说明:

有利于代码的阅读。

示例:

请见例:

信号端口定义对齐

R33.运算符与信号之间必须有空格分开

级别:

规定

说明:

有利于代码的阅读。

示例:

如:

S_a<=S_b+S_c;

5.2.设计规范

5.2.1.复位

R34.全局复位信号使用器件提供的全局信号管脚

级别:

规定

说明:

全局信号使用全局信号管脚。

R35.当采用异步复位时,推荐使用同步释放的方式。

级别:

推荐

说明:

这种方式可以具有异步复位的优点,同时可以避免异步复位的缺点。

示例:

请参阅:

异步复位的同步释放。

R36.每个输出管脚和内部定义的信号都应该通过复位信号赋初值

级别:

规定

说明:

避免系统上电进入不稳定工作状态。

5.2.2.时钟

R37.全局时钟输入在管脚够用的情况下必须使用器件全局时钟输入管脚

级别:

推荐

说明:

保证时钟信号具有最小Skew。

R38.尽量不要在设计中对同一时钟的上升沿和下降沿混合使用,建议使用上升沿,可以考虑使用高频时钟替代时钟沿的混用;

级别:

推荐

R39.避免使用内部的产生的信号(如分频信号)作为时钟信号

级别:

推荐

说明:

因为这些信号并非全局信号,容易造成到达各寄存器的时间不一致。

建议考虑内部分频信号作为控制信号使用

示例:

请见例:

分频时钟的实现方法

R40.如果一定使用分频时钟的话,必须使用全局布线资源。

级别:

规定

说明:

使用全局布线资源可以减少分频时钟信号到达各寄存器时间的偏差。

对于Xilinx器件,可以使用BUFG驱动。

R41.避免使用门控时钟

级别:

规定

说明:

门控时钟容易产生毛刺。

建议考虑内部信号作为控制信号使用

示例:

请见例:

门控时钟的实现方法

R42.FPGA的输入时钟至少有一个本地时钟,用作CPU接口或监控时钟。

级别:

推荐

说明:

这是因为本地时钟比较稳定,不会受到其他单板的影响。

当外部时钟不稳定或丢失时,保证FPGA的可测可维性。

5.2.3.状态机

R43.逻辑控制推荐使用状态机实现

级别:

推荐

说明:

状态处理的过程比较清晰,方便理解

R44.状态机的各个状态,使用参数表示

级别:

规定

说明:

状态机的状态使用参数表示,可以提高代码的可读性。

示例:

可以参阅例:

状态机状态参数表示

R45.状态机编码:

在速度可以满足要求的情况下,不推荐使用one_hot编码;进行二进制编码且状态机的处理流程比较单一时,推荐使用格雷码。

级别:

推荐

说明:

one_hot必须考虑未用状态的处理,容易引起一些错误;

5.2.4.异步信号

R46.并行信号总线,如果与采样时钟异步,必须进行两次采样比较,才能作为采样的结果使用。

级别:

规定

说明:

避免采到错误的数据。

示例:

请参阅:

并行数据的异步采样

R47.对与时钟异步的信号进行沿检测,需要先采样该信号,再对该信号的采样信号进行沿检测

级别:

规定

说明:

避免保持时间/建立时间不足引起错误。

示例:

请参阅例:

异步信号的沿检测

R48.对于异步信号,必须先进行同步,不能直接使用。

级别:

规定

说明:

因为当异步的信号与触发器的时钟的沿很接近的情况下,就有可能产生在该时钟周期有些触发器能够满足建立时间的要求而产生翻转,有些还没有满足建立时间的要求而没有变化,出现错误的结果。

示例:

请参阅例:

异步的信号驱动多个触发器

5.2.5.其他设计规范

R49.顶层文件只作为内部模块的互联,一般不再包含逻辑。

级别:

推荐

R50.内部模块间端口不推荐使用inout类型端口。

级别:

规定

说明:

使用inout类型端口容易引入错误。

R51.所有端口禁止使用buffer类型端口

级别:

规定

说明:

使用buffer类型端口容易引入一些不容易排查的错误。

示例:

如何使用out端口类型实现buffer端口类型请参阅例:

buffer端口类型的实现

R52.异步进程的敏感列表中一定要列全所有敏感信号。

级别:

规定

说明:

避免前后仿真的不一致,避免出现warning。

顺序按照在进程中出现的先后次序排列。

R53.使用括号表示优先级。

级别:

推荐

说明:

括号可以用于定义逻辑分组,从而实现控制设计的结构,提高逻辑的效率。

示例:

请参阅例:

括号的使用。

R54.使用参数化设计。

级别:

推荐

说明:

设计当中使用常数而不直接使用数字,减少维护修改的工作量和难度。

示例:

请参阅:

参数化设计。

R55.所有预留输入管脚与起来送到一个垃圾输出管脚;所有预留输出管脚根据系统要求输出无效电平。

级别:

规定

说明:

避免出现管脚锁定出错或将影响其它连接到该信号线的器件的工作;其它无用信号不要引入module内部,尽量避免在elaborate和compile时产生warning,干扰错误定位。

避免系统存在隐患,工作不正常。

R56.计数器(signal)按2的整数次幂方式定义,使用时,注意对不用状态的处理。

级别:

规定

R57.模块划分应该以功能为原则

级别:

推荐

说明:

一般一个模块实现一个功能,方便模块的重复应用

R58.模块划分区分面积敏感和速度敏感的部分,将它们分在不同模块

级别:

推荐

说明:

不同要求的模块所要求的约束也不一样,方便给模块加约束。

R59.建议每个进程只处理一个信号或只处理一组时序密切相关的信号

级别:

推荐

说明:

方便维护与修改

R60.组合逻辑中,每一个if语句,必须有一个else语句。

如果else不会发生,或不进行操作,else条件下加上空语句

级别:

规定

说明:

易于查错

R61.if嵌套不宜太多

级别:

推荐

说明:

以免引入太大的延时

5.3.设计常识

R62.if和case语句

级别:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2