您的位置:首页 > 其它

FPGA——verilog编写规范

2018-01-14 19:56 711 查看
这个寒假本来是想出去找份实习工作,锻炼一下自己的动手能力,结果事与愿违,当然,我只能怨自己会的太少。所以现在在只能窝在家里。
这个寒假我想打牢我FPGA的基础。把特权同学的《深入浅出FPGA》读完,并且将自己学到的东西,写到博客上来。
代码规范是一个大问题,特别是我在看学弟学妹写的verilog代码的时候,真的深有体会,想哭的感觉都有了。
网上有一份“据说”是华为内部的代码规范。我手打过来,避免自己忘记和也方便我自己过来看。


设计风格

低电平有效的信号,信号后缀名“_n”

模块名小写

module例化名用U_xx_x(多次例化用次序号0、1、2…)

使用降序排列定义向量有效位顺序,最低为是0

采用小写字母定义wire,reg和input/inout/output (注:inout这种形式,我没有用过)

采用大写字母定义 参数,参数名小于20个字母

时钟信号应前缀“clk”,复位信号应前缀“rst”

三态输出的寄存器信号应后缀“_z”

代码中不能使用保留字

输出信号必须被寄存

三态逻辑可以在顶层模块使用,子模块中避免使用三态

没有未连接的端口

到其他模块的接口信号,按如下顺序定义端口信号:输入、双向、输出

建议使用coregen生成的乘法电路

采用基于名字的调用而非基于顺序的调用

不要书写空的模块,即一个模块至少要有一个输入和一个输出

时钟事件的表达式要用“negedge ”或“posedge ”的形式

异步复位,高电平有效用“if( == 1’b1)”,低电平有效用“if( == 1’b0)”

if语句不能嵌套太多

建议不适用include语句

建议每个模块加timescale

代码中给出必要的注释

每个文件 有一个文件头

每个文件只包含一个模块

模块名和文件名保持一致

设计可靠性

同步时序逻辑的always block中有且只有一个时钟 信号,并且在同一个沿动作

同步时序逻辑的module中,在时钟信号的同一个沿动作

采用同步设计,避免使用异步逻辑(全局异步复位除外)

一般不要将时钟 信号作为数据信号输入

不要在时钟路径上添加任何buffer

不要门控时钟

在顶层模块中,时钟信号必须可见

不要采用向量的方式定义一组时钟信号

不要在模块内部生成时钟信号,使用DLL/PLL产生时钟信号

建议使用单一的全局同步复位电路或者单一的全部异步复位电路

不要在复位路径上添加任何buffer,也不要使用任何门控复
9f47
位信号

不适用PLI函数

建议不适用任务

不使用事件变量

不使用系统函数

不使用用户自定义单元(UDP)

不使用disable语句

不适用===、!===等不可综合语句

建议不使用forever、repeat、while等循环语句

避免产生Latch(除CPU接口)

组合逻辑语句块敏感表中的敏感变量必须和该块中使用的相一致,不能多也不能少

在一个always语句块中只能有一个事件列表

在时序的always块的敏感事件列表必须都是沿触发事件

数据位宽要匹配

不使用real、time、realtime类型

建议不使用integer类型

移位变量必须是一个常数

避免使用异步反馈电路

时序逻辑语句块中统一使用非阻塞幅值

组合逻辑语句块中使用阻塞性赋值

非阻塞型赋值应不见单位延时,尤其是对于寄存器类型的变量赋值时

不常用规则

整数常量基数格式中不能有“?”

字符串不能含有控制字符

不要在连续赋值语句中引入驱动强度和延时

不要为net、n_input、n_output、enable_gate型变量定义驱动强度、电荷保持强度以及延时

禁止使用空的时序电路块及非法的always语句块

禁止使用triregNET型定义

禁止使用tri1、tri0、triand和trio型的连接

在RTL级代码中不能含有initial结构,也不可以对任何信号进行初始化赋值,而应采用复位的方式进行初始化

不要在过程语句中使用assign、deassign、force、release等语句

不要使用wait语句

不要使用fork-join语句

不要为驱动类型supply0和supply1型的连接赋值

设计中不适用macro_module

不要在RTL代码中实例门级单元

不要使用specify模块

——————————————————————

就是这些了,在看这些规范的时候,有很多名词我都不了解,说明自己真正会的东西实在是少之又少,必须得继续努力了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: