在学习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 编写规范的更多相关文章

  1. Verilog代码规范I

    Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...

  2. 20151009 C# 第一篇 程序编写规范

    20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...

  3. .NET代码编写规范 整理

    .NET代码编写规范 整理 .NET代码编写规范 - [ASP.NET] 2009-02-26 | Tag: 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://lensp ...

  4. MarkDown编写规范指南

    Markdown 编写规范指南 简介: Markdown的目标是实现「易读易写」,成为一种适用于网络的「书写语言」. 一份使用Markdown格式撰写的文件可以直接以纯文本发布,它的最大灵感来源其实是 ...

  5. 代码编写规范说明书(c#.net与asp.net)

    代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...

  6. Markdown 编写规范

    说明及目的 作为一个在博客园混迹了俩三年的人,一直在这里看别人的博客,现在准备开始写自己的博客,目的呢,就是一下几点吧: 项目过程中的历史经验教训积累记载,吃一堑长一智,不想在同一个坑掉进去好几次 学 ...

  7. Verilog编码规范与时序收敛

    Verilog编码规范与时序收敛 没有优先级的时候,尽量用case 时钟选择

  8. Python代码编写规范

    Python代码编写规范 编码: a)     如无特殊情况,文件一律使用UTF-8编码 b)     如无需特殊情况,文件头部必须加入#-*-coding:utf-8-*- 缩进 a)     统一 ...

  9. 【转】python编写规范——中标软件有限公司测试中心

    [转]python编写规范 一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准 ...

随机推荐

  1. 第二章 Spring MVC入门 —— 跟开涛学SpringMVC 读后感1

    2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...

  2. unserialize():Error at offset 0 of 96 bytes是什么意思

    数据库有个列是数组序列化后存到数据库的,取出来得反序列化, php想要把数组保存到数据库里,有两种序列化方式,分别是: //php系统序列化 $b = serialize($a);    //序列化数 ...

  3. Windows10通过命令行导出笔记本电池使用信息

    powercfg /batteryreport /output "D:\Thinkpad x1c\battery_report_2020_2_25.html" 可以导出电池的电池类 ...

  4. H3C接口管理配置

    一.接口批量配置 当多个接口需要配置某功能(比如shutdown)时,需要逐个进入接口视图,在每个接口执行一遍命令,比较繁琐.此时,可以使用接口批量配置功能,对接口进行批量配置,节省配置工作量. 1. ...

  5. eclipse 项目的创建 编写 'Hello World'

    写项目之前确保 eclipse 安装完成 以及JDK 环境配置 成功 开始: 打开eclipse  右键file ->new->java project 如图: 然后输入项目名 点击Fin ...

  6. pandas 读取excel时,遇到数字变为科学计数法了, 怎么破?? 别慌 这样来处理

    # 指定字段以string 方式读取 df = pd.read_excel("./test.xlsx", converters={"id": str})

  7. [国家集训队] 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} ...

  8. (转)正则表达式:string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement

    string.replaceAll中的特殊字符 string.replaceAll(String regex, String replacement)中的replacement参数即替换内容中含有特殊 ...

  9. 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 ...

  10. javaScript入门(函数)

    目录 JavaScript函数 函数是什么 函数返回值 return特点: 递归函数 匿名函数(anoymous) 自执行函数(通过匿名函数实现) 回调函数 闭包函数 构造函数 构造函数两大类 注意事 ...