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

合集下载

VHDL语言的基本语法

VHDL语言的基本语法

B:二进制基数符号,表示二进制数位0或1。 二进制基数符号,表示二进制数位0 O:八进制基数符号。 八进制基数符号。 X:十六进制基数符号(0~F) 。 十六进制基数符号(0~ (0 例如: 1_1101_1110 1_1101_1110” 例如:B“1_1101_1110 --二进制数数组,位矢数组长度是9 --二进制数数组,位矢数组长度是9 二进制数数组 AD0 X“AD0” AD --十六进制数数组,位矢数组长度是12 --十六进制数数组,位矢数组长度是12 十六进制数数组
4、下标名及下标段名 下标名用于指示数组型变量或信号的某一 下标名用于指示数组型变量或信号的某一 元素, 元素,如:a(2) , b(n) 下标段名则用于指示数组型变量或信号的 下标段名则用于指示数组型变量或信号的 某一段元素,其语句格式如下: 某一段元素,其语句格式如下:
数组类型信号名或变量名(表达式 表达式2]); 数组类型信号名或变量名 表达式1 [TO/DOWNTO 表达式 ; 表达式
信号的使用和定义范围是实体、结构体和程序包 信号的使用和定义范围是实体、结构体和程序包.
在程序中: 在程序中 (1) 信号值的代入采用“<=”代入符,而且信号 信号值的代入采用“ ”代入符, 代入时可以附加延时。 代入时可以附加延时。 (2) 变量赋值时用“:=”,不可附加延时。 变量赋值时用“ ” 不可附加延时。 (3) 信号的初始赋值符号仍是“:=”。 信号的初始赋值符号仍是“ ” 例: X<=Y AFTER 10 ns; ; --X,Y都是信号,且Y的值经过 都是信号, 的值经过10ns延 , 都是信号 的值经过 延 时以后才被代入X。 时以后才被代入 。
(1) 赋值语句右方的表达式必须是一个与目标变量有相同 数据类型的数值。 数据类型的数值。 (2) 变量不能用于硬件连线和存储元件。 变量不能用于硬件连线和存储元件。 (3) 变量的适用范围仅限于定义了变量的进程或子程序中。 变量的适用范围仅限于定义了变量的进程或子程序中。 (4) 若将变量用于进程之外,必须将该值赋给一个相同的 若将变量用于进程之外, 类型的信号,即进程之间传递数据靠的是信号。 类型的信号,即进程之间传递数据靠的是信号。

VHDL代码书写规范

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_元件名’标识。

VerilogHDL程序编写规范2

VerilogHDL程序编写规范2

文档控制表
文档
编辑工具 作者情况
标题: 版本号: 发行号:
实行日期: 关键词
名称 模板:
原作者: 协作者: 校对: 审核:
表1 文档控制表VeFra bibliotekilogHDL程序编写规范 V1.0
2008年6月1日
Microsoft® Office Word 2003
刘兆庆 罗杰俊
I
哈尔滨工业大学自动化测试与控制研究所技术规范
4 可综合性编码规范........................................................................................................................18 4.1 寄存器描述.........................................................................................................................18 4.2 避免产生锁存器.................................................................................................................18 4.3 避免产生组合电路反馈。................................................................................................ 19 4.4 完整的敏感量列表.............................................................................................................20 4.5 阻塞和非阻塞赋值.............................................................................................................21 4.6 case 语句和 if-else 语句.....................................................................................................23 4.7 时序逻辑电路的描述.........................................................................................................24 4.8 对关键信号的描述.............................................................................................................25 4.9 避免使用延时语句.............................................................................................................25

verilog的代码规范和coding风格

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语法并不复杂,只是初学者容易犯一些&ldquo;类C&rdquo;错误,总会不经意间将verilog写成了C语言,或者是没有使用并行思想,或者就是多处赋值等等问题。

如果我们克服了之前的一些小毛病,在这些之外,我们想更近一步提升自己的写代码水平、研发水平,而不是只做一个码农的话那么我们要做的就是:第一步:提高代码规范性,每个企业、研究所可能都有自己的一套代码书写规范,但是总的来说都有一些共性,而且往往这些共性的地方还特别多,一个没有代码规范的程序员不可能写出非常漂亮和优秀的程序,当然有了规范的代码后也不一定就能写出漂亮和优秀的程序,这是两码事。

代码规范之后的一个境界我觉得是优良的编程风格,编程风格不同于代码规范,编程风格在verilog中特别指代那些逻辑上的风格,同样的功能,使用不同的编程风格,代码综合面积可能是几倍的关系,这一点我深有体会,另外,人们不经意间的编码习惯可能会导致许多冗余代码,在verilog综合之后,这些冗余就会成为实实在在多出来的不必要的电路,他们或者是寄存器或者是没用的组合逻辑,虽然往往DC一类的综合工具会对代码综合进行优化,并且会根据综合脚本进行最大化的优化计算,但是工具毕竟是工具,他不可代替人类,很多冗余电路综合工具并没有办法进行优化,因为工具并不知道你的本意,也不可完全进行语意预测,而不必要的电路意味着更多的流片成本,更低的work效率和更多的功耗消耗,这些都不是我们想看到的,所以一个好的coding风格本身对于企业来说就是非常大的价值!!!当然我认为要培养良好的coding风格并不是一件容易的事,本身 verilog design == 电路设计,透过代码看电路这个能力并不是一蹴而就的,这需要我们的长期的学习和思考总结,就像模拟设计一样,往往这是一种经验!。

FPGA代码编写风格规范

FPGA代码编写风格规范
(23) 在设计中避免实例化具体的门级电路。门级电路可读性差,且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。如果必须实例化门电路,我们建议采用独立于工艺库的门电路,如SYNOPSYS公司提供的GTECH库包含了高质量的常用的门级电路;
(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进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;

VerilogHDL编码规范

VerilogHDL编码规范

VerilogHDL编码规范目录Table of Contents1 范围 (3)2 综述 (3)3 详述 (4)3.1基本格式 (4)3.1.1标准文件头 .......................................................................... 错误!未定义书签。

3.1.2 include (4)3.1.3缩进格式 (4)3.1.4注释 (4)3.1.5保留字 (4)3.2模块与端口 (4)3.2.1模块命名 (4)3.2.2模块例化 (4)3.2.3端口定义 (4)3.2.4输入与输出寄存 (4)3.3信号与变量 (5)3.3.1信号命名 (5)3.3.2向量 (5)3.3.3数据流向 (5)3.3.4 Integer类型 (5)3.3.5位宽匹配 (5)3.3.6内部寄存 (5)3.4时钟与复位 (5)3.4.1时钟复位命名 (5)3.4.2时钟可见性 (6)3.4.3时钟不可做数据输入 (6)3.4.4门控时钟和门控复位 (6)3.4.5全局复位 (6)3.4.6时钟产生 (6)3.5设计风格 (6)3.5.1 if与case (6)3.5.2调试寄存器 (6)3.5.3异步复位 (7)3.5.4时钟事件 (7)3.5.5顶层 (7)3.5.6电路分级 (7)3.5.7资源共享 (7)3.5.8 for语句 (7)3.5.9标准模块 (7)3.5.10参数使用 (7)3.5.11避免SnakePath (8)3.6状态机 (8)3.6.1状态机命名 (8)3.6.2初始状态 (8)3.6.3双进程 (8)3.6.4状态分配 (8)3.6.5无效状态 (8)3.6.6状态机编码 (8)3.7赋值 (8)3.7.1阻塞与非阻塞赋值 (8)3.7.2避免Latch (8)3.7.3一个信号对应一个always (9)3.8 always (9)3.8.1敏感变量 (9)3.8.2边沿触发 (9)3.8.3单时钟(沿) (9)3.8.4避免Latch (9)3.8.5单(组)信号 (9)3.9可靠性 (9)3.9.1异步处理 (9)3.9.2亚稳态 (9)3.9.3异步反馈环路 (9)3.9.4避免Lacth (10)3.10综合 (10)3.10.1综合器开关 (10)3.10.2 for语句 (10)3.10.3运算符 (10)3.10.4移位变量 (10)3.10.5 PLI和TASK (10)3.10.6不可综合的语句 (10)参考文献............................................................................................ 错误!未定义书签。

Verilog开发代码风格积累

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条经验

个人总结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 如果空格太多则在深层嵌套时限制行长。

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

[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 个字符,这样做都是为了提高代码得可读性;
(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)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。

相关文档
最新文档