文档章节

Verilog 编写规范

o
 osc_z1hvg4cu
发布于 2018/04/24 21:08
字数 2110
阅读 7
收藏 0

精选30+云产品,助力企业轻松上云!>>>

    在学习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模块。

    这些规则中有一些我还没有弄清楚,等到更多的实际应用中出现的时候,应该会有一种恍然大悟的感觉,实践才是检验真理的唯一标准。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
【华为】verilog语言编写规范(一)

本次分享华为公司的《大规模逻辑设计指导书》中的内容。 1 目的 本规范的目的是提高书写代码的可读性 可修改性 可重用性 优化代码综合和仿真的结 果 指导设计工程师使用VerilogHDL规范代码和...

数字积木
06/08
0
0
【华为】同步电路设计技术及规则(一)

本次分享华为公司的《大规模逻辑设计指导书》中的“同步电路设计技术及规则”的部分内容。 1 设计可靠性 为了增加可编程逻辑器件电路工作的稳定性,一定要加强可编程逻辑器件设计的规范要求,...

数字积木
06/21
0
0
【接口时序】1、软件与Verilog基本格式规范说明

一、 说明   以前总是没有记录的习惯,导致遇到问题时总得重新回忆与摸索,大大降低了学习效率,从今天开始决定改掉这个坏毛病,认真记录自己的Verilog学习之路,希望自己能一直坚持下去。...

osc_9wjzyxne
2018/08/12
2
0
【华为】同步电路设计技术及规则(二)

本次分享华为公司的《大规模逻辑设计指导书》中的“同步电路设计技术及规则”的部分内容。 6.多时钟的同步化 我们在设计中,经常预见这种情况,一个控制信号来自其它芯片,或者芯片其它模块,该信...

数字积木
06/23
0
0
【华为】可编程ASIC设计方法简介(三)

本次分享华为公司的《大规模逻辑设计指导书》中的“可编程ASIC设计方法简介”的部分内容。 五 芯片可靠性测试 可靠性测试分两方面,一是通过软件进行,也就是写测试代码,如Verilog格式测试代...

数字积木
06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 那么长的绳子,你这是放风筝呢

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @ 巴拉迪维:黑豹乐队的单曲《无地自容》 耳畔突然响起旋律,是那首老歌。中国摇滚有了《一无所有》不再一无所有;中国摇滚有了《无地自容》不...

小小编辑
47分钟前
55
1
《吐血整理》-顶级程序员书单集

你知道的越多,你不知道的越多 给岁月以文明,而不是给文明以岁月 前言 王潇:格局决定了一个人的梦想,梦想反过来决定行为。 那格局是什么呢? 格局是你能够看见的深度、广度和密度。 王潇认...

敖丙
2019/12/11
8
0
我可以在Android版式中加下划线吗? - Can I underline text in an Android layout?

问题: 如何在Android布局xml文件中定义带下划线的文本? 解决方案: 参考一: https://stackoom.com/question/A31z/我可以在Android版式中加下划线吗 参考二: https://oldbug.net/q/A31z/...

法国红酒甜
49分钟前
26
0
干掉ELK | 使用Prometheus+Grafana搭建监控平台

什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。 Prometheus的特点 · 多维度...

木九天
今天
34
0
拉勾网拉你上勾

预览 需求简介 拉勾网是一个互联网行业的一个招聘网站,上面有许多职位,于是乎,小编想提取指定职位的基本信息(职位名,薪水,工作经验,工作地点,教育背景),然后插入 MongoDB 数据库,...

木下瞳
2019/04/17
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部