文件名称:
verilog代码风格VerilogCodingStyle
开发工具:
文件大小: 466kb
下载次数: 0
上传时间: 2019-09-02
详细说明:verilog代码风格VerilogCodingStyle目录
Verilog hdl程序风格指导
目录
1.引言.
般的指导方针
命名规则
注释
格式
··
有限状态机实现风格
文件和目录结构
13444566777
3.逻辑实现..
设计方法
组合逻辑…
时序逻辑
4. Verilog结构
赋值
always块
······:4·····.·····.+·::·:···+·4···
..····
语句
if-then-else语句
端口声明
13
函数( function)和任务(task)
14
数值
延时
引言
在由多人参加的设计项目中,为了加强项目管理,方便设计人员之间的协
同工作,帮助后续人员顺利地了解项目,减少错误以及优化代码质量,有
必要制定一种比较统一的程序设计风格。本文的目的就在于初步尝试在公
司工程屮心内部建立这样一种风格,文屮的许多细节需要大家在工作屮实
践并讨论确定。
一般的指导方针
命名规则
无论使用何种语言编程,规定一种变量的命名规则都是十分必要的。对丁
Verilog hdl也同样如此。绝大部分 Verilog川户都使用类似C语言的风格来给
变量命名。信号或变量的名字应该能够较好地反映它们的功能。
规则
所有的信号( signal),变量( variable)以及模块( module)的名字都用小
写字母,参数( parameter)和宏( macro)的名字川大写字封。用下划线(’)
来分隔名字屮的不同部分,但不能用它作为名字的第一个或最后一个字符。
说明:
这样可以使代码有更好的可读性,并且避免了在大小写敏感的工具中可能
会遇到的问题,同时也可以很容易地丛代码中辨认出参数( parameter)
示例:
不好的
好的:
parameter width =16
parameter WIDTH=16
input wwidth-1 DataIn;
input [Width-1] data in
规则:
低有效信号必须以”n”结尾。
说明:
这样可以很容易地把高有效信号和低有效信号区分开来,对于TP块尤其有
用
规则:
时钟信号的名字以ck为前缀,然后是本身的描述,并以“src”或“drv”
后缀。“drw”表示该信号是一个时钟扇出树的输出并只用于驱动触发器的
时钟端;“src”表示该信号只用于作为时钟的输入端。
说明:
时钟和复位信号的名字在整个设计中必须一致。这样可以简化许多后续的
设计步骤。
规则:
信号( Signal),变量( variable),模块( module),有限状态机的状态(FSM
statc)等应该使用有意义的名字,禁止使用任何 Verilog/VHDl中的保留字。
说明:
这样可以使HDL代码更为可读。常用的前/后缀如'addr’(地址),'ctrl(控
制),'en’(使能),"data’(数据),'val(值)等可以有效地帮助理解设计
的功能。因为冇吋候可能需要把设计移植到另一种HDL语言中去,所以不
能使用任何保留字。
示例:
不好的:
好的
wire wl
wire addr bus en
reg diff
reg bus addr val;
state names so.sls2
state nameS DLERUN WaIt
注释
在程序设计中最困难的部分是重用别人的代码。如果不使用注释来描述功
能的话,有吋候看懂一段程序或模块的功能几乎是不可能的。即使对于自
口,注释也是有用的。因为有时候理解自己曾绎汝计的模块也是困难的
所以正确地使用注释非常重要。不过注释的篇幅需要衡量,太多的注释也
会令人困惑
规则:
在每个文件开始处要加入文件描述,内容包括该程序的名字,功能,版本
变化等信息。描述中不能使用中文。
说明:
便于他人或自己理解代码,版本变化信息有助于检查错误。使用中文会影
响代码在不同工具之间的可移植性
示例
// Design
80386EX
// File name:80386exy
/ Purposc
modcl of a 80386EX microprocessor. Fully compliant with the
specification of Inte
Limitations A clock frequency 33MHz is assumed
// Errors
none known
Include files none
/ Author
Engineer name
Shanghai Fudan microelectronics Co, Ltd
/ Simulator
Aclive-HDL 4.2
// Revision list
/ Version
Author
Date
langes
/1.0
mehod
2001/7/1
original created
changes指的是每次对该文件所做的改动及其原因。
规则
对模块和每个重要的代码块使用注释来描述其功能。
说明:
这样可以使他人能够在合理的时间内理解你的设计
示例
describe the functionality of the module
IO constraints
module top(…);
i implements comb/seq logic for.*/
always (a(…)
格式
致的代码格式风格可以确保代码的可读性和可重用性。
规则:
使用两个空格作为缩格,不使用tab。
说明:
在源代码中的tab会降低代码的可移植性,因为不冋的编辑器对tab的解释
可能会有所不同。2个字符的缩格已经足以反映代码的结构了。
规则
限制每行代码的长度,最大不超过80个字符。
说明:
太长的代码行会影响可读性,最好把它们拆成多行。
有限状态机实现风格
有限状态机经常用于实现控制逻辑。有许多图形化的FSM设计工具,它们
可以很容易地帮助生成高质量的HDL代码。最好是利用这些工具,而不是
手工编写代码。
建议:
如果不是对寄仔器数目很敏感,使用 Moore模犁比 Mealy模型好。
说明:
More模型的状态只与当前状态有关,而 Mealy模型的状态与当前状态以
及输入都有关
由于 Mealy机的输出依赖输入,这意味着电路中会有异步路径。而More
机可以减少时钟冲突,但会增加状态数量。另一种可行的方法是把输出包
含在状态向量中,从而把输出逻辑和下一状态逻辑合并;或者川寄存器单
独保存输出。这样可以得到带有寄存器输出的完全同步的设计
文件和目录结构
规则:
文件名必须和模块名相一致。
说明:
便于根据文件名叠找所需要的模块。
规则:
每个设计至少有四个主要的目录:src,sim,syn和 library,这些目录是由
手工在工作目录下建立的。
●src目录包含了所有的设计源文件和元件文件。
● library月录包含了所有的外部文件。这个月录有和听用到的库一样多的子
目录数,每个子目录的目录名必须和所用的库命一样。
●syn目录包含了所有的综合以及P&R( Placed and routed)后产生的输出文件。
如果综合的目标工艺有许多个,每个目标都必须有自己的目录并以目标工
芒命名。综合脚本文件( script file)目录必须包含在此目录忠义存放所有的
综合工具使用到的脚本文件。
sim目录包含了4个主要的目录:tb目录包含了测试平台( test bench)文件
和所有的输入文件; scripts目录包含了所有的与综合工具无关的脚本文件
rtl目录或是 pre syn目录包含了所有的rt或是 behavioral设计的仿真结果;
a directory for each structural simulation named the technology used
说明:
把不同用途或不同阶段的文件区分存放,便于查找文件,减少混乱。
逻辑实现
设计方法
在设计比较大的或复杂的电路时,有必要遵循一些规则以避免浪费时问的
重新设计或达不到设计要求(即:时序和面积)的逻辑错误。绝大部分问题是
在设计流程的后端如综合及布局布线时才显露出来的。如果设计人员意识到这
些问题并且知道如何避免它们,那就可以减少许多设计上的反复并缩短产品推
向市场的时间。
规则:
在设计层次中找到一个确的平衡点。
说明:
在规划设计时应该仔细考虑整个设计的层次。太大的模块(长达数百行的
HDL代码)可能会变得难以管理并会导致无法接受的软件运行时间。而太
小的模块(只有若干门)会妨碍综合工具进行逻辑优化。因此模块应当实
现一定数量的逻辑,其结果为一中等规模的网表(1000-50,000门)。
规则:
所有主要模块的输出必须是经由寄存器输出的。
说明:
这一点非常重要,因为这样可以避免在不同功能块之间存在异步路径。如
果设计是遵循这一规则的,综合工具能够比较容易地满足时序约束
规则:
顶层模块的连线和总线数目应该最小
说明
顶层信号是第一层模块之间的信号。因此它们常常穿越整个芯片,具有可
观的线延迟。太多的顶层信号很容易引起收敛和布线的问题。因此如果使
用数据总线来代替多条独立的信号线连接顶层模块,那么芯片的布局会变
得更快,结果也更好。
组合逻辑
在Ⅴ erilog中有两种常用的方式用来实现组合逻辑:连续赋值( continuous
assignments)和 always块( always block)。对于小而紧凑的逻辑功能,用连续
赋值是最合适的; always块适用亍比较大的模块。 Always中的敏感列表必须仔
细定义以避免出现不必要的锁存器。
规则:
对于小的等式使用连续赋值,对于人的逻辑用 always块。在组合逻辑中只
使用阻塞赋值。
规则:
在组合逻辑中不要使用反馈。
说明
这样会形成异步电路。
时序逻辑
规则:
对丁 always块中的吋序逻辑只使用非阻塞赋值。在其他描述前先说明异步
的行为
说明
异步行为必须在 if-then-else语句前说明以便综合工具确识别
例
8-bit counter with parallel load
always((posedge clk or negedge res n)
begin: main
f(resn=-1b0)∥异步复位
cnt<=8h00
if (load ==1bl)
cnt<=load data
cnt<-cnt+1
end
4. Verilog结构
赋值
Verilog有多种赋值结构: continuous, procedual blocking/ nonblocking, procedual
continuous。第一种只用于组合逻辑,最后一种仪仪是知道,根本不要去用。因
此问题就是:“什么时候该用阻塞或是非阻塞式的赋值呢?”。下面的规则可以
保证在不同的仿真程序之间有良好的可移植性,并且能够避免绝大部分由于使
川赋值不正确而带来的问题。
规则
在 always块中只使用阻塞赋值来描述组合逻辑。
规则
只使用非阻塞方式来描述时序逻辑。
规则
不要在同一个 always块中同时使用阻集和非阻隼方式。
规则
不要在不同的 always块屮对同一个变量赋值。
规则
不要在位宽不一致的信号之间赋值。
a⊥ways
块
Always块是 verilog中最常仗用的结构。触发器的定义对于避免常规错误十
分重要。以下规则可以避免在组合逻辑中加入透明缩存器
规则:
对于描述组合逻辑的 always块,在其敏感列表中要加入所有在块中会被读
到的信号(比如在等式右边的信号,作为条件的信号等等)。
说明:
这条规则休证了在综合中不会出现不需要的缩存器。因为综合工其的目的
是实现与RTL代码功能等价的门级实现。因此如果在敏感列表中遗漏了某个信
号,仿真程序不会在该信号翻转吋触发这个 always块,这意味着该信号的翻转
不会导致输出信号的变化。为了与这个行为匹配,综合工具不得不加入一个锁
存器
小例
2-1 multiplexer resulting in an inferred latch
always a( a or sel)∥不完全的敏感列表
begin: mux
case(sel)
1 b0
y=a,
1b:y=b;∥<-b出现在等式右边,
default:y=1bx;∥但是不在敏感列表中!
endcase
end
case语句
Case语句广泛地被用在逻辑模块中。大部分用case语句实现的逻辑不要求
有优先级的模式,因此设计人员应该遵循一些基本的规则让综合工具产生并
逻辑(高速),而不是优先逻辑(低速)。
规则:
如果不需要优先级,那么必须确保不同的条件是互斥的。
说明
综合工具在分析HDL代码吋会检查相互覆盖的case语句。如果有这样的情
况,就会产生优先逻辑。串行逻辑匕全并行逻辑慢多了
示例
实现4-2编码的两种方法
不好的:
always((din)
10
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.