当前位置:文档之家› Verilog编码规范

Verilog编码规范

Verilog编码规范
Verilog编码规范

Verilog语言编码规范

维护人:赵文哲

E-mail:venturezhao@https://www.doczj.com/doc/cd13260212.html,

1.关于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

|--softcode

|--adc

|--dac

|--ddr

|--probe

|--dc

|--pt

|--fp

|--pr

|--synplify

doc:存放项目相关的文档,包括该项目用到的datasheet,芯片规格书(specification)等等。

inc:存放项目所用到的头文件。主要是整个项目所用到的整体的定义。

ip:存放商业上购买的成熟IP以及项目中一些成熟的可复用的代码。一般的,ip 分为sim、FPGA以及DC版本。

rtl:存放项目的rtl代码。这是项目的核心,文件名与module名称应当一致,同时按照模块的层叠关系进行存放,必要时也可以采用平行结构存放。

sim:存放项目的仿真代码。一般在sim中建立一级子项目,使得sim文件恰恰在项目的两级子目录下。仿真文件的寻址需要上朔两级从根目录开始,这样当文件

发生变动时,文件的寻址不需要多么大的改动。

softcode:存放芯片设置之外,但是仿真平台需要的模块。仅仅用在sim之中。一般存放有仿真用adc、dac、片外ram等等。

dc:存放synopsys DC综合后的结果。

pt:存放synopsys PT检查的时序报表。

fp:存放后端工具floor plan后的网表和延时文件。

pr:存放后端工具place&route后的网表和延时文件。

synplify:存放synplify工具综合后的网表。

单单看上面的介绍,可能还是无法直观的看出我们所编写的代码的存放位置。图1直观的给出了文件的组织形式。

rtl文件夹中存放有芯片内部的数字逻辑;ip文件夹中存放有芯片内部的模拟部分和可复用部分。softcode文件夹中存放有芯片外部的供仿真平台(testbench)使用的模块。而testbench文件则直接存放在sim文件夹之中。

图1 文件组织形式框图

3.verilog文件内部组织形式

Verilog文件主要有以下几个部分组成:开头声明,文件引用,时间单位定义,module IO声明,宏定义,module IO定义,wire®定义,parameter定义,module具体实现。

关于这几个部分的组织形式,请参考附录里的”sample.v”文件。本章节主要介绍除module具体实现之外的其他环节的规定和注意事项。而关于module具体实现部分将根据该module是否可综合,分为之后的两个章节来分别阐述。

1)开头声明

每一个verilog文件的开头部分,都必须有一段声明的文字。该段文字如表2所示,声明文件的版权,作者,修改日期以及修改内容介绍等等。

表2 文件的开头声明

// ************************Declaration*************************************** //

// This Verilog file was developed by The Institute of Artificial Intelli- //

// gence and Robotics, Xi'an Jiaotong University. This file contains infor- //

// mation confidential and proprietary to The Institute of Artificial //

// Intelligence and Robotics, Xi'an Jiaotong University. It shall not be //

// reproduced in whole, or in part, or transferred to other documents,or //

// disclosed to third parties, or used for any purpose other than that for //

// which it was obtained, without the prior written consent of The Institute //

// of Artificial Intelligence and Robotics, Xi'an Jiaotong University. This //

// notice must accompany any copy of this file. //

// //

// Copyright (c) 1986--2011 The Institute of Artificial Intelligence and //

// Robotics,Xi'an Jiaotong University. All rights reserved //

// //

// File name: //

// Author: venturezhao //

// Date: 2011-01-01 00:00 //

// Version Number: 1.0 //

// Abstract: //

// //

// Modification history:(including time,version,author and abstract) //

// 2011-01-01 00:00 version 1.0 venturezhao //

// Abstract: Initial //

// //

// *********************************end************************************** //

该段注释可以用vim,emacs等高级编辑器直接生成,见附录的vim配置文件。

也可以直接拷贝该段文字,再进行修改,见附录ultraedit文件夹中的”sample.v”。

如果对该文件进行了修改,请在开头声明中添加以下语句,如表3所示。

表3 文件的修改声明

2)module之前的声明

在文件的开头声明之后,接下来需要包含(include)本文件所需的头文件,以及声明本文件内的时间单位(timescale)。如表4所示。

表4 module之前的声明

补充:之所以将timescale放在include之后,是因为有时候头文件中也会定义时间单位,从而造成时间单位混淆的隐含错误。

3)IO口定义规范

module的IO口定义格式有很多种,本文档目前规定采用verilog-95的格式,在module中声明,在module内部定义的方式。如表5所示。

表5 module的IO口定义规范

//------------------------------------------------------------------------------ // INDEX: Module

//------------------------------------------------------------------------------ module moudule_name(

// reset & clock

ngreset,

clk,

// input signal

vi_video,

// output signal

vo_video,

// parameter

TYPE

);

//------------------------------------------------------------------------------ // INDEX:2. Interface

//------------------------------------------------------------------------------ // reset & clock

input ngreset;

input clk;

// input signal

input [9:0] vi_video;

4)wire与reg的定义位置

一个module中的变量声明可以集中放在一起,有时也可以随时使用随时定义。

但是对于稍微复杂的模块而言,随时使用随时定义的方式将会产生前后混淆的问题,同时代码维护时的复杂度也高于集中放在一起的情况。因此,本文档规定,将reg 与wire的定义放在紧跟着module的IO定义之后。

5)变量定义的对齐方式

为了代码的移植方便,同时增加可读性。本文档规定采用统一的空格方式。关键字input,output,inout,reg,wire等应当与0列对齐;总线(bus)的位宽声明应当与7列对齐;IO口,变量名称应当与17列对齐。如果总线位宽过长,导致变量名称无法对齐至17列,则需要以内容为单位,将局部的一些变量统一以4为单位后移。如表6所示。

表6 变量定义的对齐标准

6)变量的命名方式

变量的命名方式有很多种,本规范规定采用如下方式:变量定义时,根据意义将单词简写成3-8个字符,然后之间用下划线连接。

变量的大小写也有一定的规定:对于芯片的全局寄存器列表及其相关变量,本规范规定采用全部大写的形式;对于define或parameter,一般采用大写的形式。而对于其他的变量尽量采用小写或者大小写混合的形式。

表7 变量的命名方式

7)always模块的对齐格式

在module的具体实现中,begin和end的对齐方式有很多种。本文档规定以下两种允许使用的格式。

第一种格式如表8所示,begin跟在判断行之后,当碰见end else begin时,正好可以放在一行。每一次的包含关系时,语句向后递推4列,以形成层叠关系。

第二种格式如表9所示,begin重新开一行,end与begin对齐。这种方式在出现end else begin时,会占用额外的两行。论行数,这与C语言的行数一样,但是纯字母的方式毕竟没有大括号直观。其层叠关系与第一种方式一致。

总的来说,这两种格式都可以,但本文档还是推荐使用第一种格式。除此以外的别的方式,如依次空三列等方式被禁止使用。

表8 always模块的一种对齐格式

表9 always模块的另一种对齐格式

8)空格与tab之争

代码中表示层叠关系时,空格和tab是两种常见的实现形式。其优劣众说纷纭。

有人说空格好,因为空格的适用范围将比较广,在各个编辑器下都可以无差别的打开。也有人说使用tab表示层叠关系时,编写代码时将会比较方便,因为按一个tab会比按4个空格的速度要快。

本规范规定代码中必须使用空格。首先是器适用范围较广,其次是在vim或者别的高级文字编辑器下,将tab直接转化成空格的使用方法十分方便,根本察觉不

出使用空格时的麻烦。最重要的是,统一使用空格会使得代码维护工作变得简单和统一。

9)行内与行间限制

一行的字符不得超过第80列。这样便于代码的浏览,不需要将文件横向滚动,或者因为编辑器自动换行而使得结构凌乱。换行后,可以在当前行向后递推4列处开始,也可以按照语义来进行对齐。

一行的末尾不能是空格。首先,这样的空格毫无意义;其次,行尾的空格对于文档编辑时,会造成操作上的不便。

行间的空格不可超过2行。过多的空行没有任何意义。

表10 行内与行间限制

10)注释

对源代码注释时,不得直接翻译语法。应当指出当前语句的目的或者意义。如表11所示,cur_count和cur_cnt分别依次加1。如果注释仅仅是说明这一点,那么这个注释可以直接删掉,这没有任何意义。正确的做法是,注释中说明该变量的含义,以及加1的目的。

另外,错误的注释比没有注释更糟糕。因此,在维护代码时,首先考虑更新的,应该是代码的注释。

当代码注释无法清晰的表达出该段代码的意义时,建议使用另外的文档来说明,并在代码处注明链接关系。

表11 注释

4.可综合verilog语言设计

可综合verilog语言由时序逻辑和组合逻辑两部分构成。verilog语言的综合就是对这两种逻辑进行匹配嵌套和翻译的过程。因此,在书写可综合verilog语言时,为了得到简单的,可控的硬件实现,一般在代码结构上使用特定的结构,而不会写一些较为怪异的结构,使得综合结果变差。

由于编写可综合verilog语言的目的是将其综合成硬件电路,因此在编写可综合verilog语言时,首先应想到该代码所代表的硬件电路是什么,只有这样才不会犯一些低级错误,比如说将两个输出接到一个输入上,组合逻辑出现了死循环等等。

值得注意的是,verilog语言的变量类型,wire和reg,与当前电路是时序逻辑还是组合逻辑没有任何关系,它们仅仅是从verilog语法上定义的两种类型。时序逻辑与组合逻辑的实现只取决于verilog代码的结构。

由于时序逻辑和组合逻辑本身的特点,其赋值类型也分为了阻塞赋值与非阻塞赋值两种。为综合方便,不得在两种逻辑中混用这两种赋值。

锁存器是一种比较省资源的ASIC逻辑,但由于现在的综合工具没有很好的办法对其进行约束,并且在FPGA下的实现过于复杂。同时它的出现多数是由于编码者的疏忽而产生的,因此一般情况下不得使用锁存器来实现逻辑。

当遇到跨时钟域的情况时,一般有双跳技术或者通过异步SRAM等方式进行隔离。

同时复位也是一个非常重要的问题。

关于上述话题请查阅相关的资料,下面主要介绍可综合verilog语言的编码规范。

1)时序逻辑与组合逻辑

同步数字电路有时序逻辑和组合逻辑组成。在可综合verilog语言中,这两种逻辑都有着固定的写法,表12所示为时序逻辑的写法;表13所示为组合逻辑的几种写法。

对于变量的定义而言,寄存器型的变量是指在always模块中被赋值的变量,如reg、integer、time等等;网型的变量是指在assign模块中被赋值的变量,如wire,tri等等。

需要注意的是,这两种类型的变量与verilog的语法有关,而与综合后的硬件实现无关。请参考表12和表13的定义。并不是说综合后是连线的变量在定义时就一定是网型的,只能说verilog语言本身还需要发展和完善。当对综合后的连线有属性说明时,请人为的将其赋值到网型变量上,以便指明属性。

表12 时序逻辑

表13组合逻辑

2)阻塞赋值与非阻塞赋值

verilog语言的赋值方式有两种,阻塞赋值”=”和非阻塞赋值”<=”。之所以会出现这两种赋值方式,是由时序逻辑和组合逻辑的特性所决定的。

由于在组合逻辑中,由于所有的赋值操作都在当前clock内完成,因此我们认为其赋值操作会立即生效。阻塞赋值的含义正好与其吻合。

在时序逻辑中,由于所有的赋值操作都在下一个clock内生效,因此我们认为其赋值操作在当前时刻不能生效。这与非阻塞赋值的含义相同。

有鉴于此,任何在组合逻辑中使用非阻塞赋值,或者在时序逻辑中使用阻塞赋值的写法都是有悖于硬件实现的。在可综合verilog语言中,这种混用方式是被禁止的。

3)同步跨时钟域的信号

在verilog具体实现的最开始,应当首先处理需要通过双跳方式同步的信号。将这些信号进行两级flip-flop延时。注意内部的大小写关系和命名方法,具体的请参见表14。

表14同步跨时钟域信号

补充:对于可以用双跳方式同步的信号,一般而言是变化比较缓慢的单根信号。

或者几乎不变的一组信号。对于递增或递减的信号,应当采取格雷码编码的方式。4)有限状态机(FSM)的写法

有限状态机的实现有几种经典的写法,这里我们推荐下面这一种方式,如表15所示。

表15 FSM的书写格式

// FSM

always @(posedge clk ornegedge ngreset) begin

if (!ngreset) begin

cur_state <= INIT;

endelsebegin

cur_state <= next_state;

end

end

always @(*) begin

case(cur_state)

INIT: begin

next_state =START;

end

START: begin

next_state =INIT;

end

default:

next_state =INIT;

endcase

end

always @(*) begin

case(cur_state)

INIT: begin

sig_out =1'b0;

end

START: begin

sig_out =1'b1;

end

default:

sig_out =1'b0;

endcase

end

这种写法清晰地将组合逻辑与时序逻辑分开,可以方便的识别出代码所对应的硬件逻辑。当书写熟练之后,也可以将next_state生成与cur_state延时写在一起,但应当清楚写在一起后的代码可以清晰的拆成当前的这种形式。

补充:在处理较为复杂的电路逻辑时,一般都是以组合逻辑,即一个clock内的逻辑,作为思考的出发点。因此组合逻辑才是电路逻辑的根本。思考问题的时候应当以组合逻辑的方式来进行思考,当需要延时到下一个clock时,才会出现时序逻辑。我们在分析带有条件判断的时序逻辑时,一定要明确这其实是一个组合逻辑和一个时序逻辑的简写形式。

5)锁存器与循环逻辑

verilog语言中,如果判断语句的分支没有补全,则verilog语法规定,将其默认补全为赋值为当前值。对于时序逻辑而言,这只是将flip-flop的输出送给了输入处得组合逻辑而已,没有任何问题。而对于组合逻辑而言,为了实现赋值为当前值,由于组合逻辑本身没有存储单元,一般会综合成一个锁存器(latch),以保持当前值。

对于latch而言,由于没有合适的综合工具,设计时一般不会被采用。这就要求在书写代码时,必须对组合逻辑的判断分支进行补全,且不得出现将变量自身赋给自身的情况。

在组合逻辑中将变量自身赋给自身,称之为循环逻辑。在同一段always块或者assign语句中,这种逻辑容易被发现。而如果在多个块中,也出现了多级的循环赋值时,该逻辑也会出现问题。需要重新分析电路,并重新设计。

表16锁存器的出现与循环逻辑

// 出现Latch的隐含形式

always @(*) begin

if(condition) begin

latch_i =2'h0;

end//[error]条件没有补全,会产生Latch

end

// 出现Latch的显式形式

always @(*) begin

if(condition) begin

latch_i =2'h0;

end else begin

latch_i =latch_i;//[error]自身赋给了自身,会产生Latch

end

end

// 循环逻辑

always @(*) begin

circum_var = var01;//[error]在组合逻辑中循环赋值

end

assign var01 = var02;

assign var02 = circum_var;

补充:使用verilog-95的语法时,当always模块为组合逻辑时,当敏感变量不全,会发生什么情况?有一种说法是,会产生锁存器。这种说法是不确切的,不信请尝试一下在不用异步flip-flop的条件下,只用锁存器来实现其硬件电路。正确的解释是:这将会造成仿真与综合不一致。在综合时,综合器并不考虑敏感变量列表,会将其直接综合成组合逻辑。而仿真平台会根据敏感变量列表来进行判断是否执行该段语句。这样会造成仿真与综合的失配。

6)关键路径优化

为了尽可能快的提高verilog综合后的工作频率,需要对代码中,组合逻辑最长的逻辑进行优化。最根本的优化方法是优化电路的逻辑设计。除此以外,规范书写的格式也可以提高部分效率。例如,改变条件判断的次序,尽量将时间最长的判断分支放在最外层。将条件判断的分支时间尽量平衡,也可以提高一部分的效率。如表17所示。

表17优化条件分支判断

7)三态门与双向IO

在数字电路的内部,一般不适用三态门,和双向IO。如果内部出现了三态门的高阻态时,其悬浮的电路将会消耗较高的功率。而inout接口在ASIC时一般会有专门的双向IO PAD来实现,最好将其保持成sig_i,sig_o,sig_e的形式,直到芯片的PAD 处。如表18所示。

表18 双向IO

8)数组的使用与for循环

在可综合verilog语言中使用数组,一般的目的是对相同属性的一组变量进行简写。其操作一般与for循环共同使用。

for循环在可综合的verilog语言中,其目的也是对一组相同的操作进行简写。因此,它的循环次数必须是在综合前就已经确定的。可以将它展开成确定的语句来直观的理解。

9)synopsys综合原语

由于综合器要对代码进行优化。为了优化过程可以按照我们的要希望来进行,在使用synopsys兼容的综合工具时,如DC,synplify,Quartus等,需要使用synopsys 综合原语。

常用的综合原语有:

/* synthesis noprune*/:防止reg或module在综合后因优化而删掉。

/*synthesis preserve*/:防止reg或module在综合后被优化成常数。

/*synthesis keep*/:防止wire在综合后因优化而删掉。

//synthesis full_case:声明case语句已经列完了所有情况,其他情况下保持原值。在case处在组合逻辑中时,有可能导致综合出锁存器。

//synthesis parallel_case:声明case语句的条件是互不相容的。

//synthesis translate_on: 声明在此之下的代码必须被综合,与translate off配对使用。

//synthesis translate_off: 声明在此之下的代码不被综合,与translate on 配对使用。

值得注意的是,这些语句一般是在调试时使用。不够清晰的使用这些指令会导致仿真与综合的失配。需要谨慎使用。

表19 synopsys综合原语

//------------------------------------------------------------------------------ // INDEX: Module

//------------------------------------------------------------------------------ module moudule_name(

// reset & clock

ngreset,

clk,

// input signal

vi_video,

// output signal

vo_video,

// parameter

TYPE

)/*synthesis noproune*/;//保持module不被优化

//------------------------------------------------------------------------------ // INDEX:2. Interface

5.仿真用Verilog语言设计

对于硬件描述语言而言,仿真环境的搭建是非常重要的一步。一般而言,在正式编码之前,应当首先建立该平台的仿真环境。一个完善的仿真环境对于可综合verilog代码编写和调试都有莫大的帮助。

verilog语言最初就是为了搭建仿真环境而设计的。它除了目前用于描述实际硬件电路以外,还可以用于它的最初的工作,HDL仿真环境的搭建。用于仿真的verilog语言可以使用一些与硬件无关的函数或资源,不需要考虑实际的硬件限制,从而可以模拟芯片的外围工作环境,并实现整体的仿真环境。

此外,对于verilog的仿真环境,还需要熟悉特定软件的配置。以nc-verilog为例,需要熟悉它的命令行工作模式。

下面介绍仿真用verilog的规范。

1)task与function

task与function是仿真用verilog中增加的功能。task可以描述一段与时序相关的操作;而function只能描述与时序无关的操作。

一般的,使用function来书写一些可以复用的组合逻辑。使用task来书写一段与时序相关的操作逻辑。

2)文件的读写操作

在仿真用verilog语言中,经常涉及到对文件的读写操作。其格式如表20所示。

表20文件操作

3)dump波形的函数

在调试verilog代码时,经常需要查看verilog代码中的中间变量的变化情况,这就需要将波形导出,也就是常说的dump波形。导出波形的格式有很多种,在此以verdi(Debussy)为例,如表21所示。

表20 dump波形

4)testbench的写法

testbench文件作为一个仿真环境的顶层文件,需要在内部包含时钟,复位以及该平台的输入输出方式等模块。以表21为例,具体的例子请见附录”tb_sample.v”。

表21 testbench文件

// generate reset and clock

initialbegin

ngreset =1'b0;

clk =1'b0;

#20;

ngreset = 1'b1;

#50_000_000;

$finish;

end

// clk = 148.5M Hz

always #3.37 clk = ~clk;

// read file

initialbegin

$readmemh("FILE_PATH/FILE_NAME.EXTERN",vi_video);

end

// sample instance

sample sample_cmpnt(

// reset & clock

.ngreset(ngreset),

.clk(clk),

// input signal

.vi_video(vi_video),

// output signal

.vo_video(vo_video),

// parameter

.TYPE(8'h0)

);

5)基于终端的仿真文件

在终端下执行一个工程的仿真是非常快捷的。一般也推荐使用这种方式来仿真verilog平台。常用的仿真平台有modelsim,nc-verilog,vcs等等。下面以nc-verilog 为例,来说明仿真文件的写法。

首先是一个批处理文件,nc-verilog只需执行如表22所示的命令即可。在windows 下将其定义成批处理文件即可,在linux下直接执行该文件即可。

其次需要一个包含的配置文件,这里面可以包含include路径、define参数,综合的文件等等信息。如表23所示。

表22ncverilog仿真命令

表23ncverilog配置文件

// parameter

+ncloadpli1=debpli:deb_PLIPtr

+access+rwc

//+neg_tchk

// =========================================

//----code----//

// =========================================

// =========================================

// testbench

// =========================================

./tb_sample.v

// =========================================

// rtl

// =========================================

../../rtl/dtv110a/dptv_core/dpu/post.v

智造工坊verilog代码规范

Verilog 代码规范 陈永/Jon chen 2015.12.16

FPGA项目规范体系 智造工坊FPGA项目的执行需要严格按照完整的规范体系完成,代码规范只是一个组成部分。 智造工坊FPGA项目规范 流程规范工 程 规 范 文 档 规 范 代 码 规 范 实 现 规 范 仿 真 规 范 测 试 规 范 验 收 规 范 维 护 规 范

代码规范声明 本课程所述的Verilog代码规范是根据本公司近20年来数百个FPGA项目经验总结出的规范,旨在提高内部工程师工作效率和工作质量。 不同公司根据自身的业务类型和管理理念,具有不同的代码风格和代码规范。本课程仅阐述本公司的代码规范,供初学者参考学习。本课程如有不合理之处或对课程中的规范有更好的建议,请及时提出,一经确认采纳,定有重谢! 联系方式: 邮箱:Jonchen@https://www.doczj.com/doc/cd13260212.html, QQ : 517343565

Verilog 代码规范作用 增加代码可读性,复用性,统一性,维护性 提升编码效率,降低语法出错率和逻辑出错率 提高代码实现效率,优化FPGA 逻辑资源,提高设计可靠性和稳定性 初级规范 中级规范 高级规范 (外在形式,基本规范,风格统一即可) (基本保障,建议统一执行) (经验总结,建议在项目中体会)

初级规范 文件名与模块名定义文件头 注释 模块内部结构 端口定义 参数定义 信号定义对齐方式缩进方式模块例化顶层要求

初级(文件名,模块名) 文件名,模块名 1)文件名和模块名保持一致 2)文件以小写.v为后缀名 3)文件名和模块名由小写字母a-z,数字0-9,下划线组成 4)文件名和模块名长度不超过16个字符 5)文件名和模块名中的几个词组以下划线隔开 6)文件名和模块名要有一定含义,和模块功能保持一致 7) Altera公司的Ipcore以ALT开头,Xilinx芯片的Ipcore以XIL开头(一个项目多家芯片) 8)时钟复位控制模块统一用clk_rst,寄存器模块统一用reg_ctrl 9)单芯片项目FPGA顶层模块名统一用fpga_top 10)多板卡多芯片项目FPGA顶层模块名用xx_fpgan_top命名(xx:板卡名,n:FPGA编号)

(免费)[VHDL+Verilog]良好的代码编写风格(二十五条)

[VHDL+Verilog]良好的代码编写风格(二十五条) 良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下: (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 和V erilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;

Verilog试题 A答案

北京航空航天大学 2011 ~2012 学年第二学期 数字EDA 期末考试试卷 ( 2012 年 5 月 23 日) 班级:__________;学号:______________;姓名:__________________;成绩:___________ 注意事项:1、填空题与选择题直接在试题上作答 2、设计题在答题纸上作答 正题: 一、填空题(共30分,每道题3分) 1. 写出表达式以实现对应电路的逻辑功能。 F 2. 根据图中输入输出关系将Verilog 模块定义补充完整,其中信号A 为5比特宽度,其余信号为1比特宽度。 A 宽 3. IEEE 标准的硬件描述语言是 verilog HDL 和 VHDL 。 4. 你所知道的可编程逻辑器件有(至少两种): FPGA, CPLD, GAL, PAL (任写其二) 。 5. 假定某4比特位宽的变量a 的值为4’b1011,计算下列运算表达式的结果 6. Verilog 语言规定了逻辑电路中信号的4种状态,分别是0,1,X 和Z 。其中0表示低电平状态,1表示高电平状态,X 表示 不定态(或未知状态) ,Z 表示 高阻态 。 assign F= E ^ ( (A&B) | (!(C&D))) module tblock( A,B,C ) ; output [4:0] A; input B; inout C; …… //省略了功能描述 endmodule //模块结束 &a = 1’b0 ~a = 4’b0100 {3{a}} = 12’b101110111011 {a[2:0],a[3]} = 4’b0111 (a<4’d3) || (a>=a) = 1’b1 !a = 1’b0

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 Guider Sun Microsystems Revision 1.0 VerilogStyle and Coding Guidelines 5 规范内容 5.1 Verilog 编码风格

本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模块。 5.1.1 命名规范 选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。 1. 用有意义而有效的名字 有效的命名有时并不是要求将功能描述出来如 For ( I = 0; I < 1024; I = I + 1 ) Mem[I]<= #1 32’b0; For 语句中的循环指针I 就没必要用loop_index作为指针名。 2. 用连贯的缩写 长的名字对书写和记忆会带来不便,甚至带来错误采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下: Addr address Pntr pointer Clk clock Rst reset 3. 用名字前加小写n表示低电平有效高电平有效的信号不得以下划线表示短暂 的引擎信号建议采用高有效 如 nRst, nTrdy, nIrdy nIdsel. 4. 大小写原则 名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接(或第二个单词首字母大写) 如 :Packet_addr, Data_in, Mem_wr , Mem_ce_ Or: PacketAddr, DataIn, MemWr , MemCe 5.全局信号名字中应包含信号来源的一些信息 如: D_addr[7:2] 这里的 D 指明了地址是解码模块(Decoder module)中的地址.

VERYLOG编码规范

Verilog编码规范! 一. 强调Verilog代码编写风格的必要性。 强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。 每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码,阅读起来容易接受和理解。相反和自己编写风格差别较大的代码,阅读和接受起来就困难一些。 曾有编程大师总结说,一个优秀的程序员,能维护的代码长度大约在1万行数量级。代码的整洁程度,很大程度上影响着代码的维护难度。 遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。相反代码编写风格随意的代码,通常晦涩、凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。 (实际上英文Coding Style有另一层涵义,更偏重的是,某一个电路,用那一种形式的语言描述,才能将电路描述得更准确,综合以后产生的电路更合理。本文更偏重的是,编写Verilog代码时的书写习惯。) 二. 强调编写规范的宗旨。 缩小篇幅 提高整洁度 便于跟踪、分析、调试 增强可读性,帮助阅读者理解 便于整理文档 便于交流合作 三. 变量及信号命名规范。 1. 系统级信号的命名。 系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。 2. 低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n; 3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。 低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr 多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。 4. 模块的命名。 在系统设计阶段应该为每个模块进行命名。命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。若模块的英文名只有一个单词,可取该单词的前3个字母。各模块的命名以3个字母为宜。例如: Arithmatic Logical Unit模块,命名为ALU。 Data Memory Interface模块,命名为DMI。

第5章-Verilog HDL语法规范(第10讲)-5.10

Verilog HDL语言规范

Verilog HDL 行为描述语句 本部分介绍行为描述语句。通过行为级建模把一个复杂的系统分解成可操作的若干个模块,每个模块之间的逻辑关系通过行为模块的仿真加以验证。同时行为级建模还可以用来生成仿真激励信号,对已设计模块进行仿真验证。

Verilog HDL 行为描述语句 --过程语句 过程分配用于更新reg,integer,time,real, realtime和存储器数据类型。对于过程分配和连续分配来说,有下面的不同之处: ?连续分配 连续分配驱动网络。只要一个输入操作数的值发生变化,则更新和求取所驱动网络的值。 ?过程分配 在过程流结构的控制下,过程分配更新流结构内变量的值。

Verilog HDL 行为描述语句 --过程语句 过程分配的右边可以是求取值的任何表达式。左边应该是一个变量,它接收右边表达式分配的值。 过程分配的左边可以是下面的一种格式: ?reg 、integer 、real 、realtime 或者time 数据类型分配给这些数据类型所引用的名字。 ?reg 、integer 、real 、realtime 或者time 数据类型的位选择分配到单个的比特位

Verilog HDL 行为描述语句 --过程语句 ?reg 、integer 、real 、realtime 或者time 数据类型的部分选择一个或者多个连续的比特位的部分选择。 ?存储器字 存储器的单个字 ?任何上面的并置(连接)或者嵌套的并置(连接) 上面四种形式的并置或者嵌套的并置。这些语句对右边的表达式进行有效的分割,将分割的部分按顺序分配到并置或者嵌套并置的不同部分中。

用verilog语言编写交通灯程序

交通灯 一、实验目的 写一个交通灯,要求: ①有东西南北四个方向,两组交通灯轮流交替变换,其中,红灯时间为30 个时间单位,绿灯时间为25个时间单位,黄灯时间为5个时间单位。最后用modelsim软件进行仿真。 ②要求设计是一个可综合设计。 二、实验原理 根据实验要求的逻辑功能描述,可以分析得出原理图如下: 根据实验要求画出控制器的状态转移图如下:

三、代码 1、源代码 (1)控制器模块 module traffic_lights(clk,rst,count,ew,sn); input clk,rst; input[5:0] count; output[2:0] ew,sn; reg[2:0] ew,sn; reg[3:0] state; parameter Idle=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100; always @(posedge clk) if(!rst) begin state<=Idle; end else casex(state) Idle: if(rst) begin state<=s1; end s1: if(count=='d25) begin state<=s2; end s2: if(count=='d30) begin state<=s3;

end s3: if(count=='d55) begin state<=s4; end s4: if(count=='d60) begin state<=s1; end endcase always @(posedge clk) begin if(!rst) begin ew<=3'b100; sn<=3'b100; end else casex(state) Idle: if(rst) begin ew<=3'b100; sn<=3'b001; end s1: if(count=='d25) begin ew<=3'b100; sn<=3'b010; end

Verilog编码风格

Verilog编码风格 嵌入式开发2010-05-03 15:28:13 阅读14 评论0 字号:大中小订阅 这是以前公司的对fpga代码编写的要求 良好代码编写风格的通则概括如下: (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)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:

verilog语言代码设计规范

verilog语言代码设计规范2011年12月

目录 一、规范适用范围 ------------------------------------------------------------------------ 4 1.1项目适用范围------------------------------------------------------------------------------------- 4 1.2人员适用范围------------------------------------------------------------------------------------- 4 1.3编码设计的成果形式 --------------------------------------------------------------------------- 4 二、代码书写规范 ------------------------------------------------------------------------ 5 2.1模块说明书写规范------------------------------------------------------------------------------- 5 2.1模块注释书写规范------------------------------------------------------------------------------- 5 2.3变量名称书写规范------------------------------------------------------------------------------- 6 2.4代码结构书写规范------------------------------------------------------------------------------- 7 三、使用verilog语言的语法范围----------------------------------------------------- 8 3.1设计RTL代码的语法范围 -------------------------------------------------------------------- 8 3.2设计仿真代码的语法范围 -------------------------------------------------------------------- 10 四、使用verilog语言的结构范围---------------------------------------------------- 11 4.1系统设计文件的形式与使用方法----------------------------------------------------------- 11 4.2模块结构划分的标准 -------------------------------------------------------------------------- 12 4.3组合逻辑的代码风格 ------------------------------------------------------------------------ 13 4.4时序逻辑的代码风格 -------------------------------------------------------------------------- 21 4.5仿真代码的代码风格 -------------------------------------------------------------------------- 27 五、使用受限范围内的语法或结构要进行的申请过程-------------------------- 32 5.1受限的语法与结构------------------------------------------------------------------------------ 32 5.2批准使用的程序--------------------------------------------------------------------------------- 32

Verilog+HDL代码书写规范

1.目的 本规范的目的是提高书写代码的可读性、可修改性、可重用性,优化代码综合和仿真的结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化可编程技术部的FPGA设计输入,从而做到:①逻辑功能正确,②可快速仿真,③综合结果最优(如果是hardware model),④可读性较好。 2.范围 本规范涉及Verilog HDL编码风格,编码中应注意的问题,Testbench的编码等。 本规范适用于Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真、综合或二者结合的目的而设计的模块。 3.定义 Verilog HDL : Verilog 硬件描述语言 FSM :有限状态机 伪路径:静态时序分析(STA)认为是时序失败,而设计者认为是正确的路径。 4.规范内容 4.1.Verilog 编码风格 本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 4.1.1. 命名的习惯 选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处、有效状态等基本含义,下面给出一些命名的规则。 y用有意义而有效的名字 有效的命名有时并不是要求将功能描述出来,如 For ( I = 0; I < 1024; I = I + 1 ) Mem[I] <= 32’b0; For 语句中的循环指针I 就没必要用loop_index作为指针名。 y用连贯的缩写 长的名字对书写和记忆会带来不便,甚至带来错误。采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下: Addr address Pntr pointer Clk clock reset

Verilog HDL设计练习

Verilog HDL设计练习进阶(一) 练习一.简单的组合逻辑设计 目的:掌握基本组合逻辑电路的实现方法。 这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。在Verilog HDL中,描述组合逻辑时常使用assign结构。注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。 模块源代码: //--------------- compare.v ----------------- module compare(equal,a,b); input a,b; output equal; assign equal=(a==b)?1:0; //a等于b时,equal输出为1;a不等于b时, //equal输出为0。 endmodule 测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。 测试模块源代码: `timescale 1ns/1ns //定义时间单位。 `include "./compare.v" //包含模块文件。在有的仿真调试环境中并不需要此语句。 //而需要从调试环境的菜单中键入有关模块文件的路径和名称module comparetest; reg a,b; wire equal; initial //initial常用于仿真时信号的给出。 begin a=0; b=0; #100 a=0; b=1; #100 a=1; b=1; #100 a=1; b=0; #100 $stop; //系统任务,暂停仿真以便观察仿真波形。 end compare compare1(.equal(equal),.a(a),.b(b)); //调用模块。 endmodule 仿真波形(部分):

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综合之后,这些冗余就会成为实 实在在多出来的不必要的电路,他们或者是寄存器或者

Verilog编码规范

Verilog编码规范 (仅供内部使用) 拟制: xxx 日期: xxx 审核:审核者日期:yyyy-mm-dd 批准:批准者日期:yyyy-mm-dd 版权所有侵权必究

修订记录

目录 1命名规范 (5) 2代码编写规范 (10) 2.1 版面 (10) 2.2 编写代码规范 (11) 3电路设计规则 (29) 3.1 时钟 (29) 3.2 复位 (31) 3.3 避免LATCH (32) 3.4 避免组合反馈 (33) 3.5 赋值语句 (33) 3.6 case语句和if-then-else语句 (33) 3.7 状态机 (34) 3.8 异步逻辑 (37) 4模块划分 (38)

5提高可移植性的编码风格 (39) 5.1 采用参数化设计 (39) 5.2 采用独立于工具平台和工艺库的设计 (40) 5.3 尽量使用已经得到验证的IP (41) 6其他一些设计建议 (42) 7附件 (45) 8参考文档: (54) 基本原则:简单,一致,可重用。 简单指尽量使用简单的语句,尽量使用简单的设计,尽量使用简 单的时钟,尽量使用简单的复位。 一致指尽量保持代码风格一致,尽量保持命名一致。 可重用指有成熟的IP尽量使用IP,设计的代码要尽量可重用。

1命名规范 给信号命名就像给孩子取名字一样,有区别,有根源,有深度,还有一点,要简单,别冗长。 有区别指取名字不要一样,假如大家只有一个手机号码,那这个号码还能有什么用处? 有根源指取名字要能象姓氏一样,让人一看就直到是张家的后代而不是李家的。 有深度就是取名字要有涵义,张一,张二,张三虽然也是名字,但是请考虑一下被取名字人的感受。 简单点,几十个字母长的名字,打字的和看字的都累。 大小写规则:只有parameter,`define和module名称才能享受 大写。 Module 名应与文件名保持一致(文件名是小写),假如不想在设 计后面遇到麻烦的话。 不要尝试使用任何保留字,因为他们已经被保留了。 不要重复使用同样的名字去命名不同的数据。 (建议)对module名加”_LVx”的后缀,增强module名称的结 构层次含义

verilog书写规范

海思高校合作——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 (小写)

VHDL+Verilog良好的代码编写风格

VHDL+Verilog良好的代码编写风格(二十五条) 田Sir 发表于: 2010-4-28 13:56 来源: 湖北师范学院电工电子实验教学示范中心良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:(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。建议采用参数定义代替直接的数字。同

Verilog代码编写规范

Verilog代码编写规范 有点东东,给大家一起分享一下:********* Verilog代码编写规范 一. 强调Verilog代码编写风格的必要性。 强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。 每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码,阅读起来容易接受和理解。相反和自己编写风格差别较大的代码,阅读和接受起来就困难一些。 曾有编程大师总结说,一个优秀的程序员,能维护的代码长度大约在1万行数量级。代码的整洁程度,很大程度上影响着代码的维护难度。 遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。相反代码编写风格随意的代码,通常晦涩、凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。 (实际上英文Coding Style有另一层涵义,更偏重的是,某一个电路,用那一种形式的语言描述,才能将电路描述得更准确,综合以后产生的电路更合理。本文更偏重的是,编写Verilog代码时的书写习惯。)二. 强调编写规范的宗旨。 缩小篇幅 提高整洁度 便于跟踪、分析、调试 增强可读性,帮助阅读者理解 便于整理文档 便于交流合作 三. 变量及信号命名规范。 1. 系统级信号的命名。 系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys 开头。 2. 低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n; 3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。 低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr 多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。 4. 模块的命名。 在系统设计阶段应该为每个模块进行命名。命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。若模块的英文名只有一个单词,可取该单词的前3个字母。各模块的命名以3个字母为宜。例如: Arithmatic Logical Unit模块,命名为ALU。 Data Memory Interface模块,命名为DMI。 Decoder模块,命名为DEC。 5. 模块之间的接口信号的命名。

经典Verilog代码标准

一、工程建立规范: 1、工程的组成: (1)一个顶层文件夹 (2)顶层文件夹下,至少包括以下四个子文件夹 a)project文件夹:存放ISE工程文件,包括ise、bit、mac等文件 b)source文件夹:存放verilog源文件 c)explain文件件:存放注释说明文档 d)test文件夹:存放测试程序代码,可进一步分为软件调试程序、硬件调试程序 2、工程的命令: (3)定层文件夹命令为top_xxx,xxx为工程的识别名称 (4)顶层文件夹的子文件夹分别命名为:project、source、explain、test 二、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 // ------------------------------------------------------------------------------------------------------ // //

相关主题
文本预览
相关文档 最新文档