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

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

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不作要求。

硬件描述语言篇Verilog HDL代码规范

硬件描述语言篇Verilog HDL代码规范

手把手教你学习FPGA系列教程硬件描述语言篇之Verilog HDL代码规范1.代码规范目的本规范的目的是提高书写代码的可读性、可修改性、可重用性,优化代码综合和仿真的结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范可编程技术的VerilogHDL设计输入,从而做到:1.逻辑功能正确,2.提高整洁度,3.便于跟踪、分析、调试,4.增强可读性,帮助阅读者理解,5.便于程序维护,6. 便于整理文档,7. 便于交流合作。

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

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

3.代码规范内容3.1标准的文件头在每一个版块的开头一定要使用统一的文件头,其中包括作者名,模块名,创建日期,所属项目,概要,更改记录,版权等必要信息。

3.2标准的module 格式(1)module例化名用xx_u标示(多次例化用次序号0,1,2…)。

(2)建议每个模块加timescale。

(3)不要书写空的模块,即一个模块至少要有一个输入一个输出。

(4)为了保持代码的清晰、美观和层次感,一条语句占用一行,每行限制在80个字符以内,如果较长则要换行。

(5)采用基于名字(name_based)的调用而非基于顺序的(order_based)的调用。

(6)模块的接口信号按输入、双向、输出顺序定义。

(7)使用降序定义向量有效位顺序,最低位是0。

(8)管脚和信号说明部分,一个管脚和一组总线占用一行,说明清晰。

(9)在顶层模块中,除了内部的互联和module的例化外,避免再做其他逻辑。

(10)为逻辑升级保留的无用端口以及信号要注释。

(11)建议采用层次化设计,模块之间相对独立。

3.3命名规则(1)每个文件只包含一个module,module名要小写,并且与文件名保持一致。

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;

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编码规范(仅供内部使用)拟制: 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编程规范

用于命名的字符集为:字母A ~Z 和a ~z,数字0~9以及下划线组成。

例如:data_busdata_widthclk_48M48M_clkdata__busdata*bus 命名字符集名称不能以数字开头数据总线48M 时钟信号数据位宽不能连续使用下划线不能包含非字母符号*使用有意义的名字,以利于望文生义参数(parameter )、常量(constant )和块标号(block label )名必须一致采用大写;而信号,变量和结构名(construct )以及实例标号(instance )必须一致采用小写。

有利于在仿真时,区分不变和变化的数据。

大小写规则module display_led(clk_48M,//时钟ledout//LED 输出);input clk_48M;//48M 系统时钟output [7:0] ledout;//LED 输出控制reg [22:0] count;//计数器reg [7:0] led_reg;//LED 输出缓存区wire led_clk;//LED 显示时钟控制parameter COUNTER=100;assign led_clk = count[22]; //LED 显示时间控制模块标号小写变量小写常量大写在不区分大小写的情况下,名字必须唯一。

例如,名字state和State不能同时出现在同一设计中,这是因为有的EDA工具不区分大小写。

名字必须唯一module casestatement (a,State,state,dout);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;endcaseendmodule 输入信号参数输入信号不同类型的信号命名习惯如果一个名字由多个字组成,则使用下划线连接,用以增加名字的可读性。

Verilog代码规范

Verilog代码规范
IF ELSE 结构综合的结构可能是与或非门构成的,也可能是一组多路选择器,而 case 结构综合结果一般会是多路选择器,但对于可以优化的 case 综合工具会综合出更简单的结 构。
switcher
sf
Switch fabric
temporary transmit
tmp
临时
tx
发送(帧数据)相关
Valid wr enable
write
vld(v) wen wr
有效、校验正确 写使能 写操作
a. 端口、信号、变量名的所有字母小写:函数名、宏定义、参数定义用大写 b. 使用简称、缩略词(加上列表) c. 基于含义命名(避免以数字命名的简单做法),含义可分段(最多分三段),每一小
端口定义按照输入,输出,双向的顺序: 模块名、模块例化名统一,例化名前加大写 U_以区分 ( 多次
例化另加标识 ),三者关系: 文件名 :xxx .v (小写)
模块名 :XXX (大写) 例化名 :U_XXX (大写) IP 内 部 所 有 的 模 块 名 都 要 加 IP 名 或 者 IP 名 简 称 作 前 缀 , 如 USB_CTRL 、 USB_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
C. 赋值要指明比特宽度 赋值或者条件判断时要注明比特宽度,注意表达式的位宽匹配。如:

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语言编写规范1 目的本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真结果,指导设计工程师使用VerilogHDL规范代码和优化电路 ,规范化公司的ASIC设计输入从而做到1. 逻辑功能正确2.可快速仿真3. 综合结果最优如果是hardware model4. 可读性较好;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 + 1MemI<= 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_addr7:2 这里的 D 指明了地址是解码模块Decoder module中的地址.6. 同一信号在不同层次应保持一致性7. 自己定义的常数类型等用大写标识如: parameter CYCLE=100.8.避免使用保留字如 in out x z等不能够做为变量端口或模块名9. 添加有意义的后缀使信号名更加明确常用的后缀如下芯片的双向信号 -xbio芯片的三态输出 _xz芯片的漏极开路输出 _xod芯片原始输出信号 _xo芯片原始输入信号 _xi下降沿有效的寄存器 _f连到三态输出的信号 _z寄存前的信号 _next时钟信号 _ClkModules1.顶层模块应只是内部模块间的互连Verilog设计一般都是层次型的设计, 也就是在设计中会出现一个或多个模块, 模块间的调用在所难免; 可把设计比喻成树, 被调用的模块就是树叶, 没被调用的模块就是树根, 那么在这个树根模块中, 除了内部的互连和模块的调用外, 尽量避免再做逻辑, 如:不能再出现对reg变量赋值等, 这样做的目的是为了更有效的综合, 因为在顶层模块中出现中间逻辑 ,Synopsys 的design compiler 就不能把子模块中的逻辑综合到最优;2. 每一个模块应在开始处注明文件名功能描述引用模块设计者设计时间及版权信息等如 / =========================== \Filename ﹕Author ﹕whqDescription ﹕File descriptionCalled by ﹕Top moduleRevision History ﹕time yy-mm-ddRevisionEmailCopyrightc1999,~~~~~~~~~~~~~ ,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_RSTReset,Clk,Data,Qout;严格芯片级模块的划分只有顶层包括IO引脚pads, 中间层是时钟产生模块, JTAG, 芯片的内核CORE,这样便于对每个模块加以约束仿真, 对时钟也可以仔细仿真;模块输出寄存器化对所有模块的输出加以寄存如图1 使得输出的驱动强度和输入的延迟可以预测, 从而使得模块的综合过程更简单- 输出驱动的强度都等于平均的触发器驱动强度图19.将关键路径逻辑和非关键路径逻辑放在不同模块保证DC可以对关键路径模块实现速度优化, 而对非关键路径模块实施面积优化在;同一模块DC无法实现不同的综合策略,将相关的组合逻辑放在同一模块,有助于DC对其进行优化因为DC通常不能越过模块的边界来优化逻辑;Net and Register1. 一个reg变量只能在一个always语句中赋值2. 向量有效位顺序的定义一般是从大数到小数尽管定义有效位的顺序很自由, 但如果采用毫无规则的定义势必会给作者和读代码的人带来困惑 ,如 Data-4: 0, 则 LSB0-1-2-3-4MSB, 或 Data0: 4 则LSB43210MSB 这两种情况的定义都不太好, 推荐Data4: 0这种格式的定义;3.对net和register类型的输出要做声明在PORT中;如果一个信号名没做声明 Verilog 将假定它为一位宽的wire变量;4. 线网的多种类型; 寄存器的类型;Expressions1. 用括号来表示执行的优先级尽管操作符本身有优先顺序, 但用括号来表示优先级对读者更清晰, 更有意义;If alpha < beta && gamma >= delta.... 比下面的表达更合意2. 用一个函数function来代替表达式的多次重复如果代码中发现多次使用一个特殊的表达式 ,那么就用一个函数来代替, 这样在以后的版本升级时更便利, 这种概念在做行为级的代码设计时同样使用, 经常使用的一组描述可以写到一个任务task中;IF 语句1. 向量比较时比较的向量要相等当比较向量时 verilog将对位数小的向量做0 扩展以使它们的长度相匹配它的自动扩展为隐式的建议采用显示扩展这个规律同样适用于向量同常量的比较Reg Abc7:0;Reg Bca3:0;......If Abc= = {4’b0, Bca}begin.......If Abc= = 8’b0 begin2. 每一个If 都应有一个else 和它相对应在做硬件设计时, 常要求条件为真时执行一种动作而条件为假时执行另一动作即使认为条件为假不可能发生, 没有else可能会使综合出的逻辑和,RTL级的逻辑不同;如果条件为假时不进行任何操作, 则用一条空语句;always Condbeginif CondDataOut<= DataIn;End3. 应注意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; case语句通常综合成一级多路复用器图的右边部分, 而if-then-else则综合成优先编码的串接的多个多路复用器, 如图的左边部分通常使用case 语句要比if 语句快, 优先编码器的结构仅在信号的到达有先后时使用; 条件赋值语句也能综合成多路复用器, 而case 语句仿真要比条件赋值语句快;2 所有的Case 应该有一个default case允许空语句Default : ;Writing functions1. 在function的最后给function赋值Function CompareVectors; 函数中避免使用全局变量否则容易引起HDL行为级仿真和门级仿真的差异;如function ByteCompareinput 15:0 Vector1input 15:0 Vector2input 7:0 Lengthbeginif ByteSelVerilog 支持两种赋值过程赋值procedural 和连续赋值continuous;; 过程赋值用于过程代码 initial, always, task or function 中给reg 和 integer 变量tim\realtimereal赋值, 而连续赋值一般给wire 变量赋值;2. Always 敏感表敏感表要完整, 如果不完整, 将会引起仿真和综合结果不一致always d or Clrif Clrq = 1'b0;else if eq = d;以上语句在行为级仿真时e的变化将不会使仿真器进入该进程,导致仿真结果错误3. Assign/deassign 仅用于仿真加速仅对寄存器有用4. Force/release 仅用于debug 对寄存器和线网均有用5. 避免使用Disable6.对任何reg赋值用非阻塞赋值代替阻塞赋值 reg 的非阻塞赋值要加单位延迟但异步复位可加可不加 =与 =的区别Always posedge Clkor negedge Rst_BeginIf Rst_ Combinatorial Vs Sequential Logic1. 如果一个事件持续几个时钟周期 ,设计时就用时序逻辑代替组合逻辑;如 Wire Ct_24_e4; Last over several clock cyclesAssign Ct_24_e4= count8bit7:0>= 8’h24 & count8bit7:0<= 8’he4;那么这种设计将综合出两个8 比特的加法器而且会产生毛刺, 对于这样的电路, 要采用时序设计, 代码如下;Reg Ct_24_e4;Always poseddge Clk or negedge Rst_BeginIf Rst_Ct_24_e4<= 1’b0;Else if count8bit7:0= = 8’he4Ct_24_e4<= u_dly1’b0;Else if count8bit7:0= = 8’h23Ct_24_e4<= u_dly1’b1;Esle;2. 内部总线不要悬空在default状态要把它上拉或下拉Wire OE_default;Assign OE_default= oe1| oe2| oe3;Assign bus31:0= oe1 Data131:0:oe2 Data231:0:oe3 Data331:0:oe_default 32’h0000_0000 :32’hzzzz_zzzz;为了保持代码的可读性, 常用“`define”做常数声明2. 把“`define”放在一个独立的文件中参数 parameter 必须在一个模块中定义, 不要传替参数到模块仿真测试向量例外“`define”可以在任何地方定义, 要把所有的“`define”定义在一个文件中. 在编译原代码时首先要把这个文件读入, 如果希望宏的作用域仅在一个模块中, 就用参数来代替;对更新的内容更新要做注释2. 在语法块的结尾做标记..End ..End ..Endfunction每一个模块都应在模块开始处做模块级的注释, 参考前面标准模块头;4. 在模块端口列表中出现的端口信号都应做简要的功能描述;VerilogHDL状态机的状态分配;VerilogHDL描述状态机时必须由parameter分配好状态,这与VHDL不同 VHDL状态机状态可以在综合时分配产生;2. 组合逻辑和时序逻辑分开用不同的进程组合逻辑包括状态译码和输出, 时序逻辑则是状态寄存器的切换;3. 必须包括对所有状态都处理, 不能出现无法处理的状态, 使状态机失控;4. Mealy机的状态和输入有关,而Moore机的状态转换和输入无关Mealy 状态机的例子如下:...reg CurrentState, NextState, Out1;Parameter S0=0,S1=1;always posedge Clkor negedge Rst_在for-loop中包括不变的表达式浪费运算时间for i=0;i<4;i=i+1beginSig1= Sig2;DataOuti= DataIni;endfor-loop中第一条语句始终不变,浪费运算时间.2. 资源共享问题条件算子中不存在资源共享如z = cond a + b : c + d;必须使用两个加法器;而等效的条件if-then-else语句则可以资源共享如:if Condz = a + b;elsez = c + d;只要加法器的输入端复用,就可以实现加法器的共享,使用一个加法器实现3. 由于组合逻辑的位置不同而引起过多的触发器综合如下面两个例子moduleCOUNT AndBits, Clk, Rst;Output Andbits;Input Clk,Rst;Reg AndBits;4. 谨慎使用异步逻辑module COUNT Z, Enable, Clk, Rst;Output 2:0 Z;Input Rst,Enable,Clk;reg2:0 Z;always posedge Clkbeginif RstbeginZ <= u_dly1'b0;endelse if Enable == 1'b1 beginIf Z == 3'd7 beginZ <= u_dly1'b0;Endelse beginZ <= u_dlyZ + 1'b1;endEndElse ;End际的运用中要加以避免.module COUNT Z, Enable, Clk, Rst;Output 2:0 Z;Input Rst,Enable,Clk;Reg 2:0 Z;对组合逻辑的描述有多种方式 ,其综合结果是等效的c = a &b;等效于c3:0 = a3:0 & b3:0;等效于c3 = a3 & b3;c2 = a2 & b2;c1 = a1 & b1;c0 = a0 & b0;等效于for i=0; i<=3; i= i+ 1ci= ai& bi;可以选择简洁的写法.6. 考虑综合的执行时间通常会推荐将模块划分得越小越好, 事实上要从实际的设计目标面积和时序要求出发好的时序规划和合适的约束条件要比电路的大小对综合时间的影响要大, 要依照设计的目标来划分模块, 对该模块综合约束的scripts也可以集中在该特性上, 要选择合适的约束条件, 过分的约束将导致漫长的综合时间最好在设计阶段就做好时序规划通过综合的约束scripts来满足时序规划 ;这样就能获得既满足性能的结果, 又使得综合时间最省, 从代码设计讲 500~5000行的长度是合适的;7. 避免点到点的例外所谓点到点例外 Point-to-point exception 就是从一个寄存器的输出到另一个寄存器的输入的路径不能在一个周期内完成多周期路径就是其典型情况, 多周期路径比较麻烦在静态时序分析中要标注为例外, 这样可能会因为人为因素将其他路径错误地标注为例外, 从而对该路径没有分析造成隐患避免使用多周期路径 ;如果确实要用, 应将它放在单独一个模块, 并且在代码中加以注释;8. 避免伪路径False path伪路径是那些静态时序分析 STA 认为是时序失败, 而设计者认为是正确的路径; 通常会人为忽略这些warning, 但如果数量较多时, 就可能将其他真正的问题错过了;9. 避免使用Latch使用Latch 必须有所记录, 可以用All_registers -level_sensitive 来报告设计中用到的Latch; 不希望使用Latch时, 应该对所有输入情况都对输出赋值, 或者将条件赋值语句写全, 如在if语句最后加一个else, case语句加defaults;当你必须使用Latch时, 为了提高可测性, 需要加入测试逻辑;不完整的if和case语句导致不必要的latch的产生, 下面的语句中, DataOut会被综合成锁存器; 如果不希望在电路中使用锁存器, 它就是错误;always Condbeginif CondDataOut<= DataInend10. 避免使用门控时钟使用门控时钟Gated clock不利于移植, 可能引起毛刺, 带来时序问题, 同时对扫描链的形成带来问题; 门控钟在低功耗设计中要用到, 但通常不要在模块级代码中使用; 可以借助于Power compiler来生成, 或者在顶层产生;11. 避免使用内部产生的时钟在设计中最好使用同步设; 如果要使用内部时钟, 可以考虑使用多个时钟; 因为使用内部时钟的电路要加到扫描链中比较麻烦 ,降低了可测性, 也不利于使用约束条件来综合;12. 避免使用内部复位信号模块中所有的寄存器最好同时复; 如果要使用内部复位, 最好将其相关逻辑放在单独的模块中, 这样可以提高可阅读性;13. 如果确实要使用内部时钟, 门控时钟, 或内部的复位信号将它们放在顶层将这些信号的产生放在顶层的一个独立模块这样所有的子模块分别使用单一的时钟和复位信号一般情况下内部门控时钟可以用同步置数替代例如:module COUNT Reset Enable Clk Qout module COUNT Reset EnableClk Qoutinput Reset Enable Clk input Reset Enable Clkoutput 2:0 Qout output 2:0 Qoutreg2:0 Qout reg2:0 Qoutwire GATED_Clk= Clk& Enable always posedge Clkbeginif Reset beginalways posedge GATED_Clkor posedgeReset Qout= 1'b0begin endif Reset begin else if Enable == 1'b1 beginQout= 1'b0 if Qout== 3'd7 beginend Qout= 1'b0else begin endif Qout== 3'd7 begin else beginQout=1'b0 Qout= Qout+ 1'b1end endelse begin endQout= Qout+ 1'b1 endend endmoduleendendendmodule6 附录Module 编写示例/ \Filename ﹕Author ﹕Description ﹕Called by ﹕Revision History ﹕mm/dd/yyRevisionEmail ﹕Company ﹕ HuaweiTechnology .IncCopyrightc1999, HuaweiTechnology Inc,All right reserved \ /Module module_nameOutput_ports,.;Module_name2 Uinstance_name2...;lkClk, .CLRZClr, .DData, .out;.EndlockClock,.ResetReset,.QoutQout;initialbeginClock = 1'b0;Reset =1'b1;5CYCReset = 1'b0;5CYCReset = 1'b1;5000CYC$fclosefout;$finish;endinitialbegin$shm_open"";$shm_probe"AS";fout=$fopen"";endalways CYCClock = ~ Clock;//输出数据到文件always posedgeClockbegin$fwritefout,"%d %b\n",Qout,Qout;endendmodulea ;在testbench 中避免使用绝对的时间, 如20,15 或CYC+15 等, 应该在文件前面使用parameter定义一些常量,使得时间的定义象CYC+OFF0的形式,便于修改;b ;观测结果可以输出到波形文件或数据文件生成波形文件可以用simwave观测结果比较直观而生成数据文件则既可以快速定位也可以通过编写的小程序工具对它进行进一步的处理;c ;对大的设计的顶层仿真一般不要对所有信号跟踪波形文件会很大仿真时间延长可以有选择的观测一些信号;。

Verilog 代码编写规范

Verilog 代码编写规范

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

比较著名的信号命名规则当推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代码书写规范

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

Verilog编码规范(仅供内部使用)拟制: xxx 日期:xxx审核: 审核者日期:yyyy-mm-dd 批准: 批准者日期:yyyy-mm-dd版权所有侵权必究修订记录修订日期修订版本描述修订者目录1命名规范........................................................ 2代码编写规范....................................................2.1 版面......................................................2.2 编写代码规范.............................................. 3电路设计规则....................................................3.1 时钟......................................................3.2 复位......................................................3.3 避免LATCH.................................................3.4 避免组合反馈..............................................3.5 赋值语句..................................................3.6 case语句和if-then-else语句...............................3.7 状态机....................................................3.8 异步逻辑.................................................. 4模块划分........................................................ 5提高可移植性的编码风格..........................................5.1 采用参数化设计............................................5.2 采用独立于工具平台和工艺库的设计..........................5.3 尽量使用已经得到验证的IP.................................. 6其他一些设计建议................................................ 7附件............................................................ 8参考文档:......................................................基本原则:简单,一致,可重用。

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

verilog语言代码设计规范2011年12月目录一、规范适用范围 ------------------------------------------------------------------------ 41.1项目适用范围------------------------------------------------------------------------------------- 41.2人员适用范围------------------------------------------------------------------------------------- 41.3编码设计的成果形式 --------------------------------------------------------------------------- 4二、代码书写规范 ------------------------------------------------------------------------ 52.1模块说明书写规范------------------------------------------------------------------------------- 52.1模块注释书写规范------------------------------------------------------------------------------- 52.3变量名称书写规范------------------------------------------------------------------------------- 62.4代码结构书写规范------------------------------------------------------------------------------- 7三、使用verilog语言的语法范围----------------------------------------------------- 83.1设计RTL代码的语法范围 -------------------------------------------------------------------- 83.2设计仿真代码的语法范围 -------------------------------------------------------------------- 10四、使用verilog语言的结构范围---------------------------------------------------- 114.1系统设计文件的形式与使用方法----------------------------------------------------------- 114.2模块结构划分的标准 -------------------------------------------------------------------------- 124.3组合逻辑的代码风格 ------------------------------------------------------------------------ 134.4时序逻辑的代码风格 -------------------------------------------------------------------------- 214.5仿真代码的代码风格 -------------------------------------------------------------------------- 27五、使用受限范围内的语法或结构要进行的申请过程-------------------------- 325.1受限的语法与结构------------------------------------------------------------------------------ 325.2批准使用的程序--------------------------------------------------------------------------------- 32二、代码书写规范2.1模块说明书写规范在开始子模块设计时,必须对子模块的基本信息给予说明。

说明的位置一般在设计的开头,使用注释的形式用(/* */)说明该设计的作者、编写日期、版本号、在系统中的层次位置、基本功能描述等。

其形式如下所示:说明的内容要简洁清晰。

使用/* */对将说明部分括起来是为了与普通注释相区别。

2.1模块注释书写规范注释对项目团队关于设计的交流至关重要,好的设计总是会在恰当的地方对语句或变量予以说明,没有注释的设计不是真正的工业级设计,通篇的注释同没有注释一样糟糕,会将代码淹没在无用的注释之中。

这一节给出书写注释的规范。

如果设计中出现了一个新的变量,那么必须对这个新变量给予注释,对变量的注释应该放在变量的定义之前,注释应该说明变量的物理意义或作用。

其形式如下:如果设计中的某块结构属于作者的创新或设计中很关键的部分,作者应该对这种结构的物理含义予以简要说明。

注释在语句或结构的前一行开始写如:2.3变量名称书写规范verilog语言规定了各种类型的标志符的格式,作为规范我们对用户自定义的各种变量的命名方法及书写格式加以约束。

变量一般指模块(或设计)名、端口名、连线名、参照名、单元名以及内部寄存器名。

首先变量名必须能表达实际的物理意义,如果需要几个单词来表示,那么单词之间用一个“_”分隔。

变量名不宜过长,一般不要超过16个字符否则书写的效率会下降,因此变量名应该尽量使用单词的缩略写法,完整的含义应在注释中给予说明。

我们规定常量参数一律使用大写字母表示,变量的名称一律用小写字母a~z、数字0~9或下划线_表示,变量首字符一律用字母。

模块名(或设计名)应该与文件名一致,一个文件只应包含一个模块。

它是模块功能的缩略表达。

端口名应与该端口实际的物理意义相一致。

连线是对内部单元(实例)引脚间进行连接的物理线或是对组合逻辑输出端口、组合逻辑单元输出端进行赋值运算的输入线。

连线名应该有确定的连接对象或是有确定的信号物理意义,所以针对单元引脚连接的连线它的名称应该表明所连接单元的名称,如timing_alu表示时序发生器发出的控制信号连接ALU部件的控制端。

针对为输出端做赋值运算的输入连线它的名字应该表达相应的物理意义,绝不要使用通用名如:a,b,c这样的名字。

这类连线适当的名称如:add_a,add_b。

参照名就是一个单元或实例参考的库标准单元或原始设计名,所以它的名字与库单元或模块名相同。

单元与实例在synopsys的DC工具中是不加区分的,这里也等同看待,它的名字可以用参照名为头后加数字予以标识。

如alu1、acc1等。

如果设计的内部有中间级寄存器,那么寄存器以实际的物理意义进行命名,比如在乘法器中为分割关键路径引入的中间级寄存器可以命名为pipeline1_out等。

2.4代码结构书写规范好的代码结构可以清晰的看出设计的层次关系,进而使结构与设计者所要表达的逻辑意图一致,方便纠错和交流。

代码最基本的结构有平行结构和层次结构,他们反映了代码的隶属关系,我们规定注释语句与语句块是一个层次的,这意味着对模块的注释行(以//开头)必须在一行的顶头开始写。

其他语句的层次低于模块定义和注释,那么其他语句至少要向后缩退四个空格。

语句块中的语句低于语句块的定义,例如:always @(posedge clk)beginout <= in;end//end always语句块中的语句块和其他语句是同级的。

语句块结束应该有注释说明结束的语句块的名称例如:always @(posedge clk1 negedge clear)beginif(!clear)beginout <= 6'b000000;endelsebegincase(addr)`SFR_A:beginout <= in;end……endcaseendend三、使用verilog语言的语法范围3.1设计RTL代码的语法范围verilog语言是一种通用的HDL(硬件描述语言),它的语法范围包括了用户各种设计层级的需求,虽然语言本身对这种层级并没有细致的区分,但因为设计者编写的代码最终要使用具体的综合工具综合成实际电路,所以语言层级的划分不可避免的具有针对某种工具的特点,我们这里的划分依据是根据DesignCompile综合工具来定的。

在论述的过程中我们常使用左值和右值的称谓,一般我们将赋值运算符左侧的变量称作左值,右侧的变量称作右值,因此左值具有位置属性而右值具有数值属性。

右值的任何地方禁止出现“x”,左值在任何情况下不可以为常量。

在有些环境中也将左值称做写数据,右值称做读数据。

在一个语句块中不可对同一个左值赋两次值,因为这样会引起数据冲突(三态门除外)。

verilog语言可以描述四个设计层级的语法范畴,依次是:系统行为级、模块寄存器传输级(RTL)、电路门级、晶体管开关级。

层级之间的转换我们称之为综合。

目前业界的流行的做法是前端设计将RTL级综合为门级网表。

行为级到门级的直接综合还不成熟,另外,数字电路中的晶体管我们一般当作开关来对待,因此对它们具体的器件特性描述,并不是针对数字电路设计的verilog语言所能及的。

系统行为级描述一般作为系统设计的辅助手段或建立系统仿真环境的语言实现手段,在系统设计时,设计人员一般使用行为级描述来建立系统数据流的直观表述,以助选定设计方案,划分系统层次、确定模块接口等。

这个级别是设计的最高抽象层,它不考虑设计的具体实现,只是确定实现的可行性,和估计实现的规模,因此系统设计时系统行为级描述不限制语言的种类,可以用verilog也可用System C甚至C语言,它们只是帮助系统设计人员最终得到系统各个模块的端口列表和层级子模块明确的功能定义。

有些项目使用层级关系的原理图来说明系统结构,子模块使用黑盒来代替。

一些小项目这个过程可以省略直接由编码人员来实现。

行为级描述也可以建立系统的仿真环境,它也是实际工作中行为级最重要的作用。

这时一般将被仿真的模块作为实例,仿真环境为实例提供各种输入向量,设计人员观察输出结果分析被测实例的功能正确与否,如有错误可以定位错误以便修正。

HDL的寄存器传输级(RTL)一般用于对电路子模块的描述,它一般由四种基本结构组成:寄存器、计数器、选择器、算术逻辑运算单元。

相关文档
最新文档