Verilog编码风格
VERYLOG编码规范
Verilog编码规范!一. 强调Verilog代码编写风格的必要性。
强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。
每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。
与自己编写风格相近的代码,阅读起来容易接受和理解。
相反和自己编写风格差别较大的代码,阅读和接受起来就困难一些。
曾有编程大师总结说,一个优秀的程序员,能维护的代码长度大约在1万行数量级。
代码的整洁程度,很大程度上影响着代码的维护难度。
遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。
相反代码编写风格随意的代码,通常晦涩、凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。
(实际上英文Coding Style有另一层涵义,更偏重的是,某一个电路,用那一种形式的语言描述,才能将电路描述得更准确,综合以后产生的电路更合理。
本文更偏重的是,编写Verilog代码时的书写习惯。
)二. 强调编写规范的宗旨。
缩小篇幅提高整洁度便于跟踪、分析、调试增强可读性,帮助阅读者理解便于整理文档便于交流合作三. 变量及信号命名规范。
1. 系统级信号的命名。
系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。
2. 低电平有效的信号后一律加下划线和字母n。
如:SysRst_n;FifoFull_n;3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。
如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。
低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。
如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。
如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。
4. 模块的命名。
在系统设计阶段应该为每个模块进行命名。
命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。
2024版Verilog编程规范(华为)
实现自动化测试流程,提高测试 效率和准确性。
06
代码审查与质量保证
代码审查流程介绍
提交代码
开发人员将代码提交到代码审查 系统中。
分配审查任务
系统或审查组长将审查任务分配 给审查人员。
代码审查
审查人员对代码进行逐行审查, 检查是否符合编程规范和质量要
求。
审查通过
经过多轮反馈和整改后,代码符 合要求,审查通过。
通过定期的培训、分享和宣传活动,提高开 发人员对Verilog编程规范的认识和重视程度。
引入自动化检查工具
建立持续改进机制
研究和引入自动化检查工具,对Verilog代码 进行静态分析和规范检查,进一步提高代码 质量和开发效率。
建立规范的持续改进机制,收集开发人员的 反馈和建议,及时调整和优化规范内容。
可重用性原则
模块应具有高内聚、低耦 合的特点,便于在不同项 目中重用。
可维护性原则
模块应易于理解、测试和 修改,以降低维护成本。
顶层结构设计方法
自顶向下设计
从系统整体需求出发,逐 步细化到各个模块的设计 和实现。
模块化设计
将系统划分为多个独立的 模块,每个模块承担一定 的功能,便于并行开发和 维护。
减少错误和提高代码质量
02
规范的编程习惯有助于减少编码过程中的错误,提高代码的稳
定性和可靠性。
促进知识共享和传承
03
统一的编程规范有利于知识的积累和传承,降低新人学习成本,
提高团队整体技术水平。
适用范围及对象
适用范围
本规范适用于使用Verilog语言进 行硬件描述和设计的所有场景,包 括但不限于数字电路设计、验证、 仿真等。
端口名应避免与模块内部变量名冲突。
verilog语言编码风格
2.6
状态机编码设计风格 ....................................................................................... 16
2.6.1
几种编码方式 ..................................................................................... 16
1.3.3
函数和任务............................................................................................ 5
1.3.4
变量 ......................................................................................................... 5
2.4.1
敏感表的使用 ....................................................................................... 8
2.4.2
赋值 ......................................................................................................... 9
2.4.3 if 语句.......................................................................................................... 12
VerilogHDL编码规范
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)——必须遵守。
verilog的代码规范和coding风格
verilog的代码规范和coding风格想要成为一名优秀的数字IC设计工程师需要哪些基本的专业知识呢?如下:1.半导体物理学、半导体器件物理学、基本的固体物理、半导体工艺与制造等物理学知识;2.电路分析、模拟电子线路、COMS模拟集成电路、专用集成电路基础等模拟IC知识;3.信号系统、数字信号处理、信道编码、通信原理等通信知识;4.C语言、汇编、C++、脚本(shell、tcl、perl)、Linux(我觉得如果懂kernel那就更好了)、体系结构、组成原理等计算机知识;5.各种EDA和编程调试工具的使用Modelsim、Debussy、quartus ii、Cadence、DC、vim等等(就数字方向而言用的最多的5种左右,模拟另当别论);另外虚拟机什么的总得玩得转吧!6.当然最重要的还是我们亲爱的--verilog,不会verilog(当然VHDL也是一样的)那你会别的也算不上优秀的Digital IC Engineer!verilog语法并不复杂,只是初学者容易犯一些“类C”错误,总会不经意间将verilog写成了C语言,或者是没有使用并行思想,或者就是多处赋值等等问题。
如果我们克服了之前的一些小毛病,在这些之外,我们想更近一步提升自己的写代码水平、研发水平,而不是只做一个码农的话那么我们要做的就是:第一步:提高代码规范性,每个企业、研究所可能都有自己的一套代码书写规范,但是总的来说都有一些共性,而且往往这些共性的地方还特别多,一个没有代码规范的程序员不可能写出非常漂亮和优秀的程序,当然有了规范的代码后也不一定就能写出漂亮和优秀的程序,这是两码事。
代码规范之后的一个境界我觉得是优良的编程风格,编程风格不同于代码规范,编程风格在verilog中特别指代那些逻辑上的风格,同样的功能,使用不同的编程风格,代码综合面积可能是几倍的关系,这一点我深有体会,另外,人们不经意间的编码习惯可能会导致许多冗余代码,在verilog综合之后,这些冗余就会成为实实在在多出来的不必要的电路,他们或者是寄存器或者是没用的组合逻辑,虽然往往DC一类的综合工具会对代码综合进行优化,并且会根据综合脚本进行最大化的优化计算,但是工具毕竟是工具,他不可代替人类,很多冗余电路综合工具并没有办法进行优化,因为工具并不知道你的本意,也不可完全进行语意预测,而不必要的电路意味着更多的流片成本,更低的work效率和更多的功耗消耗,这些都不是我们想看到的,所以一个好的coding风格本身对于企业来说就是非常大的价值!!!当然我认为要培养良好的coding风格并不是一件容易的事,本身 verilog design == 电路设计,透过代码看电路这个能力并不是一蹴而就的,这需要我们的长期的学习和思考总结,就像模拟设计一样,往往这是一种经验!。
verilog编码规则检查 -回复
verilog编码规则检查-回复在Verilog编程中,遵循一定的编码规则是非常重要的。
这些规则有助于增加代码的可读性、可维护性和可重用性,从而提高整体的代码品质。
本文将详细讨论一些常见的Verilog编码规则检查,帮助您了解如何正确地编写高质量的Verilog代码。
第一部分:文件和模块在编写Verilog代码时,首先需要创建一个文件和定义一个模块。
以下是一些与文件和模块相关的编码规则:1. 文件命名:保持文件命名简洁明了,使用有意义的名称,并以".v"作为文件扩展名。
例如,"priority_encoder.v"。
2. 模块命名:每个模块也应具有有意义和描述性的名称。
命名应使用驼峰式大小写,以便在查看代码时更容易理解。
3. 模块接口:明确定义模块的输入和输出接口。
每个接口信号都应有明确的名称和数据类型。
推荐使用`input`和`output`关键字来定义接口。
4. always块:在模块的always块中,避免使用无限循环。
始终为always 块提供明确的条件,以便它只在满足特定条件时执行。
第二部分:信号声明和赋值在Verilog中,信号的声明和赋值是代码的核心部分。
以下是一些与信号声明和赋值相关的编码规则:1. 信号声明:对于每个信号,应当在使用前为其声明数据类型和宽度。
这有助于避免潜在的数据冲突和类型错误。
2. 信号赋值:在对信号进行赋值操作时,只能使用一个连续的赋值语句。
如果需要对一个信号进行多个赋值,则应使用多个连续的赋值语句。
3. 复位信号:始终为每个模块提供一个复位信号。
在复位时,应确保所有需要复位的信号都被清零或者赋予一个已知的值。
4. 整数宽度:在Verilog中,数值宽度是非常重要的。
在声明和使用整数类型的信号时,务必指定宽度,并确保正确的数值范围。
第三部分:操作符和表达式操作符和表达式是编写Verilog代码中的主要构建块。
以下是一些与操作符和表达式相关的编码规则:1. 操作符优先级:在编写使用多个操作符的表达式时,务必使用括号来明确运算的优先级和结合性,以避免歧义和错误的计算结果。
verilog编写风格
一、较为详细的注释;
如
二、分开注释外部I/O寄存器还是内部寄存器;
目的:在于为后面的同步时序提供基础,或者说其他类似的写法,比如二段式或三段式状态机的实现。
偏于维护,修改。
如
三、计数器或者说是分频器的实现。
最好将需要分配的状态值,用参数值来说明。
便于修改,阅读。
如:
四、状态机的标准符,标准字。
用独热码实现,(主要是为以后用FPGA实现大型工程养成练好习惯),当然,对于较小型的项目,能够用CPLD实现的,一般采用二进制编码或格雷码。
原因在于:FPGA属于触发器实现的,而CPLD主要是属于组合逻辑。
如:
五、状态机的写法:最佳采用二段式和三段式,包括同步时序的写法,主要是为了解决一段式所带来的可能出现毛刺的问题。
如:
六、标准位的设定,实现;主要用于状态机中得语句判断情况。
或者说是下一个状态来到的标准位。
如:
七、对于大型的工程一般采用原理图的形式实现其顶层的构架,其包括的各个模块,一般利用verilog语言实现,生成原理图文件。
这样的好处在于:便于多人的协作或者说是可以调用以前已经完成的模块。
节省开发时间,也便于修改。
原理图给人整体的效果更加直观。
经典Verilog代码标准
一、工程建立规范:1、工程的组成:(1)一个顶层文件夹(2)顶层文件夹下,至少包括以下四个子文件夹a)project文件夹:存放ISE工程文件,包括ise、bit、mac等文件b)source文件夹:存放verilog源文件c)explain文件件:存放注释说明文档d)test文件夹:存放测试程序代码,可进一步分为软件调试程序、硬件调试程序2、工程的命令:(3)定层文件夹命令为top_xxx,xxx为工程的识别名称(4)顶层文件夹的子文件夹分别命名为:project、source、explain、test二、RTL CODE 规范1.标准的文件头在每一个版块的开头一定要使用统一的文件头,其中包括作者名,模块名,创建日期,概要,更改记录,版权等必要信息。
统一使用以下的文件头:// **************************************************************// COPYRIGHT(c)2005, Hislicon Technologies Co, Ltd// All rights reserved.//// IP LIB INDEX : IP lib index just sa UTOPIA_B// IP Name : the top module_name of this ip, usually, is same// as the small ip classified name just as UTOPIA// File name : file_name of the file just as “tx_fifo.v”// Module name : module_name of this file just as “TX_FIFO”// Full name : complete Emglish nme of this abbreviated//// Author : Athor/ID// Email : Author‟s email// Data :// Version : V 1.0////Abstract :// Called by : Father Module//// Modification history// ------------------------------------------------------------------------------------------------------// //// $Log$//// *********************************************************************2. 标准的module 格式(module 整体结构)对于模块的书写采用统一的格式便于项目内部成员的理解和维护,我们用批处理建立了一个MODULE模块,其内容解释如下:●端口定义按照输入,输出,双向的顺序:●模块名、模块例化名统一,例化名前加大写U_以区分(多次例化另加标识),三者关系:文件名:xxx .v (小写)模块名:Xxx (首字母大写)例化名:U1_xxx (首字母大写)IP 内部所有的模块名都要加IP名或者IP名简称作前缀,如USB_CTRL、USB_TX_FIFO。
verilog知识点总结
verilog知识点总结Verilog知识点总结Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统。
在数字电路设计中,Verilog是一种重要的工具,它可以描述组合逻辑和时序逻辑,以及设计和验证硬件。
本文将总结Verilog的一些重要知识点,包括模块化设计、数据类型、运算符、时序建模和测试基础等。
一、模块化设计在Verilog中,模块是设计的基本单元。
模块化设计可以使复杂的电路设计更加可管理和可重用。
在Verilog中,模块由模块声明和模块体组成。
模块声明定义了模块的接口,包括输入、输出和内部信号。
模块体定义了模块的功能,包括组合逻辑和时序逻辑。
二、数据类型Verilog支持多种数据类型,包括位、字、整数和实数。
位是最基本的数据类型,用于表示二进制数。
字是一组连续的位,用于表示整数或实数。
整数是有符号或无符号的整数,用于表示整数值。
实数是浮点数,用于表示小数值。
三、运算符Verilog支持多种运算符,包括算术运算符、逻辑运算符、位运算符和关系运算符。
算术运算符包括加法、减法、乘法和除法。
逻辑运算符包括与、或、非和异或。
位运算符包括位与、位或、位非和位异或。
关系运算符包括等于、不等于、大于、小于、大于等于和小于等于。
四、时序建模时序建模是描述时序电路行为的重要方面。
在Verilog中,可以使用时钟信号和时钟边沿来定义时序行为。
时钟信号用于同步电路的操作,时钟边沿用于触发电路的操作。
常用的时序建模语句包括时钟边沿敏感的always语句和延迟语句。
五、测试基础测试是硬件设计过程中的重要环节。
Verilog提供了多种测试方法,包括模拟仿真、自动测试生成和形式验证。
模拟仿真是通过模拟输入信号并观察输出信号来验证电路的功能。
自动测试生成是通过生成测试向量来覆盖电路的所有可能输入组合。
形式验证是通过数学证明来验证电路的正确性。
六、常用编码风格在Verilog中,编码风格是编写可读性高且易于理解的代码的重要因素。
Verilog编码要求规范
Verilog编码规(仅供部使用)拟制: xxx 日期:xxx审核: 审核者日期:yyyy-mm-dd 批准: 批准者日期:yyyy-mm-dd所有侵权必究修订记录目录1命名规 (8)2代码编写规 (11)2.1 版面 (11)2.2 编写代码规 (12)3电路设计规则 (26)3.1 时钟 (26)3.2 复位 (27)3.3 避免LATCH (28)3.4 避免组合反馈 (29)3.5 赋值语句 (29)3.6 case语句和if-then-else语句 (29)3.7 状态机 (30)3.8 异步逻辑 (33)4模块划分 (33)5提高可移植性的编码风格 (34)5.1 采用参数化设计 (34)5.2 采用独立于工具平台和工艺库的设计 (35)5.3 尽量使用已经得到验证的IP (36)6其他一些设计建议 (36)7附件 (39)8参考文档: (46)基本原则:简单,一致,可重用。
●简单指尽量使用简单的语句,尽量使用简单的设计,尽量使用简单的时钟,尽量使用简单的复位。
●一致指尽量保持代码风格一致,尽量保持命名一致。
●可重用指有成熟的IP尽量使用IP,设计的代码要尽量可重用。
1命名规给信号命名就像给孩子取名字一样,有区别,有根源,有深度,还有一点,要简单,别冗长。
有区别指取名字不要一样,假如大家只有一个手机,那这个还能有什么用处?有根源指取名字要能象姓氏一样,让人一看就直到是家的后代而不是家的。
有深度就是取名字要有涵义,一,二,三虽然也是名字,但是请考虑一下被取名字人的感受。
简单点,几十个字母长的名字,打字的和看字的都累。
♦大小写规则:只有parameter,`define和module名称才能享受大写。
♦Module 名应与文件名保持一致(文件名是小写),假如不想在设计后面遇到麻烦的话。
♦不要尝试使用任何保留字,因为他们已经被保留了。
♦不要重复使用同样的名字去命名不同的数据。
♦(建议)对module名加”_LVx”的后缀,增强module名称的结构层次含义如:设计顶层为TOP LEVEL,即LEVEL1,命名为QTRxxxx_LV1;时钟模块,IO_PAD,CORE,为LEVEL2,命名为CLK_PROC_LV2等等;CORE子模块为LEVEL3,然后以此类推。
Verilog编码要求规范
Verilog编码规范(仅供内部使用)拟制: xxx 日期:xxx审核: 审核者日期:yyyy-mm-dd 批准: 批准者日期:yyyy-mm-dd版权所有侵权必究修订记录目录1命名规范 (8)2代码编写规范 (11)2.1 版面 (11)2.2 编写代码规范 (12)3电路设计规则 (26)3.1 时钟 (26)3.2 复位 (27)3.3 避免LATCH (28)3.4 避免组合反馈 (29)3.5 赋值语句 (29)3.6 case语句和if-then-else语句 (29)3.7 状态机 (30)3.8 异步逻辑 (33)4模块划分 (33)5提高可移植性的编码风格 (34)5.1 采用参数化设计 (34)5.2 采用独立于工具平台和工艺库的设计 (35)5.3 尽量使用已经得到验证的IP (36)6其他一些设计建议 (36)7附件 (39)8参考文档: (46)基本原则:简单,一致,可重用。
●简单指尽量使用简单的语句,尽量使用简单的设计,尽量使用简单的时钟,尽量使用简单的复位。
●一致指尽量保持代码风格一致,尽量保持命名一致。
●可重用指有成熟的IP尽量使用IP,设计的代码要尽量可重用。
1命名规范给信号命名就像给孩子取名字一样,有区别,有根源,有深度,还有一点,要简单,别冗长。
有区别指取名字不要一样,假如大家只有一个手机号码,那这个号码还能有什么用处?有根源指取名字要能象姓氏一样,让人一看就直到是张家的后代而不是李家的。
有深度就是取名字要有涵义,张一,张二,张三虽然也是名字,但是请考虑一下被取名字人的感受。
简单点,几十个字母长的名字,打字的和看字的都累。
♦大小写规则:只有parameter,`define和module名称才能享受大写。
♦Module 名应与文件名保持一致(文件名是小写),假如不想在设计后面遇到麻烦的话。
♦不要尝试使用任何保留字,因为他们已经被保留了。
♦不要重复使用同样的名字去命名不同的数据。
Verilog编码规范
Verilog编码规范(仅供内部使用)拟制: xxx 日期:xxx审核: 审核者日期:yyyy-mm-dd 批准: 批准者日期:yyyy-mm-dd版权所有侵权必究修订记录目录1命名规范 (6)2代码编写规范 (8)2.1 版面 (8)2.2 编写代码规范 (8)3电路设计规则 (16)3.1 时钟 (16)3.2 复位 (17)3.3 避免LATCH (18)3.4 避免组合反馈 (18)3.5 赋值语句 (18)3.6 case语句和if-then-else语句 (18)3.7 状态机 (19)3.8 异步逻辑 (20)4模块划分 (21)5提高可移植性的编码风格 (21)5.1 采用参数化设计 (21)5.2 采用独立于工具平台和工艺库的设计 (22)5.3 尽量使用已经得到验证的IP (22)6其他一些设计建议 (22)7附件 (24)8参考文档: (28)基本原则:简单,一致,可重用。
●简单指尽量使用简单的语句,尽量使用简单的设计,尽量使用简单的时钟,尽量使用简单的复位。
●一致指尽量保持代码风格一致,尽量保持命名一致。
●可重用指有成熟的IP尽量使用IP,设计的代码要尽量可重用。
1命名规范给信号命名就像给孩子取名字一样,有区别,有根源,有深度,还有一点,要简单,别冗长。
有区别指取名字不要一样,假如大家只有一个手机号码,那这个号码还能有什么用处?有根源指取名字要能象姓氏一样,让人一看就直到是张家的后代而不是李家的。
有深度就是取名字要有涵义,张一,张二,张三虽然也是名字,但是请考虑一下被取名字人的感受。
简单点,几十个字母长的名字,打字的和看字的都累。
♦大小写规则:只有parameter,`define和module名称才能享受大写。
♦Module 名应与文件名保持一致(文件名是小写),假如不想在设计后面遇到麻烦的话。
♦不要尝试使用任何保留字,因为他们已经被保留了。
♦不要重复使用同样的名字去命名不同的数据。
Verilog编码规范
Verilog编码规范(仅供内部使用)拟制: xxx 日期:xxx审核: 审核者日期:yyyy-mm-dd 批准: 批准者日期:yyyy-mm-dd版权所有侵权必究修订记录目录1命名规范 (6)2代码编写规范 (8)2.1 版面 (8)2.2 编写代码规范 (8)3电路设计规则 (16)3.1 时钟 (16)3.2 复位 (17)3.3 避免LATCH (18)3.4 避免组合反馈 (18)3.5 赋值语句 (18)3.6 case语句和if-then-else语句 (18)3.7 状态机 (19)3.8 异步逻辑 (20)4模块划分 (21)5提高可移植性的编码风格 (21)5.1 采用参数化设计 (21)5.2 采用独立于工具平台和工艺库的设计 (22)5.3 尽量使用已经得到验证的IP (22)6其他一些设计建议 (22)7附件 (24)8参考文档: (28)基本原则:简单,一致,可重用。
●简单指尽量使用简单的语句,尽量使用简单的设计,尽量使用简单的时钟,尽量使用简单的复位。
●一致指尽量保持代码风格一致,尽量保持命名一致。
●可重用指有成熟的IP尽量使用IP,设计的代码要尽量可重用。
1命名规范给信号命名就像给孩子取名字一样,有区别,有根源,有深度,还有一点,要简单,别冗长。
有区别指取名字不要一样,假如大家只有一个手机号码,那这个号码还能有什么用处?有根源指取名字要能象姓氏一样,让人一看就直到是张家的后代而不是李家的。
有深度就是取名字要有涵义,张一,张二,张三虽然也是名字,但是请考虑一下被取名字人的感受。
简单点,几十个字母长的名字,打字的和看字的都累。
♦大小写规则:只有parameter,`define和module名称才能享受大写。
♦Module 名应与文件名保持一致(文件名是小写),假如不想在设计后面遇到麻烦的话。
♦不要尝试使用任何保留字,因为他们已经被保留了。
♦不要重复使用同样的名字去命名不同的数据。
Verilog编码规范
版本1.0修改内容初始文档修改人赵文哲时间2022-08维护人:赵文哲E-mail :verilog 语言编码规范本编码规范由西安交通大学人机所电视组全体学生和创芯公司全体员工共同编写和维护。
以此来维护DTV 系列芯片的verilog 源码的可读性,茁壮性和易维护性。
该文档主要致力于verilog 语言的编码标准化,同时也合用于其他相似的硬件描述语言,如VHDL 等。
使代码易于管理的方法之一是增强代码的一致性,让别人读懂自己的代码是非常重要的事情。
因此,保持自己的代码符合统一的规范是一个编码者的基本素质。
如果自己的编码风格与本文档的规定实在不同,无法忍受,请与维护者联系,在组内会议上统一讨论解决方案。
此外,如其他人对该编码规范有任何建议和批评,欢迎联系该规范的维护者。
维护者的联系方式详见首页的维护列表。
关于本文档读者,文档主要规范了verilog 语言的写法和格式,并不介绍verilog 语言的语法。
请读者自己学习verilog 语言的基础知识。
普通而言,项目的文件需要统一的存放在一个统一的文件夹下。
根据各自功能不同,分门别类的存放。
以项目proj-xx 为例,其文件存储方式如表1 所示。
proj-xx|--doc|--datasheet|--specification|--inc|--ip|--sim_utility|--altera_utility|--xilinx_utility|--dc_utility|--rtl|--sim|--proj_sim|--subproj_sim|--softcode|--adc|--dac|--ddr|--probe|--dc|--pt|--fp|--pr|--synplifyverilog 语言编码规范doc:存放项目相关的文档,包括该项目用到的datasheet,芯片规格书(specification) 等等。
inc:存放项目所用到的头文件。
主要是整个项目所用到的整体的定义。
Verilog语言编程规范
Verilog语⾔编程规范前⾔.................................................................... IV 1范围 (1)2术语 (1)3代码标准 (1)3.1命名规范 (1)3.1.1⽂件命名 (1)3.1.2HDL代码命名总则 (2)3.2注释 (4)3.2.1⽂件头 (4)3.2.2其它注释 (5)3.3编程风格 (7)3.3.1编写代码格式要整齐 (7)3.3.2使⽤⼆到四个空格符缩排 (7)3.3.3⼀⾏⼀条Verilog语句 (7)3.3.4⼀⾏⼀个端⼝声明 (7)3.3.5在定义端⼝时,按照端⼝类型或端⼝功能定义端⼝顺序。
(8) 3.3.6保持端⼝顺序⼀致。
(8)3.3.7声明内部net (8)3.3.8在⼀个段内声明所有内部net (8)3.3.9每⾏长度不超过80字符....................... 错误!未定义书签。
3.3.10代码流中不同结构之间⽤⼀空⾏隔开 (8)3.4模块划分和重⽤ (10)3.4.1不能访问模块外部的net和variable (10)3.4.2不使⽤`include编译指令 (10)3.4.3建议模块的端⼝信号尽可能少。
(10)3.4.4时钟产⽣电路单独构成⼀个模块 (10)3.4.5划分时钟域 (10)3.4.6物理和逻辑边界的匹配 (10)3.4.7特定应⽤代码要单独划分出来 (10)3.4.8关键时序逻辑划分 (10)3.4.9数据流逻辑划分 (11)3.4.10异步逻辑划分 (11)3.4.11状态机划分 (11)3.4.12控制逻辑和存储器划分 (11)3.5逻辑设计经验 (11)3.5.1时钟域要尽可能少,所⽤时钟尽可能加全局BUFF (11) 3.5.2异步接⼝信号同步化 (11)3.5.3避免寄存器的数据与时钟异步 (11)3.5.4使⽤⽆⽑刺的门控时钟使能信号 (11)3.5.5直接作⽤信号⽆⽑刺 (11)3.5.6初始化控制存储元件 (12)3.5.7使⽤同步设计 (12)3.5.8避免组合反馈环 (12)3.6常⽤编程技巧 (12)3.6.1条件表达式的值必须是⼀个单bit值 (12)3.6.2总线位顺序按⾼到低保持⼀致 (12)3.6.3不要给信号赋x值 (12)3.6.4寄存器变量只能在⼀个always语句中赋值 (12)3.6.5对常量使⽤参数⽽不使⽤⽂本宏 (12)3.6.6不能重复定义参数 (12)3.6.7不能重复定义⽂本宏 (12)3.6.8保持常量之间的联系 (12)3.6.9状态编码的参数使⽤ (13)3.6.10`define、`undef配合使⽤ (13)3.6.11⽤基地址+地址偏移量⽣成地址 (13)3.6.12使⽤⽂本宏表⽰寄存器字段位置和值 (13)3.6.13`ifdef的嵌套限制在三层以内 (13)3.6.14操作数的位宽必须匹配 (13)3.6.15模块调⽤时端⼝要显式引⽤ (14)3.6.16⽮量端⼝和net/variable声明的位宽要匹配 (14)3.6.17避免inout类型的端⼝ (14)3.6.18在复杂的表达式中使⽤括号 (14)3.7常⽤综合标准 (14)3.7.1always 的敏感列表要完整 (14)3.7.2⼀个 always 的敏感列表中只能有⼀个时钟 (14)3.7.3只使⽤可综合的结构 (15)3.7.4组合逻辑的条件需完备 (15)3.7.5循环结构中禁⽤disable语句 (15)3.7.6避免⽆界循环 (15)3.7.7端⼝连接禁⽤表达式 (15)3.7.8禁⽤Verilog primitive (15)3.7.9边沿敏感结构中使⽤⾮阻塞赋值(<=) (15)3.7.10Latch使⽤⾮阻塞赋值 (15)3.7.11模块闲置的输⼊端不要悬空 (15)3.7.12连接模块闲置的输出端 (16)3.7.13函数中不要使⽤锁存器 (16)3.7.14禁⽤casex (16)3.7.15多周期路径的信号使⽤单周期使能信号 (16)3.7.16三态元件建模 (16)3.7.17避免顶层胶合逻辑 (16)3.7.18在case语句中使⽤default赋值语句 (16)3.7.19full_case综合命令的使⽤ (16)附录1 HDL编译器不⽀持的Verilog结构 (18)附录2 Verilog和VHDL关键词列表 (19)前⾔编写本标准的⽬的是为了统⼀部门内部FPGA\EPLD设计⽤verilog语⾔编程风格,提⾼Verilog设计源代码的可读性、可靠性和可重⽤性,减少维护成本,最终提⾼产品⽣产⼒;并且以此作为代码⾛查的标准。
Verilog代码风格总结-供参考
Verilog代码风格总结-供参考[转转转转]Verilog 代码风格代码风格代码风格代码风格-供参考供参考供参考供参考Description 本文主要是收集一些重要的Verilog coding style。
一个好的coding style可以减少错误的发生,增加电路的效能,以及较好的可读性。
T ext The order of module signals 一个module signal顺序如下 (由左至右): Input clock signals(clk_*) set/reset signals(set_*, rst_*) enable/disble signals(en_*, dis_*) read/write enable signals(we_*, re_*, rw_*) control signals(i_*) address signals(i_*) data signals(i_*) Output clock signals(o_clk_*) set/reset signals(o_set_*, o_rst_*) enable/disable signals(o_en_*, o_dis_*) control signals(o_*) address signals(o_*) data signals(o_*) In/Out control signals(io_*) address signals(io_*) data signals(io_*) Naming Rule 以下的namign rule为个人使用的规则。
命名方式分类底线分隔型:xxx_yyy_zzz 大写底线分隔型:XXX_YYY_ZZZ 首字大写型:AbcDefGhi 首字小写型:avcDefGhi 各种元素所使用的命名文件名称:底线分隔型, Ex: xxx_yyy_zzz.v module名称:底线分隔型, Ex: xxx_yyy_zzz module instance名称:底线分隔型, Ex: xxx_yyy_zzz local wire名称:底线分隔型:Ex: xxx_yyy_zzz local reg名称:底线分隔型, Ex: xxx_yyy_zzz input signal名称:前置i_的底线分隔型, Ex: i_xxx_yyy_zzz output signal名称:前置o_的底线分隔型, Ex: o_xxx_yyy_zzz input/output signal名称:前置io_的底线分隔型, Ex: io_xxx_yyy_zzz 常数名称:大写底线分隔型, `XXX_YYY_ZZZ parameter参数名称:大写底线分隔型, Ex: XXX_YYY_ZZZ block名称:大写底线分隔型, Ex: XXX_YYY_ZZZ 特殊讯号名称特殊讯号名称特殊讯号名称特殊讯号名称单一的clock signal: clk 多个clock signal: clk_xxx 负缘触发的clock signal: clk_n, clk_xxx_n 单一的reset signal: rst 多个reset signal: rst_xxx 负缘触发的reset signal: rst_n , rst_xxx_n 单一的set signal: set 多个set signals: set_xxx 负缘触发的set signals: set_n, set_xxx_n 致能讯号: en_xxx 除能讯号: dis_xxxProcedural Assignments 使用指引在撰写sequential logic时,使用nonblocking assignment。
高通的绝密Verilog编码规范(中文版)verilogco
Verilog编码规范2.编写可综合的RTL级Verilog 模块代码时必须遵守的要点:2.1 不允许在代码中出现的语句要点:⚫不允许在可综合的设计代码中使用`Define 来定义参数, 应该使用参数Parameter来定义。
`Define只用于编写不可综合的仿真测试模块。
⚫不允许使用UDP ( 用户定义的原语元件)⚫不允许在可综合代码中出现逻辑反馈环路,否则会生成不可预知的逻辑电路。
⚫只允许用Verilog2001 中的always (*) 来生成组合逻辑,其他Verilog 2001语法在可综合模块中目前都不建议采用。
2.2 建议尽量采用的要点⚫用高电平有效的硬件异步复位reset。
⚫用高电平有效的同步软件复位reset。
⚫尽可能使用高电平有效信号,不使用低电平有效信号(除某些总线、器件有特殊要求外)。
只有复位信号reset 在特定情况下可以设置为低电平有效信号。
⚫尽可能使用assign语句设计组合逻辑。
⚫模块之间数据交换总线应该尽量用多路器实现。
尽量不使用三态总线。
三态总线只用于对外接口或者顶层内部总线。
⚫模块中的每个输出信号原则上必须通过寄存器输出。
任何不通过寄存器输出的信号必须加以注释,注意防止出现反馈回路。
⚫尽量合并源代码,使其简洁明了,不要试图依靠综合器的功能。
⚫case语句和if else语句必须保证其完整性,即所有分支项应该完全列出,case语句应该加缺省项(default),if语句应该有对应的else项。
⚫使用参数(parameter)作为可变化的常数,例如总线的位宽。
⚫端口声明的顺序--在保证先输入再输出的基础上按如下顺序clocks,resets,control signals,address bus,data bus⚫端口和连接端口的信号尽量同名。
⚫注释应尽量靠近被注释的语句。
大段的注释必须用由注释符号组成的边框/////////////// 围绕。
⚫代码中的所有常数都应该使用参数(parameter),将这些参数的定义放在一个独立的文件中,然后在设计模块中用`include 宏命令将其包含。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog编码风格
嵌入式开发2010-05-03 15:28:13 阅读14 评论0 字号:大中小订阅
这是以前公司的对fpga代码编写的要求
良好代码编写风格的通则概括如下:
(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)每一行语句独立成行。
尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。
同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;
(13)建议采用缩进提高续行和嵌套语句得可读性。
缩进一般采用两个空格,如西安交通大学SOC 设计中心 2 如果空格太多则在深层嵌套时限制行长。
同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力;
(14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字;
(15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:
输入信号的clk、rst、enables other control signals、data and address signals。
然后再申明输出信号的clk、rst、enalbes other control signals、data signals;
(16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误;(即实例化时,端口用名字相关)
(17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。
注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;
(18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数;
(19)对一些重要的always 语句块定义一个有意义的标号,这样有助于调试。
注意标号名不要与信号名、变量名重复;
(20)代码编写时的数据类型只使用IEEE 定义的标准类型,在VHDL 语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE 的标准;
(21)在设计中不要直接使用数字,作为例外,可以使用0 和1。
建议采用参数定义代替直接的数字。
同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;
(22)不要在源代码中使用嵌入式的dc_shell 综合命令。
这是因为其他的综合工具并不认得这些隐含命令,从而导致错误的或较差的综合结果。
即使使用Design Compiler,当综合策略改变时,嵌入式的综合命令也不如放到批处理综合文件中易于维护。
这个规则有一个例外的综合命令,即编译开关的打开和关闭可以嵌入到代码中;
(23)在设计中避免实例化具体的门级电路。
门级电路可读性差,且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。
如果必须实例化门电路,我们建议采用独立于工艺库的门电路,如SYNOPSYS 公司提供的GTECH 库包含了高质量的常用的门级电路;
(24)避免冗长的逻辑和子表达式;
(25)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。