编码风格 --- 注释
<!---->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 |