您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > verilog语言代码设计规范
代码设计规范1verilog语言代码设计规范2011年12月代码设计规范2目录一、规范适用范围-------------------------------------------错误!未定义书签。1.1项目适用范围-------------------------------------------------错误!未定义书签。1.2人员适用范围-------------------------------------------------错误!未定义书签。1.3编码设计的成果形式-------------------------------------错误!未定义书签。二、代码书写规范------------------------------------------------------------------32.1模块说明书写规范-----------------------------------------------------------------32.1模块注释书写规范-----------------------------------------------------------------32.3变量名称书写规范-----------------------------------------------------------------42.4代码结构书写规范-----------------------------------------------------------------5三、使用verilog语言的语法范围------------------------------------------63.1设计RTL代码的语法范围-----------------------------------------------------63.2设计仿真代码的语法范围-----------------------------------------------------8四、使用verilog语言的结构范围------------------------------------------94.1系统设计文件的形式与使用方法-----------------------------------------94.2模块结构划分的标准------------------------------------------------------------104.3组合逻辑的代码风格----------------------------------------------------------114.4时序逻辑的代码风格------------------------------------------------------------194.5仿真代码的代码风格------------------------------------------------------------25五、使用受限范围内的语法或结构要进行的申请过程错误!未定义书签。5.1受限的语法与结构-----------------------------------------错误!未定义书签。5.2批准使用的程序---------------------------------------------错误!未定义书签。代码设计规范3/*********************************************************author:abc**date:2005-5-12**version:1.0**hiberarchy:mcu-alu-adder**describe:16bitadder*********************************************************/………//inputport//clearresetsingalofsystem//Accontrolsingalofaccumulationinputclear,Ac;………二、代码书写规范2.1模块说明书写规范在开始子模块设计时,必须对子模块的基本信息给予说明。说明的位置一般在设计的开头,使用注释的形式用(/**/)说明该设计的作者、编写日期、版本号、在系统中的层次位置、基本功能描述等。其形式如下所示:说明的内容要简洁清晰。使用/**/对将说明部分括起来是为了与普通注释相区别。2.1模块注释书写规范注释对项目团队关于设计的交流至关重要,好的设计总是会在恰当的地方对语句或变量予以说明,没有注释的设计不是真正的工业级设计,通篇的注释同没有注释一样糟糕,会将代码淹没在无用的注释之中。这一节给出书写注释的规范。如果设计中出现了一个新的变量,那么必须对这个新变量给予注释,对变量的注释应该放在变量的定义之前,注释应该说明变量的物理意义或作用。其形式如下:代码设计规范4………//wallacetreemultiplication………如果设计中的某块结构属于作者的创新或设计中很关键的部分,作者应该对这种结构的物理含义予以简要说明。注释在语句或结构的前一行开始写如:2.3变量名称书写规范verilog语言规定了各种类型的标志符的格式,作为规范我们对用户自定义的各种变量的命名方法及书写格式加以约束。变量一般指模块(或设计)名、端口名、连线名、参照名、单元名以及内部寄存器名。首先变量名必须能表达实际的物理意义,如果需要几个单词来表示,那么单词之间用一个“_”分隔。变量名不宜过长,一般不要超过16个字符否则书写的效率会下降,因此变量名应该尽量使用单词的缩略写法,完整的含义应在注释中给予说明。我们规定常量参数一律使用大写字母表示,变量的名称一律用小写字母a~z、数字0~9或下划线_表示,变量首字符一律用字母。模块名(或设计名)应该与文件名一致,一个文件只应包含一个模块。它是模块功能的缩略表达。端口名应与该端口实际的物理意义相一致。连线是对内部单元(实例)引脚间进行连接的物理线或是对组合逻辑输出端口、组合逻辑单元输出端进行赋值运算的输入线。连线名应该有确定的连接对象或是有确定的信号物理意义,所以针对单元引脚连接的连线它的名称应该表明所连接单元的名称,如timing_alu表示时序发生器发出的控制信号连接ALU部件的控制端。针对为输出端做赋值运算的输入连线它的名字应该表达相应的物理意义,绝不要使用通用名如:a,b,c这样的名字。这类连线适当的名称如:add_a,add_b。参照名就是一个单元或实例参考的库标准单元或原始设计名,所以它的名字与库单元或模块名相同。单元与实例在synopsys的DC工具中是不加区分的,这里也等同看待,它的名字可以用参照名为头后加数字予以标识。如alu1、acc1等。如果设计的内部有中间级寄存器,那么寄存器以实际的物理意义进行命名,比如在乘法器中为分割关键路径引入的中间级寄存器可以命名为代码设计规范5pipeline1_out等。2.4代码结构书写规范好的代码结构可以清晰的看出设计的层次关系,进而使结构与设计者所要表达的逻辑意图一致,方便纠错和交流。代码最基本的结构有平行结构和层次结构,他们反映了代码的隶属关系,我们规定注释语句与语句块是一个层次的,这意味着对模块的注释行(以//开头)必须在一行的顶头开始写。其他语句的层次低于模块定义和注释,那么其他语句至少要向后缩退四个空格。语句块中的语句低于语句块的定义,例如:always@(posedgeclk)beginout=in;end//endalways语句块中的语句块和其他语句是同级的。语句块结束应该有注释说明结束的语句块的名称例如:always@(posedgeclk1negedgeclear)beginif(!clear)beginout=6'b000000;endelsebegincase(addr)`SFR_A:beginout=in;end……endcaseendend代码设计规范6三、使用verilog语言的语法范围3.1设计RTL代码的语法范围verilog语言是一种通用的HDL(硬件描述语言),它的语法范围包括了用户各种设计层级的需求,虽然语言本身对这种层级并没有细致的区分,但因为设计者编写的代码最终要使用具体的综合工具综合成实际电路,所以语言层级的划分不可避免的具有针对某种工具的特点,我们这里的划分依据是根据DesignCompile综合工具来定的。在论述的过程中我们常使用左值和右值的称谓,一般我们将赋值运算符左侧的变量称作左值,右侧的变量称作右值,因此左值具有位置属性而右值具有数值属性。右值的任何地方禁止出现“x”,左值在任何情况下不可以为常量。在有些环境中也将左值称做写数据,右值称做读数据。在一个语句块中不可对同一个左值赋两次值,因为这样会引起数据冲突(三态门除外)。verilog语言可以描述四个设计层级的语法范畴,依次是:系统行为级、模块寄存器传输级(RTL)、电路门级、晶体管开关级。层级之间的转换我们称之为综合。目前业界的流行的做法是前端设计将RTL级综合为门级网表。行为级到门级的直接综合还不成熟,另外,数字电路中的晶体管我们一般当作开关来对待,因此对它们具体的器件特性描述,并不是针对数字电路设计的verilog语言所能及的。系统行为级描述一般作为系统设计的辅助手段或建立系统仿真环境的语言实现手段,在系统设计时,设计人员一般使用行为级描述来建立系统数据流的直观表述,以助选定设计方案,划分系统层次、确定模块接口等。这个级别是设计的最高抽象层,它不考虑设计的具体实现,只是确定实现的可行性,和估计实现的规模,因此系统设计时系统行为级描述不限制语言的种类,可以用verilog也可用SystemC甚至C语言,它们只是帮助系统设计人员最终得到系统各个模块的端口列表和层级子模块明确的功能定义。有些项目使用层级关系的原理图来说明系统结构,子模块使用黑盒来代替。一些小项目这个过程可以省略直接由编码人员来实现。行为级描述也可以建立系统的仿真环境,它也是实际工作中行为级最重要的作用。这时一般将被仿真的模块作为实例,仿真环境为实例提供各种输入向量,设计人员观察输出结果分析被测实例的功能正确与否,如有错误可以定代码设计规范7位错误以便修正。HDL的寄存器传输级(RTL)一般用于对电路子模块的描述,它一般由四种基本结构组成:寄存器、计数器、选择器、算术逻辑运算单元。其中寄存器对应always语句块,选择器对应if…else…语句块,算术运算符加(+)、减(-)可以作为RTL代码直接综合,乘(*)、除(/)如果没有特殊的性能要求也可以受限使用,逻辑运算符与、或、非是RTL代码。计数器一般作为各种状态标志的产生器。我们规定RTL的抽象级别是逻辑抽象,所以它应该反应的是各种器件的逻辑行为和逻辑结构,而不是器件的物理组成(门级连接),另外它对应的是具体的物理实体,而不是理想的逻辑关系(没有实物对应的逻辑抽象和理想的信号时空顺序)。在逻辑抽象级我们一般将组合电路看作连线之间的算术逻辑赋值运算,将时序电路看作由寄存器存储组合逻辑产生结果的结构。所以RTL级的四种基本结构的组合变化足以构建各种器件千变万化的逻辑结构。我们规定对wire型变量的赋值使用连续赋值语句(assign),并且一律使用阻塞型赋值(=),组合逻辑中always块中的reg型变量一律使用阻塞型赋值,在时序逻辑中使用非阻塞型赋值(=)。RTL代码中要求不使用循环语句,所有涉及循环赋值的部分一律将循环打散采用显式赋值。代码中不要出现函数、任务的相关语句块,所有需要出现的地方使用module编写模块,再调用实例。没有实物对应的initial语句块以及具有理想信号时空顺序的语句,如显式指定延迟语句不能在RTL代码中出现。如果有实例调用那么实例的引脚连接采用端口对应禁止使用位置对应。因为综合工具没有与“x”对应的状态,所以设计中任何地方的值禁止出现“x”,如果对总线
本文标题:verilog语言代码设计规范
链接地址:https://www.777doc.com/doc-3975675 .html