VERILOG语言编写规范

合集下载

verilog语言例化书写格式

verilog语言例化书写格式

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设计中有效地实例化模块,并连接各个模块之间的信号。

2024版Verilog编程规范(华为)

2024版Verilog编程规范(华为)
自动化测试实现
实现自动化测试流程,提高测试 效率和准确性。
06
代码审查与质量保证
代码审查流程介绍
提交代码
开发人员将代码提交到代码审查 系统中。
分配审查任务
系统或审查组长将审查任务分配 给审查人员。
代码审查
审查人员对代码进行逐行审查, 检查是否符合编程规范和质量要
求。
审查通过
经过多轮反馈和整改后,代码符 合要求,审查通过。
通过定期的培训、分享和宣传活动,提高开 发人员对Verilog编程规范的认识和重视程度。
引入自动化检查工具
建立持续改进机制
研究和引入自动化检查工具,对Verilog代码 进行静态分析和规范检查,进一步提高代码 质量和开发效率。
建立规范的持续改进机制,收集开发人员的 反馈和建议,及时调整和优化规范内容。
可重用性原则
模块应具有高内聚、低耦 合的特点,便于在不同项 目中重用。
可维护性原则
模块应易于理解、测试和 修改,以降低维护成本。
顶层结构设计方法
自顶向下设计
从系统整体需求出发,逐 步细化到各个模块的设计 和实现。
模块化设计
将系统划分为多个独立的 模块,每个模块承担一定 的功能,便于并行开发和 维护。
减少错误和提高代码质量
02
规范的编程习惯有助于减少编码过程中的错误,提高代码的稳
定性和可靠性。
促进知识共享和传承
03
统一的编程规范有利于知识的积累和传承,降低新人学习成本,
提高团队整体技术水平。
适用范围及对象
适用范围
本规范适用于使用Verilog语言进 行硬件描述和设计的所有场景,包 括但不限于数字电路设计、验证、 仿真等。
端口名应避免与模块内部变量名冲突。

VerilogHDL程序编写规范2

VerilogHDL程序编写规范2

文档控制表
文档
编辑工具 作者情况
标题: 版本号: 发行号:
实行日期: 关键词
名称 模板:
原作者: 协作者: 校对: 审核:
表1 文档控制表VeFra bibliotekilogHDL程序编写规范 V1.0
2008年6月1日
Microsoft® Office Word 2003
刘兆庆 罗杰俊
I
哈尔滨工业大学自动化测试与控制研究所技术规范
4 可综合性编码规范........................................................................................................................18 4.1 寄存器描述.........................................................................................................................18 4.2 避免产生锁存器.................................................................................................................18 4.3 避免产生组合电路反馈。................................................................................................ 19 4.4 完整的敏感量列表.............................................................................................................20 4.5 阻塞和非阻塞赋值.............................................................................................................21 4.6 case 语句和 if-else 语句.....................................................................................................23 4.7 时序逻辑电路的描述.........................................................................................................24 4.8 对关键信号的描述.............................................................................................................25 4.9 避免使用延时语句.............................................................................................................25

Verilog程序编写规范

Verilog程序编写规范

Verilog程序编写规范在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。

良好代码编写风格的通则概括如下:一、命名规则(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对参数名、常量名和用户定义的类型用大写;(2)使用有意义的信号名、端口名、函数名和参数名;(3)信号名长度不超过20个字符;(4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;(6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。

注意在同一个设计中要使用同一个小写字母表示低电平有效;(7)对于复位信号使用reset 作为信号名,如果复位信号是低电平有效,建议使用reset_n;(8)当描述多比特总线时,使用一致的定义顺序,采用从高到低的定义顺序。

对于verilog 建议采用bus_signal[x:0]的表示;(9)尽量遵循业界已经习惯的一些约定。

如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;二、文档结构(10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;// +FHDR-------------------------------------------------------------------// Copyright @ 2008, State Key Laboratory of Advanced Optical Communication Systems & Networks, PKU // ----- -----------------------------------------------------------------------// FILE NAME:// AUTHOR:// DATA OF CREATION:// -----------------------------------------------------------------------------// PURPOSE://// --- -----------------------------------------------------------------------// RELEASE HISTORY:// DATA AUTHOR DESCRIPTION//// --- -----------------------------------------------------------------------// -FHDR-------------------------------------------------------------------//(11)使用适当的注释来解释所有的进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。

Verilog代码书写规范

Verilog代码书写规范

Verilog代码书写规范2.5.1 信号命名规则信号命名规则在团队开发中占据着重要地位,统一、有序的命名能大幅减少设计人员之间的冗余工作,还可便于团队成员代码的查错和验证。

比较著名的信号命名规则当推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。

2.5.2 模块命名规则HDL语言的模块类似于C语言中的函数,可采用C语言函数的大多数规则。

模块的命名应该尽量用英文表达出其完成的功能。

遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度一般不少于2个字母。

verilog书写规范

verilog书写规范

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语言编写规范

VERILOG语言编写规范1 目的本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到1. 逻辑功能正确2.可快速仿真3. 综合结果最优如果是hardware model)4. 可读性较好。

2 范围本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。

本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。

3 定义Verilog HDL : Verilog 硬件描述语言FSM :有限状态机伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径4 引用标准和参考资料下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性Actel HDLCoding Style GuiderSun MicrosystemsRevision 1.0VerilogStyle and Coding Guidelines5 规范内容5.1 Verilog 编码风格本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模块。

5.1.1 命名规范选择有意义的信号和变量名,对设计是十分重要的。

命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。

1. 用有意义而有效的名字有效的命名有时并不是要求将功能描述出来如For ( I = 0; I < 1024; I = I + 1 )Mem[I]<= #1 32’b0;For 语句中的循环指针I 就没必要用loop_index作为指针名。

VERILOG语言编写规范

VERILOG语言编写规范

VERILOG语言编写规范1 目的本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到1. 逻辑功能正确2.可快速仿真3. 综合结果最优如果是hardware model)4. 可读性较好。

2 范围本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。

本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。

3 定义Verilog HDL : Verilog 硬件描述语言FSM :有限状态机伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径4 引用标准和参考资料下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性Actel HDLCoding Style GuiderSun MicrosystemsRevisionVerilogStyle and Coding Guidelines5 规范内容Verilog 编码风格本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模块。

命名规范选择有意义的信号和变量名,对设计是十分重要的。

命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。

1. 用有意义而有效的名字有效的命名有时并不是要求将功能描述出来如For ( I = 0; I < 1024; I = I + 1 )Mem[I]<= #1 32’b0;For 语句中的循环指针I 就没必要用loop_index作为指针名。

Verilog HDL编程规范

Verilog HDL编程规范

注意: 顶层文件名为:“模块名_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代码书写规范

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代码书写规范

Verilog代码书写规范2.5.1 信号命名规则信号命名规则在团队开发中占据着重要地位,统一、有序的命名能大幅减少设计人员之间的冗余工作,还可便于团队成员代码的查错和验证。

比较著名的信号命名规则当推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。

2.5.2 模块命名规则HDL语言的模块类似于C语言中的函数,可采用C语言函数的大多数规则。

模块的命名应该尽量用英文表达出其完成的功能。

遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度一般不少于2个字母。

第2章 Verilog 语言规则(修改)

第2章 Verilog 语言规则(修改)

9.2 数 据 类 型
Verilog的数据类型及逻辑系统
学习内容:
学习Verilog逻辑值系统 学习Verilog中不同类的数据类型 理解每种数据类型的用途及用法 数据类型说明的语法
Verilog采用的四值逻辑系统
’0’, Low, False, Logic Low, Ground,VSS, Negative Assertion
trireg类型很象wire类型,但trireg类型在没有驱动时保持 以前的值。这个值的强度随时间减弱。
寄存器类 (register)
寄存器类型在赋新值以前保持原值
寄存器类型大量应用于行为模型描述及激励描述。在 下面的例子中,reg_a、reg_b、reg_sel用于施加激 励给2:1多路器。
第9章 Verilog语言规则
9.1 文字规则
常量(或常数)
整数类型(integer)(32位):可以被综合。 实数类型(real)(32位) 不可综合 字符串类型(strings)
9.1 文字规则
1. 整数
注意:
为了增加可读性,在较长的数间可用下划线分 开。
若不注明位宽和进制,或仅用D注明进制时, 都是十进制。如:123,’D12
‘1’, High, True, Logic High, Power, VDD, VCC, Positive Assertion
’X’ Unknown: OccuResolved Conflict
HiZ, High Impedance, Tri- Stated, Disabled Driver (Unknown)
注意integer和reg 类型在算术运算 时的差别。integer 是有符号数,而 reg是无符号数。

Verilog编码规范

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可综合编程规则

verilog可综合编程规则1. 变量声明和赋值必须在同一行完成,不能分开写。

2. 变量的赋值必须在always块中完成,不能在过程块中赋值。

3. 所有的变量必须在模块的开始部分进行声明。

4. 模块的输入和输出必须在模块的开始部分进行声明,并且必须以`input`或`output`关键字开头。

5. 输入和输出端口的方向必须与模块定义中的方向相匹配。

6. 所有的变量和信号必须在使用之前进行初始化。

7. 不允许使用`initial`块进行变量的赋值,只能使用`always`块。

8. 所有的组合逻辑必须在`always_comb`块中进行描述。

9. 必须使用非阻塞赋值(`<=`)来描述时序逻辑,不能使用阻塞赋值(`=`)。

10. 在时序逻辑中,变量的赋值必须使用非阻塞赋值,以确保时序逻辑的正确执行。

11. 对于多位信号,必须使用`[ ]`来表示信号的位宽。

12. 在always块中,必须使用敏感列表来指定时序逻辑的触发条件。

13. 在always块中,必须使用`posedge`或`negedge`关键字来指定时钟信号的边沿。

14. 不允许在always块中使用`if`语句进行分支控制,只能使用`case`或`if-else`语句。

15. 在always块中,不允许出现死循环或无限循环。

16. 在模块的输出端口中,必须使用`assign`关键字进行赋值。

17. 在模块之间进行连接时,必须使用连线操作符`wire`或`reg`来声明信号。

18. 不允许在模块中使用的信号在模块之间进行连接。

19. 必须使用`endmodule`关键字来结束模块的定义。

20. 必须使用`module`关键字来定义模块。

这些规则是基本的Verilog综合编程规则,遵循这些规则可以确保Verilog代码的正确性和可综合性。

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设计源代码的可读性、可靠性和可重用性,减少维护成本,最终提高产品生产力;并且以此作为代码走查的标准。

veriloga语法规则

veriloga语法规则

Verilog是一种硬件描述语言,用于描述数字电路和系统。

以下是Verilog语法规则的一些要点:
标识符:Verilog中的标识符由字母、数字和下划线组成,且第一个字符必须是字母或下划线。

标识符区分大小写。

数据类型:Verilog中有多种数据类型,包括wire、reg、int、parameter等。

wire类型用于表示线网,reg类型用于表示寄存器。

赋值语句:Verilog中的赋值语句使用“=”操作符,例如“a = b”。

运算符:Verilog中有多种运算符,包括算术运算符、逻辑运算符、关系运算符等。

控制结构:Verilog中有条件语句、循环语句等控制结构。

模块:Verilog中的模块是自顶向下的设计方法的核心,用于描述数字电路和系统。

模块的语法包括模块声明、端口声明、内部信号声明、过程块和实例化等部分。

时序控制:Verilog中的时序控制使用非阻塞赋值和延迟表达式。

参数:Verilog中的参数用于在模块之间传递值。

任务和函数:Verilog中的任务和函数用于执行特定的操作。

注释:Verilog中的注释使用“//”或“/* */”进行注释。

这些是Verilog语法规则的一些要点,如果您想了解更多细节,建议参考Verilog的相关书籍或文档。

verilog代码书写规范

verilog代码书写规范

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编程规范

例如:
data_bus data_width clk48M 48M_clk
数据总线 使用有意义的名 字,以利于望文 数据位宽 生义 48M时钟信号 名称不能以数字开头 不能连续使用下划线 不能包含非字母符号*
data__bus
data*bus
版板所有 © 广州周立功单片机发展有限公司 2007
大小写则
底纹使用-10%灰底,必须以“程序清单”为题注并置于程
序上方。
版板所有 © 广州周立功单片机发展有限公司 2007
命名规则 注释 代码格式
版板所有 © 广州周立功单片机发展有限公司 2007
端口的申明及注释
必须明确地表明端口类型,每行中只有一个端口申明。
module buzzer (
clk_48M, beep, key, ledout ); input input output output . . . endmodule [3:0] [7:0] //时钟输入 //蜂鸣器控制输出 //按键输入 //LED显示控制信号 clk_48M; key; beep; ledout; 最好在同一行上,每 个端口列表后面紧跟 一个描述性的注释
版板所有 © 广州周立功单片机发展有限公司 2007
多个后缀的信号名的优先权
对于包含多个后缀的信号,建议采用下面的优先权, 从高到低。 最高的优先权建议从信号名的最后一个后缀 获得,多个后缀的信号名的优先权: 1. _n //低电平有效信号
ram _z data1 2.
3. 4. _clk _next
模块标号小写
//时钟 //LED输出 //48M系统时钟 //LED输出控制 //计数器 //LED输出缓存区
input output reg reg wire
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VERILOG语言编写规范1 目的本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到1. 逻辑功能正确2.可快速仿真3. 综合结果最优如果是hardware model)4. 可读性较好。

2 范围本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。

本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。

3 定义Verilog HDL : Verilog 硬件描述语言FSM :有限状态机伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径4 引用标准和参考资料下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性Actel HDLCoding Style GuiderSun MicrosystemsRevision 1.0VerilogStyle and Coding Guidelines5 规范内容5.1 Verilog 编码风格本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模块。

5.1.1 命名规范选择有意义的信号和变量名,对设计是十分重要的。

命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。

1. 用有意义而有效的名字有效的命名有时并不是要求将功能描述出来如For ( I = 0; I < 1024; I = I + 1 )Mem[I]<= #1 32’b0;For 语句中的循环指针I 就没必要用loop_index作为指针名。

2. 用连贯的缩写长的名字对书写和记忆会带来不便,甚至带来错误采用缩写时应注意同一信号在模块中的一致性。

缩写的例子如下:Addr addressPntr pointerClk clockRst reset3. 用名字前加小写n表示低电平有效高电平有效的信号不得以下划线表示短暂的引擎信号建议采用高有效如 nRst, nTrdy, nIrdy nIdsel.4. 大小写原则名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接(或第二个单词首字母大写)如 :Packet_addr, Data_in, Mem_wr , Mem_ce_Or: PacketAddr, DataIn, MemWr , MemCe5.全局信号名字中应包含信号来源的一些信息如: D_addr[7:2] 这里的 D 指明了地址是解码模块(Decoder module)中的地址.6. 同一信号在不同层次应保持一致性7. 自己定义的常数类型等用大写标识如: parameter CYCLE=100.8.避免使用保留字如 in out x z等不能够做为变量端口或模块名9. 添加有意义的后缀使信号名更加明确常用的后缀如下芯片的双向信号 -xbio芯片的三态输出 _xz芯片的漏极开路输出 _xod芯片原始输出信号 _xo芯片原始输入信号 _xi下降沿有效的寄存器 _f连到三态输出的信号 _z寄存前的信号 _next时钟信号 _Clk5.1.2 Modules1.顶层模块应只是内部模块间的互连Verilog设计一般都是层次型的设计,也就是在设计中会出现一个或多个模块,模块间的调用在所难免。

可把设计比喻成树,被调用的模块就是树叶,没被调用的模块就是树根,那么在这个树根模块中,除了内部的互连和模块的调用外,尽量避免再做逻辑,如:不能再出现对reg变量赋值等,这样做的目的是为了更有效的综合,因为在顶层模块中出现中间逻辑,Synopsys 的design compiler 就不能把子模块中的逻辑综合到最优。

2. 每一个模块应在开始处注明文件名功能描述引用模块设计者设计时间及版权信息等如 /* =========================== *\Filename ﹕ SPI_M.vAuthor ﹕whqDescription ﹕File descriptionCalled by ﹕Top moduleRevision History ﹕time yy-mm-ddRevision 1.0Email ﹕Copyright(c)1999,~~~~~~~~~~~~~ ,All right reserved/* =========================== *\3. 不要对Inpu t进行驱动, 在module 内不要存在没有驱动的信号,更不能在模块端口中出现没有驱动的输出信号,避免在仿真或综合时产生warning,干扰错误定位4. 每行应限制在80个字符以内以保持代码的清晰美观和层次感一条语句占用一行如果较长,超出80个字符则要换行。

5. 电路中调用的 module 名用 Uxx 标示。

向量大小表示要清晰,采用基于名字(name_based)的调用而非基于顺序的(order_based)。

Instance U Instance2(.DataOut (DOUT ),.DataIn (DIN ),.Cs_ (Cs_ ));6. 用一个时钟的上沿或下沿采样信号,不能一会儿用上沿,一会儿用下沿。

如果既要用上沿又要用下沿,则应分成两个模块设计。

建议在顶层模块中对Clock做一非门,在层次模块中如果要用时钟下沿就可以用非门产生的PosedgeClk_ ,这样的好处是在整个设计中采用同一种时钟沿触发,有利于综合。

基于时钟的综合策略7. 在模块中增加注释对信号,参量,引脚,模块,函数及进程等加以说明,便于阅读与维护。

8. Module名要用大写标示,且应与文件名保持一致。

如 Module DFF_ASYNC_RST(Reset,Clk,Data,Qout);严格芯片级模块的划分只有顶层包括IO引脚(pads),中间层是时钟产生模块, JTAG,芯片的内核(CORE),这样便于对每个模块加以约束仿真,对时钟也可以仔细仿真。

模块输出寄存器化对所有模块的输出加以寄存( 如图1) 使得输出的驱动强度和输入的延迟可以预测, 从而使得模块的综合过程更简单- 输出驱动的强度都等于平均的触发器驱动强度图19.将关键路径逻辑和非关键路径逻辑放在不同模块保证DC可以对关键路径模块实现速度优化, 而对非关键路径模块实施面积优化在。

同一模块DC无法实现不同的综合策略,将相关的组合逻辑放在同一模块,有助于DC对其进行优化因为DC通常不能越过模块的边界来优化逻辑。

5.1.3 Net and Register1. 一个reg变量只能在一个always语句中赋值2. 向量有效位顺序的定义一般是从大数到小数尽管定义有效位的顺序很自由,但如果采用毫无规则的定义势必会给作者和读代码的人带来困惑,如 Data[-4: 0],则 LSB[0][-1][-2][-3][-4]MSB,或 Data[0: 4] 则LSB[4][3][2][1][0]MSB 这两种情况的定义都不太好,推荐Data[4: 0]这种格式的定义。

3.对net和register类型的输出要做声明在PORT中。

如果一个信号名没做声明Verilog将假定它为一位宽的wire变量。

4. 线网的多种类型。

寄存器的类型。

5.1.4 Expressions1. 用括号来表示执行的优先级尽管操作符本身有优先顺序,但用括号来表示优先级对读者更清晰,更有意义。

If ((alpha < beta) && (gamma >= delta)).... 比下面的表达更合意If (alpha < beta && gamma >= delta)...2. 用一个函数(function)来代替表达式的多次重复如果代码中发现多次使用一个特殊的表达式,那么就用一个函数来代替,这样在以后的版本升级时更便利,这种概念在做行为级的代码设计时同样使用,经常使用的一组描述可以写到一个任务(task)中。

5.1.5 IF 语句1. 向量比较时比较的向量要相等当比较向量时 verilog将对位数小的向量做0 扩展以使它们的长度相匹配它的自动扩展为隐式的建议采用显示扩展这个规律同样适用于向量同常量的比较Reg Abc[7:0];Reg Bca[3:0];......If (Abc= = {4’b0, Bca})begin.......If (Abc= = 8’b0) begin2. 每一个If 都应有一个else 和它相对应在做硬件设计时,常要求条件为真时执行一种动作而条件为假时执行另一动作即使认为条件为假不可能发生,没有else可能会使综合出的逻辑和,RTL级的逻辑不同。

如果条件为假时不进行任何操作,则用一条空语句。

always @(Cond)beginif (Cond)DataOut<= DataIn;End// Else以上语句DataOut会综合成锁存器.3. 应注意If ..else if ...else if ...else 的优先级4. 如果变量在If-else 或case 语句中做非完全赋值则应给变量一个缺省值。

即V1 = 2’b00;V2 =2’b00;V3 = 2’b00;If (a = = b) beginV1 = 2’b01; //V3 is not assignedV2 = 2’b10;EndElse if (a = = c) beginV2 = 2’b10; //V1 is not assignedV3 = 2’b11;EndElse5.1.6 case 语句1. case语句通常综合成一级多路复用器(图的右边部分),而if-then-else则综合成优先编码的串接的多个多路复用器,如图的左边部分通常使用case 语句要比if语句快,优先编码器的结构仅在信号的到达有先后时使用。

条件赋值语句也能综合成多路复用器,而case 语句仿真要比条件赋值语句快。

2 所有的Case 应该有一个default case允许空语句Default : ;5.1.7 Writing functions1. 在function的最后给function赋值Function CompareVectors;// (Vector1, Vector2,Length) Input [199:0] Vector1, Vector2;Input [31:0] Length;//local variablesInteger i;RegEqual;Begini= 0;Equal = 1;While ((i<Length)&& Equal) beginIf (Vector 2[i] !== 1’bx)beginIf (Vector1[i]!== Vector2[i])Equal = 0;Else ;Endi= i+ 1;EndCompareVectors= Equal;EndEndfunction //compareVectors//比较器3. 函数中避免使用全局变量否则容易引起HDL行为级仿真和门级仿真的差异。

相关文档
最新文档