Verilog+HDL+代码风格规范
- 格式:pdf
- 大小:356.38 KB
- 文档页数:20
VerilogHDL编码规范1 目的为了FPGA、芯片IP核开发设计和验证人员之间更好地进行交流,提高代码的可读性,可维护性,特制定本规范,作为程序编写的指导文件。
本规范包括强制性规范和推荐性规范。
2 适用范围FPGA、芯片IP核逻辑设计和仿真验证。
编程语言采用Verilog语言。
3 相关规定1.本规范内容为逻辑设计岗位、仿真验证岗位员工必备基础知识,新员工入职时必须通过参加相关培训掌握本规范。
2.本规范的掌握、执行情况是新员工转正考核的重要内容。
在新员工见习阶段,其内部导师每月须抽查代码并将审核结果填入代码审查表。
3.项目经理应不定期抽查项目成员的代码,并将编程规范执行情况填入代码审查表作为项目成员考核依据。
4.本规范为内部职称晋升考试内容。
1目录1. 严格级别定义 (4)2. 工程规则 (5)2.1. 工程规则表 (5)2.2. 工程规则详细说明 (5)3. 命名规则 (6)3.1. 命名规则表 (6)3.2. 命名规则详细说明 (6)4. 文件头规则 (10)4.1. 文件头规则表 (10)4.2. 文件头示例 (10)4.3. 结构头示例 (12)5. 注释规则 (14)5.1. 注释规则表 (14)5.2. 注释规则详细说明 (14)6. 编码规则 (16)6.1. 编码规则表 (16)6.2. 编码规则详细说明 (16)7. 综合规则 (23)7.1. 综合规则表 (23)7.2. 综合规则详细说明 (23)8. 静态时序分析规则 (27)8.1. 静态时序分析规则表 (27)8.2. 静态时序分析规则详细说明 (27)9. 仿真规则 (31)9.1. 仿真规则表 (31)9.2. 仿真规则详细说明 (31)10. 设计风格规则 (34)210.1. 设计风格规则表 (34)10.2. 设计风格规则详细说明 (34)11. 重用化设计 (38)11.1. 层次设计和模块划分 (38)11.2. 参数化 (40)12. 常用缩写表 (42)31.严格级别定义⏹Mandatory 1(M1)——必须遵守。
关于V erilogHDL编写规则的说明摘自“Comprehensive SRS V3 Standards—Semiconductor Reuse Standard”7 V erilog HDL 编码7.1 前言V erilog HDL编码标准属于虚拟部件生成一部分,用于对编码中的命名习惯、代码文档和代码格式风格的说明。
对相应规则的遵从能够简化重用,并从代码中抽象出其精华,使得代码可读性增强且兼容大多数工具。
除特别声明,任何与标准不一致的地方必须纠正而且以文档说明。
该标准确保在各种应用中代码的高度适应性,以此提升了重用性。
本文档的目的就是确保门级实现与标准的V erilog仿真器一致。
分割会影响针对应用的适应性。
建模实践小节处理在综合环境中很难描述清楚而又必须确保前后综合的一致性结构。
该标准可应用于行为和综合代码。
而且,还可以应用于其它的V erilog代码中如测试台、监视器等。
某些标准明确说明其应用代码的类型,如有例外会标出。
所描述的规则肯定是在快速Soc设计、集成、生产及维护过程中必须的要求项。
注意到在许多情况下,简单的介绍也能适应要求,但是,介绍会带来大量的例外、工具限制或一些深度的使用习惯,而这些与规则相悖。
7.1.1可交付的列表在第2部分VC块可交付列表已经定义了IP库形式。
包括:可综合的RTL源代码(L1)测试台(V1)驱动(V2)监视器(V3)详细行为建模(V4)短小模型(V6)形式模型验证(V12)7.2参考信息7.2.1参考文档略7.2.2术语基地址:偏移量相对的地址HDL:硬件描述语言屏蔽拴:物理上,屏蔽拴指一条连接到VDD或VSS,或者二个输入的选择输出线,用于对模块的配置而不会影响模块内部。
该设置能够在更改配置时避免重综合。
PLL:锁相环RTL:文本宏顶层模块:在VC设计层次中最高模块。
UDP:用户定义原语7.3命名规则7.3.1文件命名R7.3.1 一个文件一个模块一个文件最多可以有一个模块。
手把手教你学习FPGA系列教程硬件描述语言篇之Verilog HDL代码规范1.代码规范目的本规范的目的是提高书写代码的可读性、可修改性、可重用性,优化代码综合和仿真的结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范可编程技术的VerilogHDL设计输入,从而做到:1.逻辑功能正确,2.提高整洁度,3.便于跟踪、分析、调试,4.增强可读性,帮助阅读者理解,5.便于程序维护,6. 便于整理文档,7. 便于交流合作。
2.代码规范范围本规范涉及Verilog HDL编码风格,编码中应注意的问题,Testbench的编码等。
本规范适用于Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真、综合或二者结合的目的而设计的模块。
3.代码规范内容3.1标准的文件头在每一个版块的开头一定要使用统一的文件头,其中包括作者名,模块名,创建日期,所属项目,概要,更改记录,版权等必要信息。
3.2标准的module 格式(1)module例化名用xx_u标示(多次例化用次序号0,1,2…)。
(2)建议每个模块加timescale。
(3)不要书写空的模块,即一个模块至少要有一个输入一个输出。
(4)为了保持代码的清晰、美观和层次感,一条语句占用一行,每行限制在80个字符以内,如果较长则要换行。
(5)采用基于名字(name_based)的调用而非基于顺序的(order_based)的调用。
(6)模块的接口信号按输入、双向、输出顺序定义。
(7)使用降序定义向量有效位顺序,最低位是0。
(8)管脚和信号说明部分,一个管脚和一组总线占用一行,说明清晰。
(9)在顶层模块中,除了内部的互联和module的例化外,避免再做其他逻辑。
(10)为逻辑升级保留的无用端口以及信号要注释。
(11)建议采用层次化设计,模块之间相对独立。
3.3命名规则(1)每个文件只包含一个module,module名要小写,并且与文件名保持一致。
Verilog语言良好的代码编写格式Verilog 及VHDL良好的代码编写风格良好代码编写风格可以满足信、达、雅的要求。
在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。
良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;(2)使用有意义的信号名、端口名、函数名和参数名;(3)信号名长度不要太长;(4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;(6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。
注意在同一个设计中要使用同一个小写字母表示低电平有效;(7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n;(8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示;(9)尽量遵循业界已经习惯的一些约定。
如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;(10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;(11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。
注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;(12)每一行语句独立成行。
VerilogHDL编码规范VerilogHDL编码规范目录Table of Contents1 范围 (3)2 综述 (3)3 详述 (4)3.1基本格式 (4)3.1.1标准文件头 .......................................................................... 错误!未定义书签。
3.1.2 include (4)3.1.3缩进格式 (4)3.1.4注释 (4)3.1.5保留字 (4)3.2模块与端口 (4)3.2.1模块命名 (4)3.2.2模块例化 (4)3.2.3端口定义 (4)3.2.4输入与输出寄存 (4)3.3信号与变量 (5)3.3.1信号命名 (5)3.3.2向量 (5)3.3.3数据流向 (5)3.3.4 Integer类型 (5)3.3.5位宽匹配 (5)3.3.6内部寄存 (5)3.4时钟与复位 (5)3.4.1时钟复位命名 (5)3.4.2时钟可见性 (6)3.4.3时钟不可做数据输入 (6)3.4.4门控时钟和门控复位 (6)3.4.5全局复位 (6)3.4.6时钟产生 (6)3.5设计风格 (6)3.5.1 if与case (6)3.5.2调试寄存器 (6)3.5.3异步复位 (7)3.5.4时钟事件 (7)3.5.5顶层 (7)3.5.6电路分级 (7)3.5.7资源共享 (7)3.5.8 for语句 (7)3.5.9标准模块 (7)3.5.10参数使用 (7)3.5.11避免SnakePath (8)3.6状态机 (8)3.6.1状态机命名 (8)3.6.2初始状态 (8)3.6.3双进程 (8)3.6.4状态分配 (8)3.6.5无效状态 (8)3.6.6状态机编码 (8)3.7赋值 (8)3.7.1阻塞与非阻塞赋值 (8)3.7.2避免Latch (8)3.7.3一个信号对应一个always (9) 3.8 always (9)3.8.1敏感变量 (9)3.8.2边沿触发 (9)3.8.3单时钟(沿) (9)3.8.4避免Latch (9)3.8.5单(组)信号 (9)3.9可靠性 (9)3.9.1异步处理 (9)3.9.2亚稳态 (9)3.9.3异步反馈环路 (9)3.9.4避免Lacth (10)3.10综合 (10)3.10.1综合器开关 (10)3.10.2 for语句 (10)3.10.3运算符 (10)3.10.4移位变量 (10)3.10.5 PLI和TASK (10)3.10.6不可综合的语句 (10)参考文献............................................................................................ 错误!未定义书签。
技术报告名称:V erilog代码风格规范编号:版本号:作者项目部门产品中心日期2006-6-9制度规范目录前言 (2)1总则 (3)2职责 (3)3目的 (3)4内容 (3)4.1 基本原则 (3)4.1.1RTL级代码风格 (3)4.1.2组合时序电路分开原则 (4)4.1.3复位 (5)4.2 命名规则 (5)4.2.1基本命名标准 (5)4.2.2命名准则 (5)4.3 VERILOG HDL源代码文件结构 (8)4.3.1VERILOG HDL 代码文件文件头 (8)4.3.2VERILOG HDL 代码文件宏定义 (10)4.3.3VERILOG HDL 代码文件模块名及端口信号 (10)4.3.4VERILOG HDL 代码文件信号、变量及参数 (10)4.3.5VERILOG HDL 代码文件设计主体 (11)4.3.6VERILOG HDL 代码文件注释行 (14)4.3.7VERILOG HDL 代码文件独立Include.v (14)5VERILOG HDL代码范例 (14)5.1 复用器表达方式 (14)前言为了更好地规范团队成员在研发项目时VERILOG硬件描述语言的撰写,以达到代码规范化和标准化的目的,特制定本规范。
1总则本规范规定了IC设计项目开发过程中VERILOG HDL 源代码的编写总则、要求及模板文件。
本规范适用于信息安全团队及IPTV项目各IC产品在设计开发过程中源代码的编写。
2职责各模块设计成员负责根据本规范的要求编写VERILOG HDL 源代码。
系统组成员负责本规范对各项目的VERILOG HDL 源代码进行规范化格式审查及管理。
3目的制定本规范的目的:3.1 便于项目组成员之间对源代码的理解、交流及相互检查;3.2 便于设计者本人在项目开发之后或产品升级过程中利用源代码很快理解原有设计;3.3 便于模块开发过程中不同版本源代码的管理;3.4 便于模块仿真过程中很快发现问题的出处;3.5 便于模块整合时各子模块的链接。
1.目的本规范的目的是提高书写代码的可读性、可修改性、可重用性,优化代码综合和仿真的结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化可编程技术部的FPGA设计输入,从而做到:①逻辑功能正确,②可快速仿真,③综合结果最优(如果是hardware model),④可读性较好。
2.范围本规范涉及Verilog HDL编码风格,编码中应注意的问题,Testbench的编码等。
本规范适用于Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真、综合或二者结合的目的而设计的模块。
3.定义Verilog HDL : Verilog 硬件描述语言FSM :有限状态机伪路径:静态时序分析(STA)认为是时序失败,而设计者认为是正确的路径。
4.规范内容4.1.Verilog 编码风格本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。
4.1.1. 命名的习惯选择有意义的信号和变量名,对设计是十分重要的。
命名包含信号或变量诸如出处、有效状态等基本含义,下面给出一些命名的规则。
y用有意义而有效的名字有效的命名有时并不是要求将功能描述出来,如For ( I = 0; I < 1024; I = I + 1 )Mem[I] <= 32’b0;For 语句中的循环指针I 就没必要用loop_index作为指针名。
y用连贯的缩写长的名字对书写和记忆会带来不便,甚至带来错误。
采用缩写时应注意同一信号在模块中的一致性。
缩写的例子如下:Addr addressPntr pointerClk clockresety 用最右边的字符下划线表示低电平有效,高电平有效的信号不得以下划线表示,短暂的引擎信号建议采用高有效。