Verilog介绍
- Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。
- 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。Verilog结构完全嵌在module和endmodule声明语句之间,每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。
- VerilogHDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。
- Verilog模块可分为两种类型:一种是为了让模块最终能生成电路的结构,另一种只是为了测试所设计的电路的逻辑功能是否正确。
- 可以用/丶丶丶丶/和//丶丶丶丶 对Verilog程序的任何部分作注释,可以增加程序的可读性和可维护性。
语法点
- assign 为赋值语句。 例:assign {cout,sum} = a + b + cin;
- 除了endmodule语句外,每个语句和数据定义的最后必须有分号。
- verilog赋值语句里,=0 和 =1‘b0 到底有什么区别啊?
答:0会默认为32位宽的一个数,<位宽><进制><数字>是一种全面的描述方式, 1‘b0 表示1位宽,2进制,数字0。 - 整数,整型常量即整常数有以下4种进制表示形式:1)二进制(b或B);2)十进制(d或D);3)十六进制(h或H);4)八进制(o或O)。
数字表达式分为三种:
1)<位宽><进制><数字>,这是最完整的形式。
2)<进制><数字>,数字的位宽采用默认位宽(不同的机器系统不同,至少32位)。
3)<数字>,采用默认进制(十进制)。 - 在数字电路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进制数的四位二进制数的状态,八进制数的三位,二进制数的一位。z的表示方式同x类似。z还有一种表达方式是可以写作?。在使用case表达式时建议使用这种写法,以提高程序的可读性。见下例:
4’b10x0 //位宽为4的二进制数从低位数起第二位为不定值
4’b101z //位宽为4的二进制数从低位数起第一位为高阻值
12’dz //位宽为12的十进制数其值为高阻值(第一种表达方式)
12’d? //位宽为12的十进制数其值为高阻值(第二种表达方式)
8’h4x //位宽为8的十六进制数其低四位值为不定值 - Verilog中的#是延迟的意思,井号后面数字是延迟的数量,延迟的单位由Timescale 控制
比如有:`timescale 1ns/1ps 意思就是时间单位为1ns,精度是1ps。
#也有参数数值传递的功能。例如下图中
在模块Decode中定义了两个参数类型变量:Width 和Polarity,且都为1。在TOP中引用Decode实例,通过#(4,0),实例D1实际引用的是参数Width 和 Polarity 分别为 4 与 0 时的Decode 模块,通过#(4),实例D2实际引用的是参数Width 为5,而 Polarity 仍为1时的Decode 模块。