3.命名规则 3.1 实体和结构
规则:
·实体名要确切描述其功能;
·实体名只能用小写字母,不超过10个字符;
推荐:每个实体最好有一个3-4个字母的缩略名,可以将其应用在其内部的
构造模块(component)和信号名中。
3.2 端口
规则:
·端口名应和信号相对应,以大写字母开头;
·若端口是标准设备,可包含标准名,不超过15个字符;
·端口声明后要有详细注释。
3.3 结构体
结构体定义系统行为,可从不同方面对其进行描述,结构体和实体是
一致的,其名字要表明系统描述的方法。
规则:
·构造体名可用“behavioural”表示行为描述,“structural”表示
结构描述,“RTL”表示寄存器描述等;
·由综合出来的结构体要有“_syn”后缀,并且在开始和结束出
要注明采用的技术;
·在“ARCHITECTURE”语句前要有一行注释,说明其功能,
并说明是否可综合,或仅可仿真。
推荐:当一个设计中包含多个文件时,通过加“_arch”后缀来加以区分。
3.4 元件 component
元件 component在VHDL设计的层次结构中使用。
规则:其名称以包或实体的缩略名作开头;
可取有实际意义的单词,大小写可混用,最好不要超过8个字符。
3.5 配置
配置是用来说明逻辑模块和其构造体间的关系。
规则:配置名中要包含顶层设计名;以大写字母开头,不超过15个字符。
推荐:加“_cfg”后缀区分多个文件。
3.6包、函数和过程
3.6.1 包
规则:
·包中要包含系统所需定义的所有常量,数据类型,模块,过程和函数;
·包名以大写字母开头,不超过15个字符。
推荐:加“_pkg”后缀区分多个文件,为包定义一个3-4个字符的缩略名,
加在其中的常量,过程和函数名中,用以区分不同包中的内容。
3.6.2 函数和过程
规则:
·以大写字母开头,不超过10个字母;
·要体现其功能,用前缀“l_”表示局部变量;
·局部信号应有其特征域。
推荐:加入包的缩略名于其中。
3.7 常量和类属说明
规则:用大写字母,要明确描述常量的用法。
推荐:加入包的缩略名于其中。
3.8 枚举(enumeration),数据类型,记录和数组
规则:用大写字母,新数据类型要加后缀“_typ”。
3.9 信号和变量
3.9.1 信号
规则:
·第一个符号必须是字母,信号名要描述其功能,不超过15个字符;
·头三个字母要显示说明驱动模块的类型,要把其驱动实体,模块或进程
缩略名加在前面:如控制单元--“ctl”,算术逻辑运算单元--“alu”,
乘法器--“mac”,数据地址发生器--“dag”;
·如果信号只是在仅有时钟的进程中获得其值的,则加“_q”,若是总线则
加“_reg” 信号定义语句后要有一行注释描述其功能;
·信号名要表明信号的极性:高电平有效/正逻辑(P),低电平有效/负逻辑(N)
·全局信号“G”,局部信号“L”;若是三态信号,加Z;
·后续字符要说明信号的内容。
例如:“alu{GBaugend”--其驱动的模块为算术逻辑运算单元,高电平有效
全局信号,是算术逻辑运算单元的其中一个操作数的总线信号。
“macNGWoverflow”--其驱动的模块是乘法器,低电平有效全局单线信号,
其功能是在乘法器溢出时修改状态寄存器的溢出标志位。
3.9.2 变量
规则:
·变量名要简单并能描述其功能;
·变量名可包含各种格式的字母、数字和下划线;
·变量名要确切的表示其行为。
3.10进程和块
进程、块和配置可取有实际意义的单词,大小写可混用,最好不超过8个字符。
3.10.1 进程
规则:
·所有进程必须有进程名,用以描述其功能;
·注释要包含以下内容:组合、时序进程,组合进程要定义所有
敏感信号,时序进程要定义时钟和其边沿(上升沿或下降沿), 时序进程还要定义复位信号--如果有的话,其有效与否与时钟有关。
3.10.2 块
3.11 测试工作台 test bench
由于测试工作台在设计流程种的重要地位,因此,对其有一些特殊的要求。
规则:
·其名称要与实体名一致,且加后缀“_TB”;
·结构体、进程、变量和信号同样遵循上述规则;
·内存组织和仿真生成由过程和函数来实现;
·出错报告要提供下述信息:实体或模块名,信号或变量名,
过程或函数名,当前时间点,错误号或错误名,可能的出错原因,
出错位置(RTL, structural 或 behavioral代码);
3.12 文件和目录结构
现在在目前的集成开发环境中自动管理
3.13 其它
·尽可能使用类书参数说明(Generic)。
·尽量多定义常数,这样可以增加代码的可读性。
·写代码之前,要先画出系统框图,对自己要做的
模块有一个清楚的认识,这样可以减少你写代码时间,提高效率。
第三部分:HDL编码指导 1.复位
1.1 作用
复位使初始状态可预测,防止出现禁用状态。
1.2 推荐:
·
FPGA和
CPLD的复位信号采用异步低电平有效信号,
连接到其全局复位输入端,使用专用路径通道。
FPGA和
CPLD有固定时间延迟线,连接到所有资源上。
·对于目标器件为ASIC的core,异步时钟只能局部使用,
在顶层设计上要与时钟同步,这可以防止过长的延时。
·复位时,所有双向端口要处于输入状态。
1.3 强烈推荐:
复位信号必须连接到
FPGA和
CPLD的全局复位管脚。
这是由于这些管脚提供较低的抖动。
2.时钟
2.1 好的习惯:
在core中尽可使用小的时钟域。
2.2 推荐:
·信号穿过时钟的两半个周期时,要在前后分别取样;
防止出现半稳定状态。
·不要用时钟或复位信号作数据或使能信号,也不能用
数据信号作为时钟或复位信号;
HDL综合时会出现时序验证问题。
·不要使用门时钟(don't use gated clock)。
2.3 强烈推荐:
时钟信号必须连接到全局时钟管脚上。
3.总线
推荐:
·总线要从0位开始;
有些工具不支持不从0位开始的总线。
·从高位到低位;
这样可以避免在不同设计层上产生误解。
4.通用规则
4.1 强烈推荐:
不要使用内部三态信号,否则增加功耗。
这样使后端的调整更困难。
4.2 同步设计和时序优化
4.2.1强烈推荐:
·只使用同步设计;
这样可以避免在综合、时序验证和仿真中的出现的一些问题。
·不要使用延时单元; ·所有块的外部IO必须注册;
这样可以避免较长的路径延时
4.2.2 推荐:
·避免使用锁存器;
这样会产生综合和时序验证问题。
·避免使用负延触发的双稳态多谐振荡器(flip flop)。
同样会产生综合和时序验证问题。
4.2.3 好的习惯:
块内部IO要例化。
这是设计问题,在大部分情况下推荐使用