Verilog 语法小结
下面的内容是常用的Verilog语法小结。
数据类型语法小结
- wire型数据通常用assign关键字进行赋值。wire只能被assign连续赋值,reg只能在initial和always中赋值。input端口只能定义成wire型。如果端口没有声明,则默认是wire线网型,且输入端口只能是wire线网型。
- reg是寄存器数据类型的关键字。寄存器是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,相当于改变触发器存储的值。reg型常用来表示always模块内的指定信号,代表触发器。在always块内被赋值的每一个信号都必须定义为reg型,即赋值操作符的左端变量必须是reg型。
- 所谓的always必须用reg的意思是always里面的赋值语句中的被赋值变量为reg型,而不是说在always里面出现的变量都为reg型。
- reg型与wire型的区别在于:reg型保持最后一次的赋值,而wire型需要持续的驱动。
- memory型通过对reg型变量建立数组以对存储器建模。
的存储器名reg [n-1:0]
定义了存储器中每一个存储单元的大小,即该存储器单元是一个[m-1:0] reg [n-1:0]
位宽的寄存器,n
代表了存储器的大小,即该存储器中有多少个这样的存储器。[m-1:0]
- 一个n位寄存器可以在一条赋值语句中直接赋值,而一个完整的存储器则不行,如果要对memory型存储单元进行读写,则必须要指定地址。
- 用parameter定义常量。
数制表示语法小结
- 下划线‘_’可以随意用在整数和实数中,没有实际意义,只是为了提高可读性。例如
等效于56
;5\_6
- 整数负数使用补码形式表示,而不能表示为诸如:
之类的形式。16'h-9
- 在进行基本算数运算时,如果某一操作数有不确定的值
,则运算结果也是不确定值X
。X
赋值过程语法小结
- 连续赋值语句只能用来对线网型变量进行赋值,而不能对寄存器变量进行赋值。一个线网型变量一旦被连续赋值语句赋值之后,赋值语句有段的赋值表达式将持续对被赋值的变量产生连续驱动。只有右端表达式中任一操作数的值发生变化,就会立即触发对被赋值变量的更新操作。
- 过程赋值主要用于两种结构化模式(initial模块和always模块)中的赋值语句。在过程块中只能使用过程赋值语句(不能在过程块中出现连续赋值语句),同时过程赋值语句也只能用在过程赋值模块中。
- 过程赋值语句只能对寄存器类型的变量(reg、integer、real和time)进行操作,经过赋值后,上面这些变量的取值将保持不变,直道另一条赋值语句对变量重新赋值为止。
- memory型只能对制定地址单元的整个字进行赋值,不能对其中的某些位单独赋值。
- 在关系运算符中,若某个操作数的值不定,则关系是模糊的,返回的是不定值
。X
- 实例算子
和===
可以用于比较含有!==
,X
的操作数,在模块的功能仿真中有着广泛应用。Z
- 对组合逻辑建模采用阻塞赋值;对时序逻辑建模采用非阻塞赋值;用多个always块分别对组合和时序逻辑建模;尽量不要在同一个always块内混合使用阻塞赋值和非阻塞赋值,如果在同一个always块里面既为组合逻辑,又为时序逻辑建模,应使用非阻塞赋值;不要在多个always块中为同一个变量赋值。
结构描述小结
- 一个程序可以有多个initial模块、always模块、task模块和function模块。initial模块和always模块都是同事并行执行的,区别在于inital模块只执行一次,而always模块则是不断重复运行,task模块和function模块能被多次调用。initial模块式面向仿真的,是不可综合的。
- begin……end块定义语句中的语句是串行执行的,而fork……join语句块中的语句是并行执行的。
- 利用always实现组合逻辑时,要将所有的信号放进敏感列表中,而实现时序逻辑时却不一定要将所有的结果放进敏感信号列表中。
- 延时控制只能在仿真中使用,是不可综合的,在综合时,所有的延时控制都会被忽略。
- if语句中的else不能省,case语句的default分支虽然可以默认,但一般不要默认(这条与笔者的习惯不同,笔者习惯带有默认)。
- case语句中的分支是并行执行的,各个分支没有优先级,而if语句的选择分支是串行执行的。
- forever循环语句用于连续执行过程语句,必须写在initial模块中。
- repeat循环语句执行指定循环数,如果循环计数表达式的值不确定,即为X或Z时,那么循环次数按0处理。
Verilog实现相关小结
- 组合逻辑电路在逻辑功能上的特点是:任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。而时序逻辑电路在逻辑功能上的特点是:任意时刻的输出不仅取决于当时的输入信号,而且还取决与电路原来的状态,或者说,还与以前的输入有关。
- 状态机一般包括组合逻辑和寄存器逻辑部两部分。组合电路用于状态译码和产生输出信号,寄存器用于存储状态。
- 所谓高阻是输出端属于浮空状态,只有很小的漏电流流动,其电平随外部电平高低而定,门电平放弃对输出电路的控制或者可以理解为输出与电路是断开的。双向引脚的输出就是在不使能情况下,输出为高阻,而在使能情况下输出为正常。
参考
本文主要内容来自《通信IC设计》,仅用于学习参考。
2021-04-13.