智造工坊verilog代码规范
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
初级(缩进与对齐)
缩进与对齐 1) 所有缩进采用4空格形式,不允许出现tap字符(可用工具将tap转为空格) 2) 端口定义,参数定义,信号定义,赋值语句都需要做到行列对齐
初级(输出)
输出
模块所有输出端口在单独段内说明
初级(always块)
Always块
1) always块的begin end 采用如下方式 2) 一个always块内建议只对一个信号赋值(总线,解码等特例除外) 3)复位信号为单独层级进行描述
AFDX DDR3 Read Ctrl
LoopBack 4
Error Check Error Insert
LoopBack 3
Timer Mark
Timer Trigger
LoopBack 2
Ethernet MAC
LoopBack 1
Ethernet PCS/PMA
GTX
Register Timer Sync
Error Check Error Insert
LoopBack 3
Timer Mark
Timer Trigger
LoopBack 2
Ethernet MAC
规范前:
规范后:
• CNT1和CNT2比较逻辑被综合两次,两套电路浪费资源,提升功耗 • 不易于理解逻辑真实思想 • 不易于理解FPGA实现电路结构 • 增加CNT1和CNT2的扇出,降低时序性能 • 两次比较,增加逻辑出错概率(降低设计可靠性) • 增加调试负担
• CNT1和CNT2比较逻辑被综合一次,一套电路节省资源,降低功耗 • 易于理解逻辑真实思想(线性信号名就是最好的注释) • 易于理解FPGA实现电路结构(线性信号参与Always块) • CNT1和CNT2的扇出减少,提升时序性能 • 一次比较,降低逻辑出错概率(提升设计可靠性) • 降低调试负担(只需关注s_CMP1线性信号)
对齐方式 缩进方式
模块例化 顶层要求
初级(文件名,模块名)
文件名,模块名
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编号)
初级(参数定义)
参数定义
1)参数必须采用下图的格式统一定义,并用段注释标注 2)参数名以小写字母p_开头,后面用大写字母 3)每行缩进4个空格 4)参数定义,参数名,注释必须列对齐 5)数据参数定义必须标明进制位宽和数值 6)参数名缩写必须符合缩写规范(见信号定义部分)
初级(参数定义)
参数定义
状态机参数定义可以用以下方式:
初级(注释)
更改
逻辑修改的地方必须注明修改者,日期,修改内容等信息
初级(注释)
Timing&数据结构 对重要的接口Timing和数据结果做相应的注释
初级(端口定义)
端口定义
1)端口信号必须采用下图的格式定义 2)每行只定义一个信号 3)每行缩进4个空格 4)定义信号,注释必须列对齐 5)端口定义注释必须标明信号方向,信号位宽,信号含义 6)多位宽端口必须以[n:0]格式定义,n可以是参数 7)信号名缩写必须符合缩写规范(见信号定义部分)
缩写 en err dis pos neg frm in
名称 output ready receive transmit write read length
缩写 out rdy rx tx wr rd len
名称 count arbiter config decode encode
缩写 cnt arb cfg dec enc
初级(信号名缩写)
信号名缩写
以下为部分缩写:
名称 request acknowledge adress valid control clock delay
缩写 req ack addr vld ctrl clk dly
名称 enable error disable posedge negedge frame input
初级(注释)
文件头 文件头包含公司信息,文件名,模块名,模块功能,描述类型,版本,日期,作者,注释等信息
初级(注释)
模块分段 模块段包括 模块头,参数定义,信号定义,模块描述主体
初级(注释)
功能分段 根据不同的逻辑功能,把逻辑主体分成小段描述,更易理清逻辑思路
初级(注释)
寄存器
注释寄存器每bit的功能,读写属性,地址等信息
初级(模块结构)
模块结构
1) 所有参数必须在参数定义区统一定义 2) 所有信号变量必须在信号定义区按使用顺序统一定义 3) 所有输出信号必须在输出列表中统一描述 4) 逻辑描述区根据功能分段描述并加以分段注释 5)一个文件内只允许有一个模块
文件头 模块名 端口定义 参数定义 信号定义 输出列表 逻辑描述区 模块结束
顶层要求
1)顶层模块只允许例化子模块,不允许在顶层模块描述组合或时序逻辑 2)顶层模块只允许定义wire型变量,用以模块互联 3)顶层模块例化子模块需按照数据流顺序例化并加以编号
中级规范
组合逻辑 赋值 Case语句
状态机 时钟复位 异步处理
中级(组合逻辑)
组合逻辑 尽可能使用 assign语句设计组合逻辑
初级(信号定义)
信号定义
1)变量信号必须采用下图的格式统一定义,并用段注释标注 2)寄存器变量以小写r_开头,后面全部大写 3)线性变量以小写s_开头,后面全部大写 4)每行缩进4个空格 5)信号定义,信号名,注释必须列对齐 6)信号类型,位宽,含义必须注释清楚 7)多位宽信号必须以[n:0]格式定义,n可以是参数 8)信号名缩写必须符合缩写规范(见信号定义部分)
初级(注释)
注释
注释包含如下几部分: 1)文件头 2)段注释,将代码按不同的功能区间注释清楚 3)信号注释,用以说明端口信号,参数,变量的位宽,方向,类型,含义 4)重要接口Timing,寄存器需重点注释 5)复杂逻辑需重点注释
理念:优秀的逻辑架构 + 合理规范的信号命名 = 最好的注释 不合理的混乱的逻辑架构,杂乱无章的信号名,再好的注释也难以理解
ETH_REFCLK_P/N
Channel 1
Ethernet CLK(125MHz/12.5MHz/1.25MHz)
RSTN
PCIE_RSTN
XC7K160T
not and logic
SOFT_RST Register
CLK & Reset and logic MMCM_LOCKED
PCIE EndPoint
初级(基本要求)
基本要求
1) 代码中必须全部是英文格式字符 2) 代码中不允许出现多余空行 3) 代码中不允许行后出现多余空格 4) 代码中不允许出现tap字符,全部用4个空格替代 5) 每行代码尽量保证行列对齐 6)代码中不允许出现错误注释或前后矛盾的注释
初级(基本要求)
基本要求 不规范:
规范:
初级(例化)
例化
模块名 模块编号
模块名大写
xxxx Uxx_XXXX(
);
模块编号可根据项目大小和功能区分字段
clk_rst reg_ctrl
U00_CLK_RST U01_REG_CTRL
pcie_if _rx U10_PCIE_IF_RX pcie_if_tx U11_PCIE_IF_TX
初级(顶层要求)
中级(时钟输出)
时钟输出 时钟输出尽量用ODDR输出
规范前:
期望结果
BUS_CLK
BUS_DATA
D0
D1
D2
D3
Dn
实际结果
时钟延时不固定
D0
D1
D2
D3
Dn
• BUS信号为外部输出信号,设计者本意是时钟输出的上升沿在数据总线窗口的中间 • 由于时钟布线延时,时钟上升沿窗口不可预测 • 接收端很可能出现采样亚稳态现象,造成数据不稳定 • 由于综合布局布线的变化,可能出现每次布线后接收端采样结果不同 • 如果r_BUS_DATA_OFF没有放入IOB寄存器,数据采样更加混乱
不同公司根据自身的业务类型和管理理念,具有不同的代码风格和代码规范。本课程仅阐述本公 司的代码规范,供初学者参考学习。本课程如有不合理之处或对课程中的规范有更好的建议,请 及时提出,一经确认采纳,定有重谢!
联系方式: 邮箱:Jonchen@logiccell.cn QQ : 517343565
Verilog代码规范作用
Timer Trigger
LoopBack 2
Ethernet MAC
LoopBack 1
Ethernet PCS/PMA
GTX
BUFG
ui_clk (150MHz)
200MHz
MMCM
BUFG
PCIE(125MHz)
DDR3(150MHz)
Ethernet CLK (125MHz/12.5MHz/1.25MHz)
Verilog 代码规范
陈永/Jon chen 2015.12.16
FPGA项目规范体系
智造工坊FPGA项目的执行需要严格按照完整的规范体系完成,代码规范只是一个组成部分。
智造工坊FPGA项目规范
流
工
文
代
实
仿
测
验
维
程
程
档
码
现
真
试
收
护
规
规
规
规
规
规
规
规
规
范
范
范
范
范
范
范
范
范
代码规范声明
本课程所述的Verilog代码规范是根据本公司近20年来数百个FPGA项目经验总结出的规范,旨在 提高内部工程师工作效率和工作质量。
Channel 4
Ethernet CLK(125MHz/12.5MHz/1.25MHz)
100MHz
CLK & Reset
MIG
AFDX DDR3 Write Ctrl
AFDX DDR3 Read Ctrl
LoopBack 4
Error Check Error Insert
LoopBack 3
Timer Mark
规范后:
期望结果
BUS_CLK BUS_DATA
实际结果
D0
D1
D2
D3
Dn
ODDR,OFF到引脚上延时是相对固定的,时序模型可控
IBUFGDS
IBUFGDS_GTE2
XC7K160T
Local(100MHz)
IBUFGDS_GTE2
AFDX DDR3 Write Ctrl
AFDX DDR3 Read Ctrl
AFDX DDR3 Read Ctrl
LoopBack 4
Error Check Error Insert
ቤተ መጻሕፍቲ ባይዱ
LoopBack 3
Timer Mark
Timer Trigger
LoopBack 2
Ethernet MAC
LoopBack 1
Ethernet PCS/PMA
GTX
AFDX DDR3 Write Ctrl
LoopBack 4
Error Check Error Insert
LoopBack 3
Timer Mark
Timer Trigger
LoopBack 2
Ethernet MAC
LoopBack 1
Ethernet PCS/PMA
GTX
Channel 2
Ethernet CLK(125MHz/12.5MHz/1.25MHz)
Channel 3
Ethernet CLK(125MHz/12.5MHz/1.25MHz)
PCIE EndPoint
PCIE Control
125MHz
PCIE DDR3 Write Control
PCIE DDR3 Read Control
AXI Interconnect
AFDX DDR3 Write Ctrl
初级规范 (外在形式,基本规范,风格统一即可) 增加代码可读性,复用性,统一性,维护性
中级规范 (基本保障,建议统一执行) 提升编码效率,降低语法出错率和逻辑出错率
高级规范 (经验总结,建议在项目中体会) 提高代码实现效率,优化FPGA逻辑资源,提高设计可靠性和稳定性
初级规范
文件名与模块名定义 文件头 注释 模块内部结构 端口定义 参数定义 信号定义
PCIE_RESET_OUT
PCIE Control
PCIE DDR3 Write Control
PCIE DDR3 Read Control
AXI Interconnect
MIG
SYS_RSTN
MIG_RST ETH_RST
AFDX
AFDX
DDR3
DDR3
Write Ctrl Read Ctrl
LoopBack 4