没有合适的资源?快使用搜索试试~ 我知道了~
verilog书写规范[参考].pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 141 浏览量
2021-10-12
01:19:57
上传
评论
收藏 28KB PDF 举报
温馨提示
试读
14页
verilog书写规范[参考].pdf
资源推荐
资源详情
资源评论
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.命名的习惯
选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处、有效
状态等基本含义,下面给出一些命名的规则。
用有意义而有效的名字
有效的命名有时并不是要求将功能描述出来,如
For ( I = 0; I < 1024; I = I + 1 )
Mem[I] <= 32’ b0;
For 语句中的循环指针 I 就没必要用 loop_index 作为指针名。
用连贯的缩写
长的名字对书写和记忆会带来不便,甚至带来错误。采用缩写时应注意同一信号在模块中
的一致性。缩写的例子如下:
Addr : address
Ptr : pointer
Clk : clock
reset
用最右边的字符下划线表示低电平有效, 高电平有效的信号不得以下划线表示, 短暂的引擎
信号建议采用高有效。
如: Rst_,Trdy_, Irdy_ , Idsel.
大小写原则
名字一般首字符大写,其余小写(但 parameter, integer 定义的数值名可全部用大写) ,两
个词之间要用下划线连接。
如: Packet_addr,Data_in,Mem_wr Mem_ce_
全局信号名字中应包含信号来源的一些信息。
如: D_addr[7:2] ,这里的“ D”指明了地址是解码模块 (Decoder module) 中的地址。
同一信号在不同层次应保持一致性。
自己定义的常数、类型等用大写标识
如: parameter CYCLE=100 ;
避免使用保留字
如: in ,out,x,z 等不能够做为变量、端口或模块名
添加有意义的后缀,使信号名更加明确,常用的后缀如下:
寄存后的信号 _reg
芯片的双向信号 -xbio
芯片的三态输出 _xz
芯片的漏极开路输出 _xod
芯片原始输出信号 _xo
芯片原始输入信号 _xi
下降沿有效的寄存器 _f
连到三态输出的信号 _z
寄存前的信号 _next
时钟信号 _Clk
意义 后缀
一个 module 一个文件,且文件名能与 module 名对应起来
4.1.2.Modules
顶层模块应只是内部模块间的互连。
Verilog 设计一般都是层次型的设计,也就是在设计中会出现一个或多个模块,模块间的调
用在所难免。可把设计比喻成树,被调用的模块就是树叶,没被调用的模块就是树根, 那么
在这个树根模块中, 除了内部的互连和模块的调用外, 尽量避免再做逻辑, 如不能再出现对
reg 变量赋值等。这样做的目的是为了更有效的综合,因为在顶层模块中出现中间逻辑,
Synopsys 的 design compiler 就不能把子模块中的逻辑综合到最优。
每一个模块应在开始处注明文件名、 功能描述、 引用模块、 设计者、 设计时间及版权信息等。
代
码中的所有说明、注释必须均为英文。需要特别说明的是,必须对 Revision History 要格外
重视,必
须将每次版本修改的信息按照时间一一详加叙述,以保持版本的可读性与继承性。
如: /* ======================== *\
Filename ﹕ RX_MUX.v
Author ﹕
Description ﹕
Called by ﹕Top module
Revision History ﹕99-08-01
Revision 1.0
Company ﹕ Huawei Technology .Inc
Copyright(c) 1999, Huawei Technology Inc, All right reserved
\* ========================= */
不要对 Input 进行驱动 , 在 module 内不要存在没有驱动的信号,更不能在模块端口中出现
没有驱动
的输出信号,避免在 elaborate 和 compile 时产生 warning ,干扰错误定位。
每行应限制在 80 个字符以内,以保持代码的清晰、美观和层次感。
一条语句占用一行,如果较长(超出 80 个字符)则要换行。
电路中调用的 module 名用 Uxx 标示, Cell 名用 Vxx 标识。向量大小表示要清晰,采用
基于名字
(name_based )的调用而非基于顺序的( order_based )。另外,调用模块时调用关系要写
全,否
则,在用 synplify 综合过程会出 warning 。
Instance UInstance2(
.DataOut (DOUT ),
.DataIn (DIN ),
.Cs_(Cs_ )
);
用一个时钟的上沿或下沿采样信号, 不能一会儿用上沿, 一会儿用下沿。 如果既要用上沿又
要用下沿, 则应分成两个模块设计。 建议在顶层模块中对 Clock 做一非门, 在层次模块中如
果要用时钟下沿就可以用非门产生的 Posedge Clk_, 这样的好处是在整个设计中采用同一
种时钟沿触发,有利于综合。
在模块中增加明了的英文注释。
对信号、参量、引脚、模块、函数及进程等加以说明,便于阅读与维护。
Module 名要用大写标示,且应与文件名保持一致。
如: Module DFF_ASYNC_RST(
Reset,
Clk,
Data,
Qout
);
严格芯片级模块的划分
只有顶层包括 IO 引脚 (pads) ,中间层是时钟产生模块、 JTAG 、芯片的内核 (CORE) ,这
样便于
对每个模块加以约束仿真,对时钟也可以仔细仿真。
模块输出寄存器化
对所有模块的输出加以寄存(如图 1 ),使得输出的驱动强度和输入的延迟可以预测,从
而使
得模块的综合过程更简单。
- 输出驱动的强度都等于平均的触发器驱动强度
- 输入延迟始终等于通过触发器的路径,近于相等
(图 1 )
将关键路径逻辑和非关键路径逻辑放在不同模块
保证 DC 可以对关键路径模块实现速度优化,而对非关键路径模块实施面积优化。在同一
模块
DC 无法实现不同的综合策略。
将相关的组合逻辑放在同一模块
有助于 DC 对其进行优化,因为 DC 通常不能越过模块的边界来优化逻辑
ultraedit 中的 tab 键设置为 4 个空格键
输入输出的端口定义分行写,一行定义一个输入输出,顶格对齐
module 头中的括号内的输入输出的定义按输入输出分开,与括号对齐
module 用到的变量统一在输入输出的定义之后, 按 wire 和 reg 型分开定义, 并对重要的信
剩余13页未读,继续阅读
资源评论
czq131452007
- 粉丝: 2
- 资源: 12万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功