Verilog语言良好的代码编写格式
Verilog编码规范
![Verilog编码规范](https://img.taocdn.com/s3/m/eeee6bc851e2524de518964bcf84b9d529ea2c52.png)
Verilog编码规范Verilog语⾔编码规范维护⼈:赵⽂哲E-mail:venturezhao@/doc/cb240dc489eb172ded63b717.html1.关于verilog语⾔编码规范本编码规范由西安交通⼤学⼈机所电视组全体学⽣和创芯公司全体员⼯共同编写和维护。
以此来维护DTV系列芯⽚的verilog源码的可读性,健壮性和易维护性。
该⽂档主要致⼒于verilog语⾔的编码标准化,同时也适⽤于其他相似的硬件描述语⾔,如VHDL等。
使代码易于管理的⽅法之⼀是增强代码的⼀致性,让别⼈读懂⾃⼰的代码是⾮常重要的事情。
因此,保持⾃⼰的代码符合统⼀的规范是⼀个编码者的基本素质。
如果⾃⼰的编码风格与本⽂档的规定实在不同,⽆法忍受,请与维护者联系,在组内会议上统⼀讨论解决⽅案。
此外,如其他⼈对该编码规范有任何建议和批评,欢迎联系该规范的维护者。
维护者的联系⽅式详见⾸页的维护列表。
关于本⽂档读者,⽂档主要规范了verilog语⾔的写法和格式,并不介绍verilog语⾔的语法。
请读者⾃⼰学习verilog语⾔的基础知识。
2.项⽬⽂件组织形式⼀般⽽⾔,项⽬的⽂件需要统⼀的存放在⼀个统⼀的⽂件夹下。
根据各⾃功能不同,分门别类的存放。
以项⽬proj-xx为例,其⽂件存储⽅式如表1所⽰。
表1 项⽬⽂件组织proj-xx|--doc|--datasheet|--specification|--inc|--ip|--sim_utility|--altera_utility|--xilinx_utility|--dc_utility|--rtl|--sim|--proj_sim|--subproj_sim|--adc|--dac|--ddr|--probe|--dc|--pt|--fp|--pr|--synplifydoc:存放项⽬相关的⽂档,包括该项⽬⽤到的datasheet,芯⽚规格书(specification)等等。
verilog语言例化书写格式
![verilog语言例化书写格式](https://img.taocdn.com/s3/m/40e84e4503020740be1e650e52ea551811a6c95f.png)
verilog语言例化书写格式Verilog语言是一种硬件描述语言(HDL),在数字电路设计、逻辑仿真和综合等领域得到广泛应用。
在Verilog中,实例化是将模块实例化为实体的过程,通过实例化可以在设计中重复使用模块并连接各个模块之间的信号。
Verilog语言的例化书写格式如下:1. 定义模块首先,在设计中需要定义要实例化的模块。
模块定义包括模块名称、输入输出端口和内部信号。
例如,我们定义了一个名为"example_module"的模块,包含三个输入端口(A、B、C)和一个输出端口(D):```verilogmodule example_module(A, B, C, D);input A, B, C;output D;// internal logicendmodule```2. 实例化模块在设计中需要使用该模块时,可以进行实例化。
实例化的格式为:模块名称实例名称 ( .端口名称(信号名称), ... );例如,我们使用上述定义的"example_module"模块进行实例化,假设实例名称为"example_inst",连接的信号为A、B、C、D,实例化代码如下:```verilogexample_module example_inst(.A(signal_A),.B(signal_B),.C(signal_C),.D(signal_D));```在上述实例化代码中,通过"."符号将信号与端口进行连接。
例如,信号signal_A将与输入端口A连接起来。
3. 内部信号的连接在实例化模块时,还可以直接将内部信号连接到其他信号上。
例如,我们在实例化时,将一个内部信号internal_signal直接连接到另一个信号output_signal上:```verilogexample_module example_inst(.A(signal_A),.B(signal_B),.C(signal_C),.D(output_signal));assign internal_signal = output_signal;```通过上述的例化书写格式,我们可以在Verilog设计中有效地实例化模块,并连接各个模块之间的信号。
verilog格式说明
![verilog格式说明](https://img.taocdn.com/s3/m/4b67174a53ea551810a6f524ccbff121dd36c5ef.png)
verilog格式说明Verilog是一种硬件描述语言(HDL),用于描述和设计数字电路。
它是一种重要的工具,广泛用于电子系统级设计(ESL)和硬件验证。
以下是Verilog的格式说明:1. 模块声明:一个Verilog文件通常包含一个或多个模块。
模块定义以关键字module开头,后跟模块名称和端口列表。
例如:module my_module (input clk, input [7:0] data, output reg result);2. 端口声明:端口列表中定义了模块的输入和输出端口。
每个端口都有一个方向和一个数据类型。
关键字input表示输入端口,output表示输出端口。
例如:input clk; // 单个输入端口input [7:0] data; // 8位宽输入端口output reg result; // 单个输出端口(带有寄存器)3. 寄存器和连线声明:在模块中,可以使用寄存器和连线来保存和传输数据。
使用关键字reg声明寄存器变量,使用关键字wire声明连线。
例如:reg [3:0] count; // 4位寄存器变量wire [7:0] sum; // 8位宽连线4. 组合逻辑:Verilog可以描述组合逻辑电路,如AND、OR、NOT等门的逻辑运算。
例如:assign result = (data1 & data2) | data3; // 使用assign语句描述组合逻辑5. 时序逻辑:时序逻辑描述了基于时钟信号的电路行为。
使用关键字always和关键字posedge或negedge表示时钟上升沿或下降沿敏感的逻辑块。
例如:always @(posedge clk) // 在时钟上升沿触发的逻辑beginif (reset) // 重置信号count <= 0;elsecount <= count + 1; // 计数器递增end这些是Verilog中一些常见的格式说明。
2024版Verilog编程规范(华为)
![2024版Verilog编程规范(华为)](https://img.taocdn.com/s3/m/2d8a1a63cec789eb172ded630b1c59eef8c79a85.png)
实现自动化测试流程,提高测试 效率和准确性。
06
代码审查与质量保证
代码审查流程介绍
提交代码
开发人员将代码提交到代码审查 系统中。
分配审查任务
系统或审查组长将审查任务分配 给审查人员。
代码审查
审查人员对代码进行逐行审查, 检查是否符合编程规范和质量要
求。
审查通过
经过多轮反馈和整改后,代码符 合要求,审查通过。
通过定期的培训、分享和宣传活动,提高开 发人员对Verilog编程规范的认识和重视程度。
引入自动化检查工具
建立持续改进机制
研究和引入自动化检查工具,对Verilog代码 进行静态分析和规范检查,进一步提高代码 质量和开发效率。
建立规范的持续改进机制,收集开发人员的 反馈和建议,及时调整和优化规范内容。
可重用性原则
模块应具有高内聚、低耦 合的特点,便于在不同项 目中重用。
可维护性原则
模块应易于理解、测试和 修改,以降低维护成本。
顶层结构设计方法
自顶向下设计
从系统整体需求出发,逐 步细化到各个模块的设计 和实现。
模块化设计
将系统划分为多个独立的 模块,每个模块承担一定 的功能,便于并行开发和 维护。
减少错误和提高代码质量
02
规范的编程习惯有助于减少编码过程中的错误,提高代码的稳
定性和可靠性。
促进知识共享和传承
03
统一的编程规范有利于知识的积累和传承,降低新人学习成本,
提高团队整体技术水平。
适用范围及对象
适用范围
本规范适用于使用Verilog语言进 行硬件描述和设计的所有场景,包 括但不限于数字电路设计、验证、 仿真等。
端口名应避免与模块内部变量名冲突。
verilog书写规范
![verilog书写规范](https://img.taocdn.com/s3/m/bc2160dedb38376baf1ffc4ffe4733687e21fc05.png)
verilog书写规范海思⾼校合作——QA培训资料⼀、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 (⼤写)例化名:U_XXX (⼤写)IP 内部所有的模块名都要加IP名或者IP名简称作前缀,如USB_CTRL、USB_TX_FIFO。
Verilog语言良好的代码编写格式
![Verilog语言良好的代码编写格式](https://img.taocdn.com/s3/m/9063f8c7f9c75fbfc77da26925c52cc58bd690f8.png)
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)每一行语句独立成行。
Verilog HDL编程规范
![Verilog HDL编程规范](https://img.taocdn.com/s3/m/fa677fc605087632311212dd.png)
注意: 顶层文件名为:“模块名_top(_文件类型)”; 仿真测试的文件名字与被测试的模块名字一致,并且后面加上后缀 “_tb”,即 “模 块名(_top)_tb(_文件类型)”;
3、 每个设计的源文件,其开头部分应包含如下注释内容: 1) 年份及公司名称; 2) 3) 4) 5) 作者; 文件名; 所属项目; 顶层模块;
每行只有一个端口定义或说明,并加注释,注释放在同一行; 例如: module Prescaler ( core_32m_clk, system_clock, div16_clk, div16_clk_b,
reset_b, scan_mode_test ); input core_32m_clk; input system_clk; output div16_; output div16_clk_b; // 32 MHz clock // system clock // input clock divided by 16 // input clock divided by 16 and inverted
6) 模块名称及其描述; 7) 修改纪录; 例如: 文件头部分: (英文) ///////////////////////////////////////////////////////////////// // Copyright (c) 2004 Freescale Semiconductor, Inc. All rights reserved // Freescale Confidential Proprietary // ----------------------------------------------------------------// FILE NAME : // DEPARTMENT : // AUTHOR : // AUTHOR’S EMAIL : //
VerilogHDL代码书写规范
![VerilogHDL代码书写规范](https://img.taocdn.com/s3/m/82200b35f111f18583d05a9e.png)
Revision History ﹕99-08-01
Revision 1.0 Email ﹕ M@ Company ﹕ swip Technology .Inc
Copyright(c) 1999, swip Technology Inc, All right reserved
\*
y 用连贯的缩写
1
长的名字对书写和记忆会带来不便 甚至带来错误 采用缩写时应注意同一信号在模 块中的一致性 缩写的例子如下
Addr address Pntr pointer Clk clock Rst reset
y 用最右边的字符下划线表示低电平有效 高电平有效的信号不得以下划线表示 短暂
的引擎信号建议采用高有效 如 Rst_ Trdy_, Irdy_ Idsel.
Sun Microsystems Revision 1.0
5 规范内容 5.1 Verilog 编码风格
本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级 RTL behavioral, gate_level) 也适用于出于仿真 综合或二者结合的目的而设计的模块
5.1.1 命名的习惯
FSM 有限状态机
伪路径 静态时序分析 STA 认为是时序失败 而设计者认为是正确的路径
4 引用标准和参考资料
下列标准包含的条文 通过在本标准中引用而构成本标准的条文 在标准出版时 所示版本
均为有效 所有标准都会被修订 使用本标准的各方应探讨 使用下列标准最新版本的可能性
Verilog Style and Coding Guidelines Actel HDL Coding Style Guider
Input [199:0] Vector1, Vector2;
Verilog编码要求规范
![Verilog编码要求规范](https://img.taocdn.com/s3/m/13024399581b6bd97e19ea7c.png)
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编码要求规范](https://img.taocdn.com/s3/m/d1bcc772f90f76c661371aef.png)
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编码规范标准](https://img.taocdn.com/s3/m/fef573240508763230121229.png)
Verilog编码规〔仅供部使用〕拟制: xxx 日期:xxx审核: 审核者日期:yyyy-mm-dd 批准: 批准者日期:yyyy-mm-dd所有侵权必究修订记录目录1命名规32代码编写规52.1版面52.2编写代码规53电路设计规那么133.1时钟133.2复位143.3防止LATCH153.4防止组合反应153.5赋值语句153.6case语句和if-then-else语句153.7状态机163.8异步逻辑174模块划分185提高可移植性的编码风格185.1采用参数化设计185.2采用独立于工具平台和工艺库的设计195.3尽量使用已经得到验证的IP196其他一些设计建议207附件218参考文档:25根本原那么:简单,一致,可重用。
●简单指尽量使用简单的语句,尽量使用简单的设计,尽量使用简单的时钟,尽量使用简单的复位。
●一致指尽量保持代码风格一致,尽量保持命名一致。
●可重用指有成熟的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语言编程规范](https://img.taocdn.com/s3/m/56f4f15ef6ec4afe04a1b0717fd5360cba1a8d12.png)
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+HDL代码书写规范
![Verilog+HDL代码书写规范](https://img.taocdn.com/s3/m/75b07e2ae2bd960590c67766.png)
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 用最右边的字符下划线表示低电平有效,高电平有效的信号不得以下划线表示,短暂的引擎信号建议采用高有效。
Verilog 代码编写规范
![Verilog 代码编写规范](https://img.taocdn.com/s3/m/d0a8826748d7c1c708a145c8.png)
一、信号命名规则信号命名规则在团队开发中占据着重要地位,统一、有序的命名能大幅减少设计人员之间的冗余工作,还可便于团队成员代码的查错和验证。
比较著名的信号命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。
例如所有的字符变量均以ch 为前缀,若是常数变量则追加前缀c。
信号命名的整体要求为:命名字符具有一定的意义,直白易懂,且项目命名规则唯一。
对于HDL设计,设计人员还需要注意以下命名规则。
1.系统级信号的命名系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号。
系统信号以字符串sys或syn开头;时钟信号以clk开头,并在后面添加相应的频率值;复位信号一般以rst或reset开头;置位信号为st或set开头。
典型的信号命名方式如下所示:wire [7:0] sys_dout, sys_din;wire clk_32p768MHz;wire reset;wire st_counter;2.低电平有效的信号命名低电平有效的信号后一律加下划线和字母n。
如:wire SysRst_n;wire FifoFull_n;3.过锁存器锁存后的信号经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。
如:信号CpuRamRd信号,经锁存后应命名为CpuRamRd_r。
低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。
如:CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。
如:CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。
二、模块命名规则HDL语言的模块类似于C语言中的函数,可采用C语言函数的大多数规则。
模块的命名应该尽量用英文表达出其完成的功能。
遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度一般不少于2个字母。
verilog代码书写规范
![verilog代码书写规范](https://img.taocdn.com/s3/m/e6249107f78a6529647d53e9.png)
8、 主程序(Main program) always 块中要采用 TAB 缩进的格式,并且 begin-end 不要省略。 主程序中的 if-else
主程序中的 case
9、 模块的例化(Module instance) 模块的例化要采用端口名关联方式,每行只写一个端口,同时也需要对端口进行注释, 格式如下:
Verilog 代码书写规范
写在前面 代码书写规范在团队开发中占据着重要地位, 统一、 有序的命名能大幅减少设计人员之间的 冗余工作, 还可便于团队成员对代码的查错和验证。 但是不要使书写的规范阻碍代码的书写 效率,有些规范并不是硬性的规定,比较的灵活,最重要的是能达到代码书写效率与代码规 范性的平衡。 ——电子系 FPGA 小组 2010 年 11 月 25 日 于北京交通大学 1、 基本原则 顶层模块不含任何逻辑,只包括对底层模块实例化的语句。每一个 Verilog 文件只含有 一个模块,每个模块可含有多个过程块(always、initial 等) ,每一个 always 块只对 一个信号进行赋值。 2、 命名规则 模块名、 信号名应该尽量做到可以表达出其完整的功能, 使程序的阅读者可以见名知意, 名称一般不少于两个字符,而大小写在此不做规定。下面为一些利用标准命名方法定义 的模块名和信号名: module ALU; // Arithmatic Logical Unit module DMI ; //Data Memory Interface module DEC; //Decoder wire CPUMMU_WrReq;// CPU 发送给 MMU 的写请求信号 一些标准形式的缩写: clockclk clearclr resetrst writewr readrd Frequency->Freq Variable->Var setst 在一个工程中如果存在多个不同频率的时钟信号,可在 clk 后面添加相应的频率值以示 区分,例如:wire clk_768MHz;//定义一个 768MHz 的时钟信号 低电平有效的信号命名: 低电平有效的信号后一律加下划线和字母 n,假如未加则视为高有效。 wire rst_n;//低有效的复位信号 wire FifoFull_n;//低有效的 fifo 满标志 3、 注释 勤写注释是好习惯,但这并不意味着每句语句都要写,视情况而定。注释可以分为模块 文件的注释、程序各部分的注释、单条语句的注释。注释全部用英文。关键的语句、不
verilog的一些固定写法
![verilog的一些固定写法](https://img.taocdn.com/s3/m/36b893652bf90242a8956bec0975f46527d3a7ae.png)
verilog的一些固定写法Verilog是一种硬件描述语言,用于描述数字电路。
在Verilog 中有一些固定的写法和规范,以下是一些常见的固定写法:1. 模块声明:每个Verilog文件通常以模块声明开始,例如:module module_name (input input1, input input2, output output1);input和output关键字用于声明端口,module_name是模块的名称。
2. 端口声明:在模块声明中,端口通常按照输入和输出分别声明,例如:input input1, input input2;output output1;3. 数据类型声明:Verilog中常见的数据类型包括wire、reg、integer等,这些数据类型用于声明变量的类型和存储方式。
4. 时钟声明:在数字电路中,时钟是非常重要的,通常会使用时钟信号来同步各个部分。
时钟声明通常如下:input wire clk;5. 逻辑运算:在Verilog中,常见的逻辑运算包括与(&)、或(|)、非(!)、异或(^)等,这些逻辑运算符可以用于描述数字电路中的逻辑操作。
6. 连接符号:在Verilog中,连接符号用于连接不同的信号线,常见的连接符号包括逗号(,)和连接运算符({})。
7. 时序建模:Verilog中可以使用一些关键字来描述时序行为,比如always、posedge、negedge等,这些关键字用于描述触发器的行为。
以上是一些Verilog中的固定写法和常见规范,遵循这些规范可以使Verilog代码更加清晰易懂,也更容易被其他人理解和维护。
希望以上回答能够满足你的需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)每一行语句独立成行。
尽管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)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。
一. 文件命名规则1: 每个文件中只包含一个设计单元理由: 便于修正.规则2: 文件命名协定<设计单元名称>.<扩展名>理由: 便于理解设计单元constructs及文件内容.如: spooler.v // spooler模块的同步Verilog代码描述规则 3. 模拟和数字Verilog文件每个单一文件必须包含: (1)模拟(analog)Verilog(用.va文件后缀); 或(2)数字Verilog(用.v文件后缀); 或(3)清晰的模\数混合Verilog(用.va文件后缀).理由: 模拟的编译器也许不能操纵数字的架构; 反之亦然.二. HDL编码项目命名规则4: 允许的字符集命名中必须包含字母, 数字或下划线[A-Z, a-z, _] (见规则5)例外: 不允许使用连续的下划线.理由: 双下划线在硬件竞争中是不工作的.规则5: 命名的首字符命名必须以字母开头, 而不是数字或下划线(见规则4)理由: 以数字或下划线开头的命名, 可能会引起工具冲突.规则6: 所有命名必须是唯一的无关项理由: 在Verilog(语法敏感)和VHDL(语法不敏感)中的设计转换中, 很可能受语法不敏感的设计风格影响.规则7: 信号的一致性理由: 和VHDL相比, Verilog和许多支持VHDL的工具都一样是语法敏感. 及时辨别信号的类型(如: 低电平有效的信号或时钟)有助于调试.规则8: 常量, 参数和标签区块要大写理由: 提供了一种可以辨别那些在仿真中不需要经过数据转换的实体的机制.规则9: 信号, constructs和实例化标签要小写理由: 从在仿真中数据不变化的实体中区别信号和constructs, 以及在设计中保持一致的视觉和感觉.规则10: 有意义的信号和变量名称小写的名称必须包含信号和变量的意图.理由: 描述是什么, 而不是怎样去做, 有助于理解设计.如: data_bus, set_priority规则11: 有意义的常量名称常量名称一定要描述常量的意图. 根据意图可以很明显地看出常量的类型, 及不是端口的名称. 常量需大写.理由: 有意义的名称对于常量来说, 非常重要.如: 好的名称: SBUS_DATA_BITS, MEMORY_WIDTH, CLK_PERIOD如: 差的名称: ADDRESS_SIZE 并不明晰, 当它指的是数的位宽或地址空间的长度规则12: 有意义的construct名称construct的名称如functions, modules, tasks等,必须根据它们要做什么而不是怎么样去做来命名. construct名称必须小写.理由: 描述是什么, 而不是怎样去做, 有助于理解设计.规则13: 有意义的实例化标签实例化标签要根据construct指定的要实现什么, 而不是怎样去做来命名.理由: 描述是什么, 而不是怎样去做, 有助于理解设计.如: addr_decode, bit_stuff, sbus_if规则14: 用下划线分隔包含许多单词的名称理由: 增加可读性如: ram_addr规则15: 低电平有效信号命名使用_b理由: 有意义, 一致性的名称, 有助于理解设计.如: enable_data_b, reset_b规则16: 时钟信号命名使用_clk理由: 有意义, 一致性的名称, 有助于理解设计.如: fifo_transmit_clk例外: 明显包含时钟的信号名称(如: system_clock, clk32m).规则17: 未连接(Unconnected)的输出信号命名使用_uc理由: 当关于未连接信号的警告出现时, 如果该名称以_nc结尾, 这样该信号就会很明显地被知道是未连接, 而不是存在的错误.规则18: 信号捆绑(bundling)不相干的信号不能被捆绑成总线.理由: 易于理解module.方针19: 三态信号命名使用_z理由: 有意义, 一致性的名称, 有助于理解设计.如: ram_data1_z方针20: 状态机信号命名使用_next理由: 有意义, 一致性的名称, 有助于理解设计.如: transmit_next方针21: 测试模块信号命名使用_test理由: 有意义, 一致性的名称, 有助于理解设计.如: parallel_clk_test方针22: 扫描(scan)使能(enable)信号命名使用_se理由: 有意义, 一致性的名称, 有助于理解设计.方针23: 模拟信号命名使用_ana理由: 当区别模拟信号时, 有助于理解设计. 尤其是当使用图像查看器时, 更加有用.方针24: 信号名称的多后缀优先性从高到低:1. _b2. _z3. _clk4. _next最高优先级的后缀被推荐为信号名称的最靠后的后缀.如: ram_data1_z_b, receive_clk_b方针25: 参数化变量命名使用_PP理由: 有意义, 一致性的名称, 有助于理解设计.如: NUM_COLUMNS_PP方针26: 信号名称的长度应该小于28个字符短的名称可读性较强. 但28个字符不包括层次(hierarchy).理由: 长的名称可能会引起工具的冲突.方针27: 避免缩略语除了常用已知的缩略语理由: 使用有意义的名称.例外: 一般所知的缩略语, 如RAM,和loop counters. loop counters可能被命名为单个字母, 如I或N, 因为它们代表索引. 一些后端工具会连接所有层次的名称, 以及给予有限的名称总长度. 在那种情况下, 缩略语是多层次名称所必须的. 但这些缩略语必须以注释的方式来阐明.方针28: 文档和附加命名协议任何在module中使用的缩略语要记录在档案中是被推荐的. 任何在module中使用的协议都要添加到必要的协议中, 或推荐的SRS, 然后记录到档案中.理由: 对于原始设计者来说,很明显的缩略语, 当再次被使用到时, 有可能不再那么清晰.方针29: 层次间名称的一致性层次间或整个IP中, 信号或设计单元的名称应该保持一致.推荐关联多个实例化的名称因该有名称索引.理由: 增加可读性, 消除歧义, 在综合中避免缓冲器置入.方针30: Verilog名称应该与档案中的名称相同理由: 便于理解HDL模块.注: 选译Motorala的Verilog HDL Coding - Semiconductor Reuse Standard。