集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2091|回复: 2

verilog编码风格详细解析

[复制链接]
IPO 发表于 2010-6-21 15:17:42 | 显示全部楼层 |阅读模式
编码风格 --- 注释
<!---->1. 在文件头列出文件名,作者,作者的email, 版本, 关键字,目的, 以及使用了多少个时钟,需要注意的内容

2. 单行注释使用 // 而不用/*...*/

3.每个功能模块要用注释描述

4. 每个端口都需要有描述
<!---->
编码风格 --- 命名规则
<!---->1. 一个module一个文件

2. 文件名根据内容来命名,如果是task,那么名字的后缀应该加上_task来表示文件内是一些task。

3. 文件名要有意义,描述文件内容。

4. 第一个字符必须是字母,允许使用数字和字母以及下划线

5. 如果名字中有几个单词那么要用下划线隔开

6. 文档和代码中的名字要一致

7. 宏定义和参数全部用大写,其他最好都用小写

8. 宏定义要在顶层模块,因为它是全局的

9. 单个例化时,使用同模块相同的名字,如果有多个例化,加后缀

10.信号名的后缀有很多来表示信号的属性,如
  _z 高阻信号
  _b 低有效信号

11. 在自模块命名上,需要跟上所有上层模块名字作为前缀

12. 整个设计中使用一致的信号名

13. 信号名长度不超过32个字符
编码风格 --- 编写风格
<!---->1. 代码要表格化,便于阅读

2. 代码用空格对齐,用空格代替tab

3. 一行一个表达式

4.每行写一个端口申明

5. 端口申明的顺序要和模块申明时保持一致

6. 内部的线必须显示申明, 最好在端口申明后一起做申明

7. 一行不要超过80个字符

8.没有特殊必要,不同的时钟要放在不同的模块

9. 不能有组合的环路

10.所有的寄存器都需要初始化
编码风格 --- 其他
<!---->1 . 不赋 x 给任何信号;

2. 同一个reg值不能在2个always结构里赋值;

3. 少用或不用宏(`define),用参数(parameter)来代替;

4. 宏不重复定义;

5. 在保持常数定义之间关系

6. 用参数来代替状态编码

7. 如果在一个设计中使用了`define的,那么在设计结束一定要使用'undef

8. 地址的产生用基址+偏移实现

9. 基址必须可调

10.寄存器的值要常数

11.`ifdef 套嵌不能超过3级

12. 操作数的位数必须相符

13. 在例化时,模块间的互连使用名字而不是位置

14. 输出的位数和申明的位数必须相同

15.端口互连时候位数一致

16.尽量避免使用inout

17. 在复杂的算术方程中,使用括号

18. 状态机编程时,使用2段式编程

19. 不使用内部的3态门

20. 不使用三态输出
<!---->
编码风格 --- 与综合相关
<!---->1. 在描述组合逻辑时,在always块中要完备敏感列表

2. 每个always的敏感列表中只存在一个时钟

3. 在描述条件时,即if或者case中,完备所有分支

4. 要对输出做缺省的赋值

5. 不使用full_case综合的指示符

6. 避免顶层的glue逻辑

7. 使用阻塞赋值在组合逻辑中,使用非阻塞在边缘敏感的块中

8. 所有未使用的端口都要有驱动

9.所有的端口都需要连接到一个悬空的线上

10. 设计中不要引入latch

11. 不能使用casex

12. 不使用内嵌的综合脚本

13. 避免使用直接例化门
编码风格 --- 高层次设计考虑
<!---->1. 在不是不得以的情况的话,不是用异步设计。而应该使用同步设计。

2. 分割模块
  把一个设计分割为几个易于管理的块,有利于团队工作。如果只有一个主要功能模块则分为几个子模块。遵循SPEC分割。

3. 复位
  要对DFF和LATCH进行复位。设计时采用异步复位。复位信号要直接连入FF。

4. 对于FF的输出要用非阻塞语句。每个FF只能在一个always块中赋值。FF最好规定单沿触发。

5. 有些地方也不一定要用非阻塞语句。比如要从一个时钟产生另一个时钟时:
  always @(posedge clka)
    clkb = ~clka;

6. 有些时候也不是必须要统一一个沿触发,如DDR。

7. 组合逻辑
  简单的组合逻辑用连续赋值实现。复杂的用always。描述组合逻辑时,一个需要注意的是latch的引入,要把if和case 的条件写全。

8. 组合的case
  在case前赋值,来使case条件完备,不会出现额外的latch




模板

//
//$Log$
//

//************************************************//
//function:
//
//
//************************************************//
//include files
`include ".."

//definitions
`define HAHA VALUE

module (
//inputs
signals ,//注意此处,标号对齐,
signals ,//方便module实例化
//outputs
signals ,
signals ,
signals
);
//*************************************************//
//***************** inputs and outputs **************//
//*************************************************//

input signals;
output signals;

//*************************************************//
//***************** wire declaration **************//
//*************************************************//
wire signals;
wire signals;

//*************************************************//
//**************** registers declaration ************//
//*************************************************//
reg registers;
reg registers;

//*************************************************//
//***************** function block 1 ************//
// function description //
//
//*************************************************//
always @(...)
begin
...;
end

assign ...;

//*************************************************//
//************** function block 2 **************//
//
//*************************************************//
always @(...)
begin
...;
end

assign ...;
endmodule
CPLD 发表于 2010-6-23 18:34:42 | 显示全部楼层
verilog编码风格详细解析
Sunlife 发表于 2015-5-20 15:35:35 | 显示全部楼层
           受益匪浅
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 23:00 , Processed in 0.068516 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表