Verilog 编写规范
在学习Python时,作者有一句话对我影响很大。作者希望我们在学习编写程序的时候注意一些业内约定的规范。在内行人眼中,你的编写格式,就已经暴露了你的程度。学习verilog也是一样的道理,一段好的verilog代码,在完成设计要求的前提下,还需要条理清晰,有对应的注解,对非作者而言应该是友好的。因为对数字IC设计也处于初级阶段,前期所写的基本是在搜集资料的基础上,添加一部分个人的理解,希望通过自己的不断学习,沉淀出自己独到的见解。
对于Verilog编写规范,网上的资料比较散,其中较好的我觉得是2001版华为的编写规范。下面简称规范(https://wenku.baidu.com/view/bbad6339fe00bed5b9f3f90f76c66137ee064fc8.html)百度文库
我将在次规范的基础上加入一些补充:
1.低电平有效信号,信号后加‘_n’。
2.模块名小写。
3.module例化名用U_xx_x表示(多次例化用次序号0.1.2...)。
4.使用降序排列定义向量有效位顺序,最低位为0。
5.采用小写字母定义reg,wire和input/output/inout。
6.采用大写字母定义参数,参数名小于20个字母。
7.时钟信号应前缀‘clk’,复位信号应前缀‘rst’。
8.三态输出寄存器信号应后缀‘_z’。
9.代码中不能使用VHDL保留字,更不能使用Verilog保留字。 ps:具体有哪些保留字可以百度搜索,这里不列举。
10.输出信号必须被寄存(只对顶层模块)。ps:在查阅的各种资料中,都有提及这一点。
11.三态逻辑可以在顶层模块中使用,子模块中避免使用三态。
12.没有未连接的端口。
13.到其他模块的接口信号,按如下顺序定义端口信号:输入,(双向),输出。
14.建议使用coregen生成乘法电路。
15.采用基于名字的调用,而非基于顺序的调用。
16.不要书写空的模块,即用一个模块至少要有一个输入和一个输出。
17.时钟事件的表达要用‘negedge<clk_name>’ 或 'posedge<clk_name>'的形式。
18.异步复位,高电平用‘if(<rst_name> == 1'b1)’,低电平有效用‘if(<rst_name> == 1'b0)’。 ps:if 内的判断条件位宽为1。
19.if语句不能嵌套太多。
20.建议不使用include语句。
21.建议每个模块加timescale。
22.代码中给出必要的注释。
23.每个文件有一个文件头。ps:我的理解是每个文件最开头应用注释好,所写模块的名字、功能、版本、时间等。
24.每个文件只包含一个模块。
25.模块名与文件名保持一致。
26.同步时序逻辑的always block中有且只有一个时钟信号,并且在同一个沿动作(如上升沿)。
27.同步时序逻辑的module中,在时钟信号的同一个沿动作。
28.采用同步设计,避免使用异步逻辑(全局信号复位除外)。
29.一般不要将时钟信号作为数据的信号输入。
30.不要在时钟路径上添加任何的buffer。
31.不要门控时钟。ps:
32.在顶层模块中,时钟信号必须可见。
33.不要采用向量的方式定义一组时钟信号。
34.不要在模块内部生成时钟信号,使用DLL/PLL产生的时钟信号。
35.建议使用单一的全局同步复位电路或者单一的全部异步复位电路。
36.不要在复位路径上添加任何的buffer,也不要使用任何门控复位信号。ps:复位路径上添加buffer,会使得复位信号到触发器复位接收端口产生延迟,skew的产生,可能无法满足复位恢复时间,从而导致亚稳态的产生。 门控会使得复位信号产生毛刺,增加亚稳态发生的可能性。
37.不使用PLI函数。
38.不使用事件变量。
39.不使用系统函数。
40.建议不使用任务。
41.不使用用户自定义单元(UDP)。
42.不使用===,!==等不可综合运算符。
ps: 补充Verilog不可综合语句。
initial(只在testbench中使用)、events(在同步testbench时更有用)、real time、assign和deassign(reg型无法综合,但是wire型可以)、fork join、primitives(只支持门级原语综合)、table、敏感列表中同时带有posedge和negedge(如always@(posedge clk or negedge clk)begin end 这个无法综合)、同一个reg被多个always块驱动、延时 #time ,比如a = #5 b ,此处仿真时候是可以的,但是在综合时会自动忽略掉#time,相当于a = b、X或Z(未知态和高阻态),在条件表达式中不要使用它们,确保可以综合。
43.不使用disable语句。
44.建议不使用forever,repeat,while循环语句。
45.避免产生latch(除CPU接口)。 ps:在if语句或者case语句中的所有条件分支中都有对变量有明确的赋值,不然会综合出latch。
46.组合逻辑语句块敏感列表中敏感变量必须和该模块中使用的相一致,不能多也不能少。
47.在一个always语句中,有且仅有一个事件列表。
48.在时序always块的敏感事件列表中,必须都是沿触发事件,不允许出现电平触发事件。
49.数据位宽要相匹配。
50.不使用real,time,realtime类型。
51.建议不使用integer类型。
52.位移变量必须是一个常数。
53.避免使用异步反馈电路。
54.时序逻辑语句块中统一使用非阻塞型赋值。
55.组合逻辑语句块使用阻塞型赋值。 ps:对于54 55需要了解一下阻塞和非阻塞的区别。 非阻塞赋值语句,右端表达式计算完并不会立刻传递给左端,而是等待下一个事件触发前一刻再传递给左端,且它们是并行的。就是说,在所有的右端表达式在时钟有效沿到来之时开始计算,等到下一个时钟有效沿到来之前一刻,将值同时赋值给了左端。可以想象出它对时钟沿触发描述的恰到好处,所以用在时序逻辑中。 阻塞赋值语句,在每个右端表达式计算完之后,立刻传递给左端,并且后面的式子只能在前面完成后,方可运行。所以说是一个串行过程,而组合逻辑恰恰需要这样的一个表达方式。
56.非阻塞赋值语句不加单位延时,尤其是对于寄存器类型的变量赋值时。
57.整型常量基数格式中不能有‘?’。
58.字符串中不能包含有控制字符(如CTRL链)。
59.禁止使用空的时序电路块以及非法的always结构。
60.不要在连续赋值语句中引入驱动强度和延时。
61.不要为net,n_input,n_output,enable_gate型变量定义驱动强度,电荷保持强度以及延时。
62.禁止使用trireg(具有电荷保持特性的连接)NET型定义。
63.禁止使用tri0,tri1,triand和trior型连接。
64.在RTL级代码中不能包含有initial结构,也不能对任何信号进行初始化赋值,应该采用复位的方式进行初始化。
65.不要在过程语句中使用assign,deassign,force,release等语句。
66.不要使用wait语句。
67.不要使用fork join语句块。
68.不要为驱动类型为supply0和supply1型的连线(net)赋值。
69.设计中不使用macro_module。
70不要在RTL代码中实例门级单元,尤其是下列单元:CMOS开关,RCMOS开关,NMOS开关,PMOS开关,RNOMS开关,RPMOS开关,trans双向开关,rtrans双向开关,tranif0,tranif1,rtranif0,rtranif1,pull_gate。
71.不要使用specify模块。
这些规则中有一些我还没有弄清楚,等到更多的实际应用中出现的时候,应该会有一种恍然大悟的感觉,实践才是检验真理的唯一标准。
Verilog 编写规范的更多相关文章
- Verilog代码规范I
Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...
- 20151009 C# 第一篇 程序编写规范
20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...
- .NET代码编写规范 整理
.NET代码编写规范 整理 .NET代码编写规范 - [ASP.NET] 2009-02-26 | Tag: 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://lensp ...
- MarkDown编写规范指南
Markdown 编写规范指南 简介: Markdown的目标是实现「易读易写」,成为一种适用于网络的「书写语言」. 一份使用Markdown格式撰写的文件可以直接以纯文本发布,它的最大灵感来源其实是 ...
- 代码编写规范说明书(c#.net与asp.net)
代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...
- Markdown 编写规范
说明及目的 作为一个在博客园混迹了俩三年的人,一直在这里看别人的博客,现在准备开始写自己的博客,目的呢,就是一下几点吧: 项目过程中的历史经验教训积累记载,吃一堑长一智,不想在同一个坑掉进去好几次 学 ...
- Verilog编码规范与时序收敛
Verilog编码规范与时序收敛 没有优先级的时候,尽量用case 时钟选择
- Python代码编写规范
Python代码编写规范 编码: a) 如无特殊情况,文件一律使用UTF-8编码 b) 如无需特殊情况,文件头部必须加入#-*-coding:utf-8-*- 缩进 a) 统一 ...
- 【转】python编写规范——中标软件有限公司测试中心
[转]python编写规范 一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准 ...
随机推荐
- 第二章 Spring MVC入门 —— 跟开涛学SpringMVC 读后感1
2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...
- unserialize():Error at offset 0 of 96 bytes是什么意思
数据库有个列是数组序列化后存到数据库的,取出来得反序列化, php想要把数组保存到数据库里,有两种序列化方式,分别是: //php系统序列化 $b = serialize($a); //序列化数 ...
- Windows10通过命令行导出笔记本电池使用信息
powercfg /batteryreport /output "D:\Thinkpad x1c\battery_report_2020_2_25.html" 可以导出电池的电池类 ...
- H3C接口管理配置
一.接口批量配置 当多个接口需要配置某功能(比如shutdown)时,需要逐个进入接口视图,在每个接口执行一遍命令,比较繁琐.此时,可以使用接口批量配置功能,对接口进行批量配置,节省配置工作量. 1. ...
- eclipse 项目的创建 编写 'Hello World'
写项目之前确保 eclipse 安装完成 以及JDK 环境配置 成功 开始: 打开eclipse 右键file ->new->java project 如图: 然后输入项目名 点击Fin ...
- pandas 读取excel时,遇到数字变为科学计数法了, 怎么破?? 别慌 这样来处理
# 指定字段以string 方式读取 df = pd.read_excel("./test.xlsx", converters={"id": str})
- [国家集训队] Crash的数字表格 - 莫比乌斯反演,整除分块
考虑到\(lcm(i,j)=\frac{ij}{gcd(i,j)}\) \(\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}\) \(\sum_{d=1}^{n} ...
- (转)正则表达式:string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement
string.replaceAll中的特殊字符 string.replaceAll(String regex, String replacement)中的replacement参数即替换内容中含有特殊 ...
- es报错org.frameworkset.elasticsearch.ElasticSearchException: {"error":{"root_cause":[{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}],
今天es在保存数据的时候报错 org.frameworkset.elasticsearch.ElasticSearchException: {"error":{"root ...
- javaScript入门(函数)
目录 JavaScript函数 函数是什么 函数返回值 return特点: 递归函数 匿名函数(anoymous) 自执行函数(通过匿名函数实现) 回调函数 闭包函数 构造函数 构造函数两大类 注意事 ...