verilog书写规范
- 格式:doc
- 大小:112.50 KB
- 文档页数:15
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 module 写法摘要:一、Verilog 模块的基本概念1.Verilog 模块的定义2.模块的作用和用途二、Verilog 模块的编写规范1.模块声明2.端口声明3.信号声明4.模块体5.注释和文档三、Verilog 模块的实例与应用1.实例化模块的方法2.模块的参数传递3.模块的实例应用四、Verilog 模块的高级特性1.循环和条件语句2.事件和函数3.生成和复制正文:Verilog 是一种硬件描述语言,主要用于描述数字电路和模拟混合信号电路。
在Verilog 中,模块是非常重要的基本单位,它可以实现对复杂数字电路的抽象和描述。
本文将详细介绍Verilog 模块的写法及相关知识。
一、Verilog 模块的基本概念1.Verilog 模块的定义:Verilog 模块是一个自包含的代码实体,它可以实现特定的功能,并且可以与其他模块进行交互。
模块可以帮助我们简化复杂数字电路的设计,提高设计效率。
2.模块的作用和用途:Verilog 模块主要用于描述数字电路的逻辑功能,它可以实现对数字电路的抽象和简化。
模块可以提高设计的可读性和可维护性,降低设计错误和调试成本。
二、Verilog 模块的编写规范1.模块声明:模块声明是模块的开始,它使用关键字`module`,后跟模块名,例如:`module my_module();`。
2.端口声明:端口声明用于定义模块的输入和输出端口,它使用关键字`input`和`output`,例如:`input a, b; output c;`。
3.信号声明:信号声明用于定义模块内部的信号,它使用关键字`wire`,例如:`wire d, e;`。
4.模块体:模块体是模块的核心部分,它包含模块的逻辑实现。
模块体使用分号`;`开始,例如:`my_module my_instance();`。
5.注释和文档:注释和文档用于对模块进行说明和解释,它可以帮助我们理解模块的功能和实现方法。
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中一些常见的格式说明。
verilog使用规范明德扬设计规范对电路设计做了较高的要求,其目就在于用最简单的代码、最简洁的方式,设计出最易读、最健壮、最高效的Verilog代码。
按照明德扬设计规范进行代码设计的具体要求如下。
下面是初学者学习时定的规矩,明德扬点拨FPGA课程定下这些规矩,目的是为了同学们能专注于重点核心的知识,避免学习精力发散,或者学一些无关紧要的知识。
一、电路设计的语法1、设计不用的语法a)Initial在进行电路设计时绝对不要用,只是在用modelsim仿真时用来写测试文件。
b)task/function用于定义任务和函数,平时设计不使用,仿真时也很少使用。
完全不要花时间去学。
c)for/while/repeat/forever除了for之外,其他三个在设计时绝对不要用。
for循环请学到点拨FPGA第二十一章时才使用,之前千万不要用,用也是会错的。
在仿真时,可以用for产生重复信号,用forever产生时钟,用repeat做一些重复的测试等。
建议不要太深入,会基本用即可。
d)integer用于定义整形变量,在设计时不使用,在一些测试可能会用到。
记住,我们类型只有reg或wire。
e)模块内部不能有X态(不定态)、Z态(高阻态),内部不能有三态接口。
f)casex/casez在设计和仿真都不使用。
g)force/wait/fork在设计不使用,仿真很少使用。
h)#5,延时语句,设计时不使用(没法综合),仿真时使用。
2、设计使用的语法a)reg/wire、parameter信号类型只有两种,reg和wire。
记住,“信号由本模块产生,并且是用always语句产生的,类型为reg,其他都为reg”。
b)assign、always初学者暂时不使用assign,学到点拨FPGA课程第8章后再使用。
c)只允许使用if else和case这两种条件语句d)设计使用的算术运算符包括“+”、“-”、“*”、“/”、“%”。
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)使用适当的注释来解释所有的进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。
ASIAN MICROELECTRONICS CO.LTDVerilog编码规范From:项目管理部文档编号:AM-PMD038本规范规定了Verilog编码规范,即采用Verilog设计时的代码书写规范,本规范适用于逻辑芯片开发中使用Verilog语言作为RTL级设计语言电路描述规则(注释部分)关键词:Verilog HDL、注释摘要:本文档规定了在用Verilog HDL描述电路时注释要求。
一、在使用Verilog HDL描述电路时,为了增加电路的可读性,必须在电路中加入注释。
为了统一和规范设计,制定该规则。
二、Verilog HDL 模块结构:在用Verilog HDL描述电路时,基本结构如下:{注释1}module [模块名(端口名列表)][参数定义] //{注释2}[端口类型说明]//{注释3}[数据类型说明]//{注释4}{注释5}[描述体部]//{注释6}endmodule三、各部分注释具体要求:1. 注释1:在module 语句以前;建立时间和设计人;ASIAN MICROELECTRONICS CO.LTD修改时间和修改人列表;描述模块的功能;仿真文件名;2. 注释2:参数定义以后。
每行只能定义一个参数;参数的含义;正常情况的取值;3. 注释3:端口类型说明以后。
每行只能说明一个端口;端口的信号含义;4. 注释4:数据类型说明以后。
每行只能说明一个数据;数据的具体含义;修改时间和修改人列表;5. 注释5:在每个always前;描述该块语句完成的功能;6. 注释6:关键的判断语句后;简单描述语句的功能;四、说明:1. 不得使用中文注释;2. 需要时使用参数化设计;3. 模块、端口和变量命名尽可能统一,且意义明确;4. 各描述体功能尽可能明确和单一;5. 对任何需存档的修改必须记录在设计文挡中。
ASIAN MICROELECTRONICS CO.LTD 电路描述规则(代码部分) 大类 编号规则要素 1低电平有效的信号,信号名后缀“_n ” 2模块名小写 // 对AM0202不作要求。
海思高校合作——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编码规(仅供部使用)拟制: 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,然后以此类推。
海思高校合作——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。
// *****************************// DEFINE MODULE PORT //// ******************************//// module MODULE_NAME (// INPUTinput_port_1,…input_port_m,// OUTPUToutput_port_1,…output_port_m,);// *****************************// DEFINE PARAMETER //// ******************************parameter…// ******************************// DEFINE INPUT// ******************************input rst_n ; // reset, active low .input clk_* ; // clock signal , 50M .input [n:0] a_din ; // *****input [k:0] b_din ; // *****// ******************************// DEFINE OUTPUT //// ******************************output [m:0] a_dout ; // *****output [i:0] b_dout ; // *****// ******************************// OUTPUT ATRRIBUTE //// ******************************// REGSreg [m:0] a_dout ; // *****//WIRESwire [i:0] b_dout ; // *****// ******************************// INSTSNCE MODULE //// ******************************MODULE_NAME_A U_MODULE_NAME_A(.A (A ),.B (B ),.C (C ),); …// ******************************//MAIN CODE //// ******************************… …… …… …// ****************************** //Endmodule3.一致的排版A. 一致的缩排●统一的缩排取4个空格宽度●输入输出信号的宽度定义与关键字之间,信号名与宽度之间要用空格分开;所有宽度定义对所有信号名对齐,代码风格统一如下:input [3:0] input_a ; // *****input input_b ; // *****…output [128:0] output_a ;output [15:0] output_b ;output output_c ;B.一致的begin end 书写方式always 中,一定要用begin end 区分,格式和代码风格统一如下:always @ (postedge clk or negedge rst_n)beginif (rst_n==1‟b0)syn_rst<= …DLY 1‟b0;elsebeginif (a==b)syn_rst<= …DLY 1‟b1;elsesyn_rst<= …DLY 1‟b0;endendif else 中仅有一个语句行时,不要使用begin end; 如果有多个语句行时,begin end和if ()或else ()空四个格。
格式如下:if (…)…else if (…)else********************************************************************if (…)…else if (…)begin……(endelse4. 一致的信号命名风格简洁,清晰,有效是基本的信号命名规则,详见命名规范。
a.端口、信号、变量名的所有字母小写:函数名、宏定义、参数定义用大写b.使用简称、缩略词(加上列表)c.基于含义命名(避免以数字命名的简单做法),含义可分段(最多分三段),每一小段之间加下划线”_”,如tx_data_val;命名长度一般限制在20个字符以内。
d.低电平有效信号,加后缀”_n”,如rst_ne.无条件寄存的寄存信号在原信号上加ff1、ff2…如原信号 data_in, 寄存一拍data_in_ff1,寄存两拍data_in_ff2f.不能用”reg”,作为最后的后缀名,因为综合工具会给寄存器自动加上_reg, 如果命名里就用_reg作为后缀名则扰乱了网表的可读性。
5.统一的表达式书写A. 括号的使用如果一个表达式的分组情况不是很明显时,加上括号有助于理解。
例如下面的代码加上括号就清晰很多。
if (&a==1’b1&&!flag==1’b1 || b==1’b1)//改为:if ((&a==1’b1)&&(!flag==1’b1)||(b==1’b1))//B.适当的使用空格一般表达式在运算符的两侧要各留出一个空格,但定义比较长的表达式,去掉预先级高的运算符前的空格,使其与运算对象紧连在一起,可以更清晰的显示表达式结构。
还是上面的例子:if ((&a==1’b1)&&(!flag==1’b1)||(b==1’b1))//改为:if ((&a == 1’b1)&&(!flag == 1’b1)||(b == 1’b1))//”<=”, ”==”前后都要加空格。
C.赋值要指明比特宽度赋值或者条件判断时要注明比特宽度,注意表达式的位宽匹配。
如:reg [4:0] signal_a;错误: 1 signal_a <= 5;2if(signal_a == 5)3signal_a <= signal_b[3:0]+4;正确: 1 signal_a <= 5d52if(signal_a == 5d5)3signal_a <= {1’b0, signal_b[3:0]+5d4因为工具默认是32位宽,如果不注明位宽,工具检查会报warning,而且这样增加了设计的严谨性。
6.统一的语句书写――条件判断结构书写方式A. 条件的完整性If else搭配使用,对于缺省的条件要写”else;”;If elsed 条件判别式要全面,比如if(a == 1’b0);Case中的缺省条件要写”default”;B.”if else”结构:适用于复杂条件判断的语句但对于复杂的条件判断,使用?:如果不仔细分析条件的每一条路径,就让读代码搞不清它是到底要做什么。
例如:C = (!Ic&&!rc)?0(Ic?rc:Ic) // (?:)改为:always @(Ic or rc) // if elsebeginif ((Ic==0)&&(rc==0))c = 0;else if (Ic==1)c = rc;elsec = Ic;end即使是简单的条件判断,我们也必须使用IF-ELSE,当涉及复杂的条件判断,使用IF-ELSE结构以获得清晰的结构便于理解和维护。
因此必须使用IF-ELSE。
C.”IF ELSE”结构VS”CASE”结构IF ELSE结构综合的结构可能是与或非门构成的,也可能是一组多路选择器,而case 结构综合结果一般会是多路选择器,但对于可以优化的case综合工具会综合出更简单的结构。
所有对于可以写出平行结构的条件,优先写成case结构,例如地址译码等,条件之间有重复和嵌套的情况则是写成if else结构。