Verilog命名规范参考资料
1. 什么可以被命名?
- 模块的名称
- 模块实例的名称
- 各种数据类型的名称
这些名称我们称之为标识符,标识符的命名规则不再强调,与C语言类似,字母、数字、下划线(_)和美元符号($),开头只能是字母或者下划线。
2. 命名的方式是怎样的?
- 模块的名称
- 见名知义
- 符合命名规范
- 模块实例的名称
通常情况下,可能会多次使用模块的实例,命名的时候通常类似于:
ff0,ff1,ff2,ff3,ff4…… - 各种数据类型的名称
没什么好说的,见名知义,符合命名规范即可
3. 标识符的范围
就目前的知识结构来说,我对于范围的理解是这样的
- 模块与模块实例的名称是全局的,全局的名称都不能重复
- 数据类型的名称是局部的,不同的模块内可以重复,并且对于同一个信号源,不同子模块内建议使用一样的命名
- 一个模块内,所有标识符的名字,都不允许相同
4. 层次命名
先举一个例子,对于如下层次结构
标识符的层次名为:
- sti
- sti.q
- sti.qbar
- sti.set
- sti.reset
- sti.m1
- sti.m1. Q
- sti.m1.Qbar
- sti.m1.S
- sti.m1.R
- sti.n1
- sti.n2
其实就最后两个看起来比较特别,并且是令人费解的,按理说不应该是
- sti.m1.n1
- sti.m1.n2
不应该是这样才对嘛?为什么没有m1?
先不要慌,我们先来解释一下,为什么要使用层次命名,意义何在?
- 层次命名是为了在访问设计中的某个标识符的时候,能够唯一地识别这个标识符。
- 对于具备全局属性的标识符——模块和模块实例的名称来说,显然不是使用层次名的原因。
- 对于具备局部属性,可以在不同子模块中重复命名的标识符——变量或者信号的名称来说,在全局设计中,它不具备唯一性,因此访问的时候可能会出现问题,所以引入了层次名的概念,以便于能够在全局设计的任意位置中,能够唯一地访问这些标识符。
所以
- sti.n1
- sti.n2
这两个层次名的原因也就得到了解释,因为n1,n2在全局中是唯一的。