0-verilog编程规范

合集下载

Verilog编码规范

Verilog编码规范

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 编码原则

/article.php?type=blog&itemid=781规则#1: 建立时序逻辑模型时,采用非阻塞赋值语句。

规则#2: 建立latch模型时,采用非阻塞赋值语句。

规则#3: 在always块中建立组合逻辑模型时,采用阻塞赋值语句。

规则#4: 在一个always块中同时有组合和时序逻辑时时,采用非阻塞赋值语句。

规则#5: 不要在一个always块中同时采用阻塞和非阻塞赋值语句。

规则#6: 同一个变量不要在多个always块中赋值。

规则#7: 调用$strobe系统函数显示用非阻塞赋值语句赋的值。

规则#8: 不要使用#0延时赋值。

组合逻辑1,敏感变量的描述完备性Verilog中,用always块设计组合逻辑电路时,1.1在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出, 1.2always中if语句的判断表达式必须在敏感电平列表中列出。

1.3**如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。

注:这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。

综合器会发出警告。

Example1:input a,b,c;reg e,d;always @(a or b or c)begine=d&a&b; /*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/d=e |c;endExample2:input a,b,c;reg e,d;always @(a or b or c or d)begine=d&a&b; /*d在敏感电平列表中,d变化时e立刻变化*/d=e |c;end2, 条件的描述完备性如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。

FPGA宝贵实战经验及Verilog编程规范

FPGA宝贵实战经验及Verilog编程规范

规范很重要工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。

逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。

在逻辑方面,我觉得比较重要的规范有这些:1.设计必须文档化。

要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。

这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。

2.代码规范。

a.设计要参数化。

比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我们可以这么写:parameter CLK_PERIOD = 30;parameter RST_MUL_TIME = 5;parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;...rst_n = 1'b0;# RST_TIME rst_n = 1'b1;...# CLK_PERIOD/2 clk <= ~clk;如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重新例化就行了,从而使得代码更加易于重用。

b.信号命名要规范化。

1) 信号名一律小写,参数用大写。

2) 对于低电平有效的信号结尾要用_n标记,如rst_n。

3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后方便很多。

如:module a(//inputclk,rst_n, //globle signalwren,rden,avalon_din, //related to avalon bussdi, //related to serial port input//outputdata_ready,avalon_dout, //related to avalon bus...);4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个entity。

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)使用适当的注释来解释所有的进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。

关于VerilogHDL编写规则的说明

关于VerilogHDL编写规则的说明

关于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 一个文件一个模块一个文件最多可以有一个模块。

2024版年度Verilog编程规范(华为)

2024版年度Verilog编程规范(华为)

通过定期的培训、分享和宣传活动,提高开 发人员对Verilog编程规范的认识和重视程度。
引入自动化检查工具
建立持续改进机制
研究和引入自动化检查工具,对Verilog代码 进行静态分析和规范检查,进一步提高代码 质量和开发效率。
建立规范的持续改进机制,收集开发人员的 反馈和建议,及时调整和优化规范内容。
同步/异步通信
根据实际需求选择同步或异步通信方式,确保子模块间的协同工 作。
20
时钟域划分及时序收敛策略
时钟域划分
根据系统时钟需求,将设计划分为不同的时钟域, 避免跨时钟域操作带来的问题。
时序收敛策略
采用合适的时序收敛方法,如时钟同步、异步 FIFO等,确保数据在不同时钟域间正确传输。
时序约束与验证
2024/2/2
01 注释应清晰明了,准确描述代码的功能和 实现方法。
02 注释应与代码同步更新,避免注释与代码 不一致。
03
注释应使用中文或英文,避免使用其他语 言。
04
对于重要的函数、模块和算法,应在文件 开头添加注释说明。
14
空格和换行使用原则
关键字与括号之间应加空 格,如`if (`、`for (`等。
开发效率提高
规范的编码风格使得开发人员能够更快速地理解和修改代码,提高 了开发效率。
团队协作更加顺畅
统一的编程规范促进了团队成员之间的协作,减少了因代码风格不同 而产生的沟通成本。
2024/2/2
31
未来改进方向
持续优化规范内容
加强规范培训和宣传
根据业界最佳实践和团队实际经验,持续优 化Verilog编程规范的内容,以适应新的技术 和应用场景。
一种硬件描述语言 (Hardware Description Language,HDL),用于 描述数字电路和系统。

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;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

端口的申明顺序与端 使用: 口列表的顺序相同 input a; input b; 不使用: input a , b; 和 input a, b;
在一个 区域中申明所有的内部连线 在模块顶部内部连线申明应紧跟在I/O端口 申明的后面。
module lcd_top ( clk_48M, //系统时钟 rst, //rst为全局复位信号 lcd_en, //LCD使能信号 data_bus //8位指令或数据总线 ); clk_48M; rst; lcd_en; [7:0] data_bus; 用于将 链接两个模块的时钟
input input output output wire . . . clk_lcd;
以表格样式书写代码 相同类型的代码项是在一条竖线上,使用四个空格的连续 缩进使代码在一条竖线上。
always @( posedge clk_48M) begin if(clk_reg) count <= #1 16'd0; else count <= #1 Count +16‘d1; end
module buzzer (
clk_48M, beep, key, ledout ); input input output output . . . endmodule [3:0] [7:0] //时钟输入 //蜂鸣器控制输出 //按键输入 //LED显示控制信号 clk_48M; key; beep; ledout; 最好在同一行上,每 个端口列表后面紧跟 一个描述性的注释
表示TAB制表。
例如:使用Notepad++编辑器显示的结果,图中橙色箭头
使用4个空格进行代码缩进 为了提高程序的可读性,必须使用4个空格 (建议使用TAB键以空格代替,详见制表符的设 置)和换行来实现缩进对齐,不要直接使用Tab制 表符。因为不同的编辑系统的Tab制表符间距可能 不同。
用不同的编辑器打开差异性很大。
z
n //低电平有效
低电平有效信号 //三态信号 三态信号 //时钟信号 数据类型 //状态机信号
操作对象
模块命名习惯
模块命名规则: 将模块英文名称的各个单词的首字母组合起来, 形成3~5个符号的缩写。 Arithmatic logical unit —— ALU
若模块的英文名只有一个单词,可取该单词的 前3个字母 Decider —— DEC
大小写规则
参数(parameter)、常量(constant)和块标号(block label)名必 须一致采用大写;而信号,变量和结构名(construct)以及实例标号 (instance)必须一致采用小写。有利于在仿真时,区分不变和变化的 数据。
module display_led( clk_48M, ledout ); clk_48M; ledout;
不同类型的信号命名习惯 系统信号以字符串sys或者syn开头 sys_dout, sys_din
时钟信号以clk开头,并在后面添加相应的频率值 clk_768MHZ 复位信号一般以rst或者reset开头,置位信号以st 或者set开头
多个后缀的信号名的优先权
对于包含多个后缀的信号,建议采用下面的 优先权,从高到低。 最高的优先权建议从信号 名的最后一个后缀获得,多个后缀的信号名的 优先权: 1. ram 信号 2. 3. 4. _n data1 _z _clk _next
// 时钟节拍计数器
// 计数器加一
注释对齐 语句对齐
注释有两种形式,必须 使用一行注释(//),不 要使用多行注释 (/*…*/),不利于代 码的屏蔽。
使用4个空格进行代码缩进 为了提高程序的可读性,必须使用4个空格 (建议使用TAB键以空格代替,详见TAB制表符 的设置)和换行来实现缩进对齐,不要直接使用 Tab制表符。因为不同的编辑系统的Tab制表符间 距可能不同。
不采用
assign result <= (great_r[3]) | (equal_r[3] & great_r[2]) | (equal_r[3] & equal r[2] & great_r[1]) | upper_en = (p5type && xadr1[0]); lower_en = (p5type (equal_r[3] & equal_r[2] & equal_r[1] & && !xadr1[0]); great_r[0]);
parameter
常量大写
//LED显示时间控制
assign led_clk = count[22];
名字必须唯一
在不区分大小写的情况下,名字必须唯一。例如, 名字state和State不能同时出现在同一设计中,这是 因为有的EDA工具不区分大小写。
module casestatement ( a, State, state, dout );
例如:使用记事本打开显
每行只有一个Verilog语句,应该保持每行不超过80 个字符:
不要在同一条线上使用多个分号连接的分开的Verilog语句。
对于长的语句可以使用回车和缩进方法,表示成连续的语句行。
采用
upper_en = (p5type && xadr1[0]); lower_en = (p5type && !xadr1[0]);
Verilog 编写规范

简介 规范的重要性:
1. 良好的编程风格有利于减少消耗的硬件资源, 提高设计的工作频率 。 2. 提高系统的可移植性和可维护性。 3. 程序的格式化能体现程序员的基本素质和整个 团队的风貌。
命名规则
注释 代码格式
命名规则
其它规范



各节之间加1行或者多行空格 不同变量,变量与符号,变量与括号之间都应 该保留一个空格 alwaya @ ( … ) 逻辑运算符、算术运算符、比较运算符等运算 符两侧各留一个空格。(单数操作运算符例外) 使用”//” 注释时,在”//”后应当有一个空格
习题
用verilog实现一个被除数为8位, 除数为4位的高效除法器
模块注释模板
模块注释
进程注释
模块结束
注释规则(文档版) 要特别说明的就是,为了排版好看,我 们采用首行缩进0.74厘米,字体小五,宋体 (中),Courier New(英),底纹使用10%灰底,必须以“程序清单”为题注并置 于程序上方。
命名规则 注释 代码格式
端口的申明及注释
必须明确地表明端口类型,每行中只有一个端口申明。
模块命名习惯 模块之间接口信号的命名 所有的变量命名分为两个部分:第一部分表 明数据方向,其中数据发出方在前,数据接收 方在后;第二部分为数据名称。两个部分用下 划线隔离开。第一部分全部大写,第二部分中 所有具有明确意义的英文名全部拼写或者缩写 的第一个字母大写,其余部分小写。 例:CPUMMU_WrReq (CPU发送给MMU的写请求信号)
模块命名习惯
模块内部信号 模块内部的信号由几个单词连接而成,缩写要 求能基本表明本单词的含义; 常用缩写:Clock——Clk Write——Wr Frequency—— Freq 每个缩写的第一个字母大写,若遇两个大写字母 相邻,中间添加一个下划线。DivN_Cntr
命名规则 注释 代码格式
文件注释模板(英文版)
公司信息
文件信息
创建信息
修改信息
用TAB键缩进对齐 …………
文件结束
文件注释模板(中文版)
文件的中文注释模板和英文注释模板一样
…………
模块注释模板
模块可以由一个或多个进程(always模块)/ 赋值语句组成,模块注释主要用分割功能模块, 提高程序可读性,包括模块注释和模块结束。 模块间如进程(always模块)的注释可直接在上 面注释,可以多行,模块的英文注释模板可自 行修改。
避免使用硬编码数值
建议使用宏或则参数来定义常数,避免使用硬编码数值。
硬编码数值法:
input input [31:0] [31:0] data_a; data_b; // 输入比较数据A // 输入比较数据B
提高代码的可读性, 便于维护和修改。 参数定义法:
parameter DATA_WIDTH = 32; // 总线数据宽度 input [DATA_WIDTH-1:0] data_a; // 输入比较数据A input [DATA_WIDTH-1:0] data_b; // 输入比较数据B
注释 代码格式
命名字符集
用于命名的字符集为:字母A~Z和a~z, 数字 0~9以及下划线组成。
例如: data_bus data_width clk_48M 48M_clk data__bus data*bus
数据总线 使用有意义的名 字,以利于望文 数据位宽 生义 48M时钟信号
名称不能以数字开头 不能连续使用下划线 不能包含非字母符号*
输入信号 输入信号
参数
不同类型的信号命名习惯
如果一个名字由多个字组成,则使用下划线连接,用 以增加名字的可读性。为了使信号的名字有意义,可以 根据信号类型选取相应的后缀。
命名 *_r *_a *_clk *_nc *_n *_pn *_z *_next *_test 信号类型 寄存器类型 异步信号 时钟信号 不连续信号 低电平有效信号 有n个相位的信号 三态信号 状态机信号 测试模式信号 实例 Data_out_r Addr_strobe_a Sys_clk Stata_nc Reset_n Enable_p2 Data_out_z Transmit_next Parallel_clk_test
input a; input State; input [2:0] state; output dout; reg dout; parameter STATE = 3'bx11; always @(a or b or state) case(state & State) 3'b001: dout=a&b; 3'b010: dout=a|b; endcase endmodule
相关文档
最新文档