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条)