电路的不同等级抽象:
系统级:设计模块的外部性能模型
算法级:描述实现算法运行的模型
RTL级:描述数据在寄存器之间流动处理控制的模型
门级:描述逻辑门之间连接的模型
开关级:三级管和存储节点之间连接的模型
verilog语言适合算法级和RTL级的模型设计。
verilog基本语法
模块
程序的基本组成单元,模块由两部分组成:一部分描述模块的接口,一部分描述模块的逻辑功能,定义输入如何影响输出。
声明模块
module 模块名(接口1,接口2,接口3,...);
endmodule;//结束模块
引用其他模块
模块名(按照模块接口定义顺序依次赋予实际的信号名);
模块名(.接口1(信号名1), .接口2(信号名2),....);这样通过.接口名的方式可以建立信号关系,不用严格按照模块接口定义顺序传参,灵活。
模块内容
包括三部分:
1、I/O说明格式:
输入口:
input[信号位宽--例如1:0] 接口名;
输出口:
output[信号位宽1:0] 接口名;
输入输出口:
inout [信号位宽 1:0] 接口名;
I/O说明除了可以写在模块内容中,也可以写在模块声明里:
module 模块名(input port1, input port2,...output port3,...inout port4);
2、内部信号变量定义说明
3、功能定义
主要有assign/实体元件表示/always块三种类型
这三种在代码中是并行执行的,always代码块内顺序执行;
只有assign和实例元件引用可以独立于过程块存在于模块功能定义部分。
数据类型/变量/常量
数据类型表示数字电路中的数据存储和传送元素
常量
1、数字
表示方式有三种:
<位宽><进制><数值>
<进制><数值> //位宽采用机器默认的位宽,至少32位
<数值> //默认是十进制
位宽指名这个数占几位;
进制有二进制('b)、十进制('d)、八进制('o)、十六进制('h)
例:
8'b10001000 //8位宽二进制数10001000
2、x和z值
x表示不定值;z/?表示高阻值
例:4'b10x0 //有一位不定值
8‘h4x //十六进制低四位值不定
12'dz //12位宽10进制都是高阻值
12‘d? //同上
3、负数
在数字定义的最前加-
-8d'12
4、下划线
只可以用来分割数值,增加数值可读性
16'b1000_0101_0111_0011
常量不说明位数时默认是32位,每个字母用8位ASCII码表示
"AB" = 16'b01000001_01000010
定义常量
使用参数型数据类型parameter来定义常量:
parameter 常量 = 表达式;
parameter 常量1 = 表达式1, 常量2 = 表达式2....;
例:
parameter a = 100;
parameter b = a - 1;
参数型常量常用于定义延迟时间和变量宽度,并且引用该模块的模块可以通过传参改变被引用模块中parameter型常量的值。
例:
module Decode(A,F);
parameter width = 1, polarity = 1;
.
.
.
endmodule
module Top;
wire[3:0] A1;
wire[4:0] F1;
Decode #(4,0) D1(A1,F1); //传入的4,1会改变本次调用Decode时parameter型参数width和polarity的值
endmodule
变量
1、网络数据类型
表示结构实体(如门)之间的物理连接。
该类变量不存储值,必须受到驱动器(如门)或者赋值语句的驱动;