VHDL代码书写规范

VHDL代码书写规范


2024年4月14日发(作者:)

VHDL代码书写规范

(定稿)

文件编号 :

编 制 :

审 核 :

可靠性审核:

标准化:

批 准 :

VHDL代码书写规范

文件会签页

文件历史记录

文件编号

文件标题

现行版本

VHDL代码书写规范

文件履历

版次

V1.0

V1.0

编制

日期

更改内容(条款)

V1.0

第 1 页 共 11 页

VHDL代码书写规范

目 录

1.目的 ....................................................................................... 1

2.范围 ....................................................................................... 1

3.术语说明 ................................................................................... 1

4.书写规范 ................................................................................... 1

4.1命名规范 ................................................................................ 1

R1.一个文件只包含一个模块,文件命名和实体命名必须相同。文件名大写,其后缀小写。 ........... 1

R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。顶层文件的元件实例化,后缀使用_module;第

二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,

如:SRAM、FIFO等,那么优先使用具有代表性的名称) ......................................... 1

R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。 .......... 2

R4.命名要有实际意义。 ..................................................................... 2

R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。信号、变量等的命

名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。 ............................ 2

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

R7.实体、结构名、端口信号、常量用大写标识 ................................................. 2

R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。

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

R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;

FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘

法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以

SUB作后缀。 .............................................................................. 3

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

R11.模块内部定义的信号、变量采用首字母大写命名。首字母符合说明的要求。 .................... 3

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

向端口信号。 .............................................................................. 3

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

R14.对于微处理器接口的寄存器,必须包含reg标志。用下划线分开该寄存器功能特征。 ............ 4

R15.对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。多次采样加数字区分。 ........ 4

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

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

的保留字用小写。 ................................................................. 5

R19.调用IEEE 标准库时,“IEEE”用大写,其它用小写。 ...................................... 5

4.2注释规范 ................................................................................ 5

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

R21.每个信号、变量、常量和端口的定义都要有注释。 .......................................... 5

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

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

4.3其它书写规范 ............................................................................ 6

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

R25.每行字符数,最大不能超过120。 ......................................................... 6

第 2 页 共 11 页

VHDL代码书写规范

R26.模块端口每行定义一个。先根据端口功能进行区分,然后再根据输入输出方向进行区分,类间用空行

分开。 .................................................................................... 6

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

R28.调用模块进行端口映射时,一行代码只映射一个信号。顺序必须与原模块保持一致 .............. 6

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

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

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

第 3 页 共 11 页

VHDL代码书写规范

1.目的

规范VHDL的书写风格,保证代码的可读性、可重用性和可移植性,并且要与现有

的EDA工具保持一致,从而形成对VHDL代码的标准化管理。

2.范围

本标准规定了VHDL代码书写规范。

本标准适用于G-LINK公司研发中心。

3.术语说明

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

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

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

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

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

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

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

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

4.书写规范

4.1命名规范

R1.一个文件只包含一个模块,文件命名和实体命名必须相同。文件名大写,其后缀小写。

级别:规定

说明:文件类型为.vhd。如果文件名与实体名不一致,有些编译器不能识别,而且名字不

一致,也不利于将文件与模块对应,不利于文件的管理。

正例:文件名是SER_,那么文件内部实体的命名就是

entity SER_TSP is

port(

……

);

end SER_TSP;

architecture ARC_SER_TSP of SER_TSP is

……

end ARC_SER_TSP;

R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。顶层文件的元件实例化,后

缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若

遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的

名称)

级别:规定

说明:一般顶层文件命名使用工程名加器件名再加“_TOP”,如“OTDR_

XC3S1000BGA456_TOP”, 顶层文件的元件实例化,后缀使用_module,第二层文件的元

件实例化,后缀使用_block,第三层之后不做定义(若遇到常见的基本逻辑电路,如:SRAM、

FIFO等,那么按照SRAM、FIFO命名规则为优先)。

正例:文件名是OTDR_XC3S1000BGA456_,那么设计实体内部的结构如图1所

第 1 页 共 11 页

VHDL代码书写规范

示:

OTDR_XC3S1000BGA456_TOP.

vhd

AD9051_module

Sync_module

Sync_corr_block

Sync_corr_sram

Sync_corr_fifo

图1 设计实体内部的结构

R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约

定。

级别:规定

说明:命名约定包括模块命名、端口信号命名(确保工程的顶层文件的端口与原理图设计保持一致)、

端口信号引脚分配说明(是否是特殊引脚或是普通I/O脚)等。在整个系统的研发过程中,FPGA与其

它电路模块(CPU/模拟电路/通信接口等)之间的关系是非常密切的,为了处理好FPGA与其它电路模

块之间的相互联系,我们必须以文档的形式,清晰地说明输入输出端口的特性以及FPGA内部所完成

的功能,才能使整个研发团队之间的合作更加顺畅。

正例:

①FPGA与ARM微处理器之间采用SPI通信协议;

②SPI通信接口分别是:SPI_CLK、SPI_MISO、SP_MOSI、SPI_CS;

③SPI通信接口的引脚分配均为普通I/O引脚。

R4.命名要有实际意义。

级别:规定

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

正例:如全加器模块(FULL_ADDER)、半加器子模块(HALF_ADDER)和时钟信号锁相环模块

(CLK_SHIFT_PHASE_PLL)等

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

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

级别:规定

说明:由于某些综合工具对于总线类型的信号,综合的结果为总线名加上数字编号。如果信号、变量

名最后一个字母也使用数字的话,容易混扰。

正例:Pulse_FFT、AD_State、Address

反例:PulseFFT、ADState、Address8

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

级别:规定

说明:太长的命名不方便阅读。

R7.实体、结构名、端口信号、常量用大写标识

第 2 页 共 11 页

VHDL代码书写规范

级别:规定

说明:使用大写容易与一般的信号、变量区分。

R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_

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

体名”命名。

级别:规定

表1 实体命名方式

描述方式

行为级描述

结构级描述

数据流级描述

混合级描述

命名方式

BEH_实体名

STR_实体名

RTL_实体名

ARC_实体名

R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM

模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以

DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模

块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。

级别:规定

示例:如大小为512X8的双口RAM(其中512为数据深度,8为数据宽度),命名顺序为功能、存储

容量和器件类型:Function_512x8_dpram,调用时,例化名可以为U_Function_512x8_dpram,其中

Function说明双口RAM的作用。

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

级别:推荐

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

利于阅读报告。其中n表示多次实例化的编号,xx表示模块调用的特性(如用途等)。如果只调用一

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

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

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

R11.模块内部定义的信号、变量采用首字母大写命名。首字母符合说明的要求。

级别:规定

说明:首字符要求如表1所示:

表1 模块内部定义数据对象的首字符要求

信号

变量

常量

数组

例子

S_cpu_addr

V_data_buf

C_RSSI_ADDR

A_rssi

说 明

信号使用“S_”开头

变量使用“V_”开头

常量使用“C_”开头

数组使用“A_”开头

R12.非顶层模块端口信号命名方式采用I_portname、O_portname和IO_portname分别

对应输入、输出和双向端口信号。

级别:规定

说明:“I_”表示输入;“O_”表示输出;“IO_”表示双向。

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

级别:规定

说明:如果设计当中包括多个时钟,可以加上根据时钟的频率等特性说明,之间以下划线分开,如模

块端口时钟信号采用I_xx_clk(其中xx代表时钟的特性),模块内部时钟信号采用S_xx_clk(其中xx

代表时钟的特性),如I_15_36M_clk表示15.36MHz的时钟信号。关于时钟信号的表示方法如表2所

示:

第 3 页 共 11 页

VHDL代码书写规范

表2 时钟信号的表示方法

I_16chip_clk

S_16chip_clk

I_sys_clk

I_66_7M_clk

解释

16chip时钟信号;

16chip时钟信号;

系统时钟

如果时钟信号是66.7MHz,那么就使用66_7M表示,小数点

后最多保留3位。使用频率标记与chip时钟进行区分:

‘G’表示GHz;

‘M’表示MHz;

‘K’表示KHz;

‘Hz’表示Hz;

I_pp2s

S_66_7M_clk

PP2s必须使用‘pp2s’作为结尾,最好是完全使用。

如果时钟信号是66.7MHz,那么就使用66_7M表示,小数点

后最多保留3位。使用频率标记与chip时钟进行区分:

‘G’表示GHz;

‘M’表示MHz;

‘K’表示KHz;

‘Hz’表示Hz;

I_16chip_ph90_clk

16chip,相位90度,

90度是:‘ph90’;

180度是:‘ph180’;

270度是:‘ph270’;

R14.对于微处理器接口的寄存器,必须包含reg标志。用下划线分开该寄存器功能特征。

级别:规定

说明:这类是用于存储信息的信号,类似于单片机中的寄存器。

示例:如一个版本的寄存器命名为:S_version_reg。

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

分。

级别:规定

示例:多次采样,如:第1次采样命名为S_portname_1buf;第2次采样命名为:S_portname_2buf;依

次类推。

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

级别:规定

说明:表3列出了常用的信号缩写后缀,作为同类信号的后缀,如果是低有效则再加后缀_n。

表3 常用信号的缩写

信号类型

时钟信号

系统复位信号

数据总线

地址总线

读使能

后缀

clk

rst

data

addr

rd

第 4 页 共 11 页

VHDL代码书写规范

wr

int

wp

rp

cnt

reg

req

ack

en

clr

写使能

中断信号

写指针

读指针

计数器

寄存器

请求信号

应答信号

使能信号

清零信号

级别:规定

说明:有利于代码的阅读

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

的保留字用小写。

级别:规定

说明:有利于代码的阅读

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

级别:规定

示例:如:library IEEE;

use _logic_;

4.2注释规范

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

级别:规定

说明:每个VHDL源文件应在开始处注明模块名称、引用模块(顶层模块中不需要说明引用模块)、

功能描述、设计时间及版权信息,设计人、修改记录等。顶层模块需指出使用的逻辑器件,内容包括:

文件名称、功能描述、单位作者、创建日期、应用说明、更新说明、器件型号、更新作者和更新日期。

正例:

--*****************************************************************************

--文件名称:ARM_INTERFACE_

--功能描述:

--器件型号:

--单位作者:

--创建日期:

--应用说明:(应用特性和应用场合)

--更新说明:(更新内容和优化说明)

--更新作者:

--更新日期:

--*****************************************************************************

R21.每个信号、变量、常量和端口的定义都要有注释。

级别:推荐

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

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

级别:规定

说明:增加代码的可读性

正例:

-------------------------------

-- 进程注释

第 5 页 共 11 页

VHDL代码书写规范

-------------------------------

process

……

end process ;

--********************

-------------------------------

--进程注释

-------------------------------

process

……

end process ;

…………

-- END OF FILE ******

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

级别:推荐

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

4.3其它书写规范

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

级别:规定

说明:用缩进方式使得代码有层次感,使代码的整洁、美观,便于阅读。由于TAB键在不同编辑器中

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

建议:为了编写程序的方便,可以使用Utral_edit、USE等编辑工具,使用TAB键进行编写程序,然

后将TAB键转化为空格键,这样,就可以有TAB键的方便,也避免了缩进的问题;

R25.每行字符数,最大不能超过120。

级别:推荐

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

R26.模块端口每行定义一个。先根据端口功能进行区分,然后再根据输入输出方向进行区

分,类间用空行分开。

级别:规定

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

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

级别:规定

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

R28.调用模块进行端口映射时,一行代码只映射一个信号。顺序必须与原模块保持一致

级别:规定

说明:有利于代码的阅读。

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

级别:规定

说明:有利于代码的阅读。

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

级别:规定

说明:有利于代码的阅读。

正例:

信号定义

signal S_clk :std_logic;

signal S_rst :std_logic;

端口定义:

port(

I_clk :in std_logic;

O_clk :out std_logic;

第 6 页 共 11 页

VHDL代码书写规范

);

元件或模块调用:

component SER_TSP

port(

I_16_clk : in std_logic ; --注释

I_32_clk : in std_logic ; --注释

I_rst : in std_logic ; --注释

O_data : out std_logic_vector(7 downto 0) ; --注释

O_begin : out std_logic --注释

end component ;

元件或模块端口映射

U0_ser_tsp : SER_TSP

port map(

I_16_clk => I_16_clk, --注释

I_32_clk => I_32_clk, --注释

I_rst => I_rst, --注释

O_data(7 downto 0) => S_data(7 downto 0), --注释

O_begin => S_begin --注释

) ;

端口名要对齐。冒号要对齐,in或out类属要对齐,矢量定义要对齐。

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

级别:规定

说明:有利于代码的阅读。

示例:如:S_a <= S_b + S_c;

第 7 页 共 11 页


发布者:admin,转转请注明出处:http://www.yc00.com/web/1713088302a2180596.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信