[VHDL+Verilog]良好的代码编写风格(二十五条)
Verilog+HDL+代码风格规范
读使能 读
准备好 接收 请求 复位
片段 节 源 统计 定时 转换
临时的 发送 有效
写使能 写操作
b) 模块规范
模块的命名尽量用英文表达出其完整的功能,长度一般不少于 2 个字母。 1. 每文件最多只能包含一个模块。 每个模块必须用一个文件表示。在一个文件中不允许存在一个以上的模块。(该模块的
作者 frwfpga frwfpga
2014-11-29
版权所有 侵权必究
2
XXX Verilog HDL 代码规范
目录
Verilog HDL 代码规范......................................................................................................................1 修订记录........................................................................................................................................... 2 目录 ..................................................................................................................................................3 1. 目的...........................................................................................................................................4 2. 范围...........................................................................................................................................4 3. 定义...........................................................................................................................................4 4. 规范内容...................................................................................................................................4
VHDL语言编写规范
VHDL语言编写规范VHDL语言编写规范目录目录 (1)1 目的 (2)2 范围 (2)3 定义 (2)4 规范内容:VHDL编码风格 (2)4.1 标识符(Identifiers)命名习惯 (2) 4.2 数据对象和类型 (4)4.3 信号和变量 (5)4.4 实体 (5)4.5 语句 (7)4.6 运算符(Operator) (10)4.7 function (10)4.8 procedure (11)4.9 类属( generics) (11)4.10 package (12)4.11 FSM(有限状态机) (12)4.12 Comments (12)4.13 TAB键间隔 (12)4.14 语句书写规范规定 (13)5 程序中的注释 (13)6 代码模块划分 (14)7 代码编写中容易出现的问题 (15)7.1 资源共享问题 (15)7.2 组合逻辑描述的多种方式 (15)7.3 考虑综合的执行时间 (16)7.4 避免使用Latch (16)7.5 多赋值语句案例:三态总线 (16)附录一VHDL保留字 (18)附录二函数书写实例 (19)附录三参数化元件实例 (20)附录四程序包书写实例 (21)1 目的编写该规范的目的是提高书写VHDL代码的可读性、可修改性、可重用性;优化代码综合和仿真结果,指导设计工程师使用VHDL 规范代码和优化电路,规范化公司的ASIC/FPGA 设计输入,从而做到:a、逻辑功能正确;b、可快速仿真;c、综合结果最优;d、可读性最好。
2 范围该规范设计VHDL编码风格、规定,编码中应注意的问题,VHDL 代码书写范例等,适用于所有的采用VHDL代码进行设计的项目。
3 定义VHDL:Very high speed IC Hardware Description Language,甚高速集成电路的硬件描述语言。
FSM:Finite Status Machine,有限状态机Simulate:仿真,通过输入激励在计算机上验证设计是否正确。
第8讲 VHDL的描述风格
关于信号与变量
结构描述
VHDL 结构型描述风格是基于元件例化语句或生成 语句的应用,利用这种语句可以用不同类型的结构来完 成多层次的工程,即从简单的门到非常复杂的元件,包 括各种已完成的设计实体子模块来描述整个系统。 结构描述就是表示元件之间的互连这种描述,允许 互连元件的层次式安置像网表本身的构建一样。
ARCHITECTURE STRUCTURE OF COUNTER3 IS COMPONENT DFF PORT(CLK, DATA: IN BIT; Q: OUT BIT); END COMPONENT; COMPONENT AND2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT OR2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT NAND2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT XNOR2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT INV PORT(I: IN BIT; O: OUT BIT); END COMPONENT; SIGNAL N1, N2, N3, N4, N5, N6, N7, N8, N9: BIT;
层次化设计
详细地定义设计中的模块,使多个设计 者之间并行工作 对于每个模块,便于减少错误和Debug 可对每个模块单独仿真 分阶段完成设计
层次化设计举例
LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY BCD_Disply IS PORT ( Clrn,Clk : IN STD_LOGIC; s1,s0 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ; END ; ARCHITECTURE one OF BCD_Disply IS COMPONENT cnt10 PORT(Clrn,Clk: IN STD_LOGIC; q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); Co : OUT STD_LOGIC); END COMPONENT; COMPONENT decl7s PORT ( a : IN STD_LOGIC_VECTOR(3 DOWNTO 0); Led : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ; END COMPONENT;
数字设计中的Verilog编程技巧
数字设计中的Verilog编程技巧在数字设计中,Verilog是一种常用的硬件描述语言,广泛应用于数字集成电路设计和仿真中。
Verilog编程技巧对于提高设计效率、优化性能和减少错误至关重要。
下面我将介绍几种Verilog编程技巧,帮助您更好地应用Verilog进行数字设计。
首先,合理使用模块化设计。
在Verilog中,模块是设计的基本单元,将复杂系统划分为多个模块可以提高可维护性和复用性。
因此,在设计过程中应该遵循模块化设计原则,将功能模块化、分层和相互独立。
其次,正确使用参数化。
在Verilog中,参数化是指通过参数来描述模块或信号的行为。
合理使用参数可以提高代码的灵活性和可复用性。
通过定义参数,可以轻松地调整模块的行为,使得代码更加通用和易扩展。
此外,熟练掌握Verilog中的时序控制。
时序控制是Verilog设计中的关键部分,用于描述时序逻辑和时序行为。
在设计过程中,需要注意时钟的约束和时序分析,确保设计的正确性和稳定性。
可以使用时钟域划分、时钟同步等技术来解决时序问题。
另外,注意Verilog中的模拟和仿真。
在数字设计中,模拟和仿真是验证设计正确性的重要步骤。
Verilog提供了Simulator工具,可以进行行为级仿真和波形仿真。
通过模拟和仿真可以验证设计是否符合预期,发现和修复设计中的问题。
最后,关注Verilog中的调试和优化。
在设计过程中,经常需要进行调试和优化,以确保设计满足性能和功耗要求。
Verilog提供了一些调试和优化技术,如添加断点、查看波形、进行逻辑分析等。
通过调试和优化可以找到设计中的问题,并对设计进行改进。
总的来说,Verilog编程技巧对于数字设计至关重要。
通过合理的模块化设计、参数化、时序控制、模拟和仿真、调试和优化,可以提高设计效率、优化性能和减少错误。
希望以上介绍的Verilog编程技巧能够帮助您在数字设计中取得更好的结果。
祝您在Verilog编程中取得成功!。
verilog语言编码风格
2.6
状态机编码设计风格 ....................................................................................... 16
2.6.1
几种编码方式 ..................................................................................... 16
1.3.3
函数和任务............................................................................................ 5
1.3.4
变量 ......................................................................................................... 5
2.4.1
敏感表的使用 ....................................................................................... 8
2.4.2
赋值 ......................................................................................................... 9
2.4.3 if 语句.......................................................................................................... 12
论VHDL语言的程序结构和描述风格
图4结构化描述法 的VHDL程序示 例 4.3结构( st r uc t ur al ) 描述
VHDL结构描述即逻辑元器件的连接描述, 它采用 并行处理 语句描述 设计实体 内的结构 组织 和元件 互连关系 。构造体 的结构化 描述法是 数字 系统层次化设计[ 2] 中常用的一种方法,其主要特点 如下:
( Ar c hi t ec t ur e) 描述一个设计的结构或行为,建立 设计的输入与输出之间的逻辑关系;利用配置 ( Conf i gur at i on) 技术,可以选取不同的结构体,这 样就 可以对同 一设计 任务进行 多种配 置的性能 实 验, 从而 选取性 能最优 的逻辑 实现 。
I SEND
得无从下手。 硬件描述语言主要有两个方面的应用【l ~2] :用
文档 语言的 形式描 述数字 设计以 及用于 系统的 仿 真、验证和设计综合等。目前应用最广泛的主要有 两种语言:Ver i l og- HDL和VHDL。Ver i l og- HDL 是一 种专门 为复杂 数字逻 辑电路 和系统 的设计 仿 真而开发的HDL语言,也可以说Ver i l og-HDL是 在应用最广泛的C语言的基础上发展起来的一种 硬件描述语言,由Cader i ce 公司1990年公开,并成 立了OVI ( Open Ver i l ogI nt er n at i ona l ) 组织来负责 其发展。VHDI 。语言是在20世纪80年代后期由 美国国防部开发的,美国军方研制专用集成电路所 指定的硬件描述语言。这两种语言均是I EEE的 工业标准硬件描述语言,且得到众多EDA公司的 支持,在电子工程领域,已成为事实上的通用硬件 描述语言。本文主要讨论VHDL语言。
verilog的代码规范和coding风格
verilog的代码规范和coding风格想要成为一名优秀的数字IC设计工程师需要哪些基本的专业知识呢?如下:1.半导体物理学、半导体器件物理学、基本的固体物理、半导体工艺与制造等物理学知识;2.电路分析、模拟电子线路、COMS模拟集成电路、专用集成电路基础等模拟IC知识;3.信号系统、数字信号处理、信道编码、通信原理等通信知识;4.C语言、汇编、C++、脚本(shell、tcl、perl)、Linux(我觉得如果懂kernel那就更好了)、体系结构、组成原理等计算机知识;5.各种EDA和编程调试工具的使用Modelsim、Debussy、quartus ii、Cadence、DC、vim等等(就数字方向而言用的最多的5种左右,模拟另当别论);另外虚拟机什么的总得玩得转吧!6.当然最重要的还是我们亲爱的--verilog,不会verilog(当然VHDL也是一样的)那你会别的也算不上优秀的Digital IC Engineer!verilog语法并不复杂,只是初学者容易犯一些“类C”错误,总会不经意间将verilog写成了C语言,或者是没有使用并行思想,或者就是多处赋值等等问题。
如果我们克服了之前的一些小毛病,在这些之外,我们想更近一步提升自己的写代码水平、研发水平,而不是只做一个码农的话那么我们要做的就是:第一步:提高代码规范性,每个企业、研究所可能都有自己的一套代码书写规范,但是总的来说都有一些共性,而且往往这些共性的地方还特别多,一个没有代码规范的程序员不可能写出非常漂亮和优秀的程序,当然有了规范的代码后也不一定就能写出漂亮和优秀的程序,这是两码事。
代码规范之后的一个境界我觉得是优良的编程风格,编程风格不同于代码规范,编程风格在verilog中特别指代那些逻辑上的风格,同样的功能,使用不同的编程风格,代码综合面积可能是几倍的关系,这一点我深有体会,另外,人们不经意间的编码习惯可能会导致许多冗余代码,在verilog综合之后,这些冗余就会成为实实在在多出来的不必要的电路,他们或者是寄存器或者是没用的组合逻辑,虽然往往DC一类的综合工具会对代码综合进行优化,并且会根据综合脚本进行最大化的优化计算,但是工具毕竟是工具,他不可代替人类,很多冗余电路综合工具并没有办法进行优化,因为工具并不知道你的本意,也不可完全进行语意预测,而不必要的电路意味着更多的流片成本,更低的work效率和更多的功耗消耗,这些都不是我们想看到的,所以一个好的coding风格本身对于企业来说就是非常大的价值!!!当然我认为要培养良好的coding风格并不是一件容易的事,本身 verilog design == 电路设计,透过代码看电路这个能力并不是一蹴而就的,这需要我们的长期的学习和思考总结,就像模拟设计一样,往往这是一种经验!。
VHDL与Verilog语言
VHDL与Verilog语言VHDL(VHSIC hardware description language)和Verilog是用于电子系统设计的硬件描述语言(HDL)。
这两种语言被广泛应用于数字逻辑设计和仿真,以及硬件描述、验证和综合。
1. VHDL(VHSIC hardware description language)VHDL是一种结构化的硬件描述语言,最初由美国国防部高速集成电路计划办公室(VHSIC,Very High Speed Integrated Circuits)开发。
VHDL以其强大的功能和灵活性而闻名,并被广泛用于数字系统的设计和验证。
VHDL的编写包括实体(Entity)和体(Architecture)两个主要部分。
实体部分描述了数字系统的输入输出接口、信号和组件的声明,而体部分描述了实体的内部结构、信号处理和逻辑功能。
VHDL具有丰富的数据类型、运算符和控制结构,可以方便地描述数字电路的行为和结构。
它还提供了强大的仿真和验证功能,使设计人员能够在开发和测试阶段快速迭代和调试设计。
2. VerilogVerilog是一种硬件描述语言,最初由Gateway Design Automation公司(现在是Cadence Design Systems的一部分)开发。
Verilog以其简洁的语法和易学易用的特性而受到广泛欢迎,并成为工业界标准。
Verilog的设计由模块(Module)组成,每个模块描述了一个黑盒子,包含输入和输出端口以及内部的逻辑功能。
模块可以进行层次化组合,从而实现较复杂的系统级设计。
Verilog的语法类似于C语言,具有类似的数据类型、运算符和控制结构。
它还提供了时序建模的能力,使设计人员能够描述数字电路的时序行为。
3. VHDL与Verilog的比较VHDL和Verilog在语法和功能上有一些区别,但它们都可以用于数字电路的设计和仿真。
以下是它们之间的一些比较:3.1 语法风格VHDL采用结构化的编程风格,需要明确的体、过程和信号声明,可以更好地控制和描述系统的结构和行为。
VHDL代码规范
3
3.1
代码风格 .........................................................................................11
移植与可读性要求 ....................................................................................... 11
3.1.1 3.1.2 3.1.3 3.1.4 3.1.5
3.1.6 3.1.7 3.1.8 3.1.9
常数之间有确定的关系时,使用关系定义 ...............................................................12 定义地址时,使用基址+偏移方式 .............................................................................13 常数可能变动的情况下使用generic map方式传递,而不是在模块中定义 ...............13 表达式使用括号表示优先级 .......................................................................................13
3.2
3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9
语句使用 .......................................................................................................13
verilog编写风格
一、较为详细的注释;
如
二、分开注释外部I/O寄存器还是内部寄存器;
目的:在于为后面的同步时序提供基础,或者说其他类似的写法,比如二段式或三段式状态机的实现。
偏于维护,修改。
如
三、计数器或者说是分频器的实现。
最好将需要分配的状态值,用参数值来说明。
便于修改,阅读。
如:
四、状态机的标准符,标准字。
用独热码实现,(主要是为以后用FPGA实现大型工程养成练好习惯),当然,对于较小型的项目,能够用CPLD实现的,一般采用二进制编码或格雷码。
原因在于:FPGA属于触发器实现的,而CPLD主要是属于组合逻辑。
如:
五、状态机的写法:最佳采用二段式和三段式,包括同步时序的写法,主要是为了解决一段式所带来的可能出现毛刺的问题。
如:
六、标准位的设定,实现;主要用于状态机中得语句判断情况。
或者说是下一个状态来到的标准位。
如:
七、对于大型的工程一般采用原理图的形式实现其顶层的构架,其包括的各个模块,一般利用verilog语言实现,生成原理图文件。
这样的好处在于:便于多人的协作或者说是可以调用以前已经完成的模块。
节省开发时间,也便于修改。
原理图给人整体的效果更加直观。
FPGA代码编写风格规范
(24) 避免冗长的逻辑和子表达式;
(25) 避免采用内部三态电路,建议用多路选择电路代替内部三态电路。
(8) 当描述多比特总线时,使用一致的定义顺序,对于verilog建议采用bus_signal[x:0]的表示;
(9) 尽量遵循业界已经习惯的一些约定。如*_r表示寄存器输出,*_a表示异步信号,*_pn表示多周期路径第n个周期使用的信号,*_nxt表示锁存前的信号,*_z表示三态信号等;
(10) 在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;
(19) 对一些重要的always语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复;
(20) 代码编写时的数据类型只使用IEEE定义的标准类型,在VHDL语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE的标准;
(21) 在设计中不要直接使用数字,作为例外,可以使用0和1。建议采用参数定义代替直接的数字。同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;
(11) 使用适当的注释来解释所有的always进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;
VHDL代码书写规范
VHDL代码书写规范(定稿)文件编号:编制:审核:可靠性审核:标准化:批准:文件会签页文件历史记录文件编号现行版本V1.0 文件标题VHDL代码书写规范文件履历版次编制日期更改内容(条款)V1.0V1.0目录1.目的 (1)2.范围 (1)3.术语说明 (1)4.书写规范 (1)4.1命名规范 (1)R1.一个文件只包含一个模块,文件命名和实体命名必须相同。
文件名大写,其后缀小写。
(1)R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。
顶层文件的元件实例化,后缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的名称) (1)R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。
(2)R4.命名要有实际意义。
(2)R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。
信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。
(2)R6.模块、信号、变量等的命名不大于64个字符 (2)R7.实体、结构名、端口信号、常量用大写标识 (2)R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。
如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名。
(3)R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。
(3)R10.模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。
VHDL的描述风格
例 2 :全加器 LIBRARY IEEE; ; USE IEEE.STD_LOGIC_1164.ALL; ; ENTITY full_adder IS GENERIC(tpd : TIME := 10 ns); ( ) PORT(x,y,c_in : IN STD_LOGIC; ( , , Sum, c_out : OUT STD_LOGIC); END full_adder; ARCHITECTURE dataflow OF full_adder IS BEGIN s <= x XOR y AFTER tpd; sum <= s XOR c_in AFTER tpd; c_out <= (x AND y) OR( s AND c_in) AFTER 2* tpd; END dataflow; ;
VHDL的描述风格 VHDL的描述风格
1 行为描述方式 2 数据流描述方式(RTL描述方式) 描述方式) 数据流描述方式( 描述方式 3 结构化描述方式
VHDL语言是通过结构体具体描述整个设计实体的逻辑功 语言是通过结构体具体描述整个设计实体的逻辑功 语言是通过结构体具体描述整个设计实体 能.通常结构体有四种不同的描述方式:行为描述方式 通常结构体有四种不同的描述方式: ),数据流描述方式 (behavior),数据流描述方式(dataflow)或寄存器 ),数据流描述方式( )或寄存器RTL描 描 述方式,结构化描述方式 方式( 混合描述方式 述方式,结构化描述方式(structural)以及混合描述方式. )以及混合描述方式. VHDL通过这四种不同的描述方式从不同的侧面描述结构体的 通过这四种不同的描述方式从不同的侧面描述结构体的 功能.前三种是最基本的描述方式, 功能.前三种是最基本的描述方式,他们组合起来就成为混合 描述方式. 描述方式. 下面结合一个全加器来说明这四种描述风格, 下面结合一个全加器来说明这四种描述风格,全加器的端口 示意图如图所示,其输入输出关系如表所示. 示意图如图所示,其输入输出关系如表所示.
Verilog开发代码风格积累
Verilog开发代码风格积累1、always块代码风格(1)⼀个always块内最好只对同⼀个变量进⾏赋值;(2)同⼀个信号不要在不同的always块中进⾏赋值,这样的好处是,当修改⼀个变量的赋值,不会影响其他变量,逻辑更清晰,更适⽤于代码量⼤的⼯程;当有需要时,可使⽤间接赋值的⽅法,即在⼀个always中设⼀个flag,另⼀个always中通过判断这个flag来进⾏赋值;(3)不是同⼀类的信号,最好分开在不同的always块中进⾏赋值操作,可增强代码的可维护性和可读性。
2、RTL可综合代码中尽量不⽤for循环级代码中。
每个变量独⽴占⽤寄存器资源,不能有效复⽤逻辑资源。
for循环可以⽤在描述测试激励的⽂件中,for循环不要⽤在可综合的RTL级代码中可综合电路中遇到循环算法时,通常做法是先搞清楚设计的时序要求,做⼀个reg型计数器,在每个时钟沿累加,并在每个时钟沿处判断计数器情况作出相应处理。
3、关于FPGA中乘法除法逻辑实现FPGA中,⼀般不⽤*和/实现乘法和除法,原因*乘法在FPGA综合时,⼀类是使⽤FPGA设备⾃⾝的硬件乘法实现,但是FPGA硬件乘法块个数有限,不能滥⽤;⼀类是使⽤组合逻辑以逻辑门的⽅法实现,会消耗⼤量组合逻辑资源。
可以使⽤FPGA⾃带的乘法器IP核,或者⾃⼰花费逻辑资源,使⽤硬件描述语⾔设计效率较⾼的软乘法器。
4、if条件列表中尽量少写多位宽数据if条件列表会转换成查找表(查找表是FPGA中组合逻辑实现的基本单元,查找表使⽤多了会增加组合逻辑时延),所以在if条件列表中尽量少写多位宽数据。
5、关于新旧版本的模块接⼝声明最好不⽤旧的Verilog1995版本声明输⼊输出接⼝,建议使⽤新的Verilog2001版本规范声明输⼊输出接⼝,⽐如:module fsm(input wire sclk,input wire rst_n,output reg K);6、关于变量的声明位置变量声明区域,否则可能不建议在模块内部语句的中间穿插定义/声明变量,变量的定义和声明最好都集中在紧挨接⼝下⾯的变量声明区域导致编译器编译错误。
个人总结Verilog代码编写的25条经验
个人总结Verilog代码编写的25条经验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 如果空格太多则在深层嵌套时限制行长。
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 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作为指针名。
电子设计自动化第6章 VHDL的描述语句与描述风格
第6章 VHDL的描述语句与描述风格 如果把该程序改写成例6-5的程序,执行的功能是一样的。
【例 6-5】
USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4bak IS PORT( input: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
第6章 VHDL的描述语句与描述风格
6.1.1 赋值语句 在进程、子程序中的赋值语句包括变量赋值语句与信号赋
值语句两种。变量赋值与信号赋值虽然都是在顺序语句中,但 赋值的过程有不同之处。变量具有局部特征,它的赋值是立即 发生的,是一种时间延迟为零的赋值行为。信号具有全局性特 征,它不但可以作为一个设计实体内部各单元之间数据传送的 载体,而且可通过信号进行实体间通信。信号在顺序语句中的 赋值不是立即发生的,它发生在一个进程结束时或子程序调用 完成以后。信号的赋值过程总有一定的延时,它反映了硬件系 统的重要特性,综合后可以找到与信号对应的硬件结构,如一 根传输导线、一个输入/输出端口或一个D触发器等。变量赋值 与信号赋值的语法格式如下:
第6章 VHDL的描述语句与描述风格
【例6-3】 IF(a=‘1’) THEN
c<=b; ELSE
c<=d; END IF; 如果a='1'则执行c<=b;否则执行c<=d,然后执行后续语句。
第6章 VHDL的描述语句与描述风格
(3) 格式 3: IF 条件 THEN 顺序执行语句; ELSIF 条件 THEN 顺序执行语句; ELSIF 条件 THEN 顺序执行语句; ELSIF 条件 THEN 顺序执行语句;
END mux4; ARCHITECTURE be_mux4 OF mux4 IS
verilog语言代码设计规范
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模块说明书写规范在开始子模块设计时,必须对子模块的基本信息给予说明。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
良好代码编写风格可以满足信、达、雅的要求。
在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。
良好代码编写风格的通则概括如下:(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。