本人小白,用这篇博客记录学习内容。
1.模块定义一般格式
module 模块名([端口列表]); //模块唯一标识符;端口列表指电路输入/输出信号名称列表,信号名由用户指定,各名称间用逗号隔开
端口信号声明说明;(input or output or inout)//端口信号的输入输出属性、信号数据类型、信号的位宽
参数声明; //说明参数的名称和初值,parameter 数据类型 参数名 = 初值
endmodule
model full_adder(A,B,CIN,S,COUT)
input [3:0] A,B;
input CIN; //位宽不做说明默认是一位,数据类型不做说明,默认是wire型
output reg[3:0] s;
output COUT;
寄存器类型的变量只能在这两种语句中赋值,寄存器类型在赋值前保持原有值。initial与always语句都是从0时刻开始并行执行。
另外还有一种结构型描述方式,可以调用Verilog HDL中预定义的结构,也可调用已定义好的低层次模块对电路进行描述。
2.注释内容:与C形式类似
3.标识符(identifier):字母,下划线,数字,$的组合,第一个字符是字母与下划线,且区分大小写。类比C语言标识符记忆。
4.关键词:不可用做标识符,学习写程序时记忆。
5.间隔符:空格(\b)、tab(\t)、换行符(\n),换页符,字符串中的间隔符通常被省略。
6.数值:
四种基本的值
- 0:逻辑0或假状态
- 1:逻辑1或真状态
- x:未知状态 //可能是0或1中的任意值,不区分大小写
- z:高阻态 //不区分大小写
两种常量
1)整数:声明关键词 Integer ,默认32位,可以是 B D O H 四种类型。
书写形式
- 简单十进制数 //直接用十进制数表示
- '<进制格式,b d o h><对应前边进制下的一串数字> //缺省了位宽
- <size>'<进制格式><对应前边进制下的一串数字> //位宽指定,位宽<实际宽度,高位被忽略;位宽>实际宽度,数值最高 位为0或1,相应高位补0,最高位为 x或z,相应最高位补x,z。二进 制的一个z表示一位处于x,八进制的一个x表示三位二进制处于x。
'h81FF //缺省宽的十六进制数
212 //简单十进制数
'o724 //缺省宽的八进制数
4b1001 //4位二进制数
12'bx //12位的未知整数
16'hz //16位的高阻态
16'b0001_1010_1111_1000 //16位的二进制数
4ab //非法字符,少'h
b001 //非法表示,需要有"'"
8'b_0001_1000 //非法表示,下划线的位置。
2)实数:关键词real,默认的初始值为0,可用十进制和科学计数法表示。
举例如下:
2.9 //十进制计数
5.6E-10 //科学计数法,e与E都可以
2.7E5
3_2877.3385_4755 //数字中可以加入下划线,注意不能再最开始加,加入下划线对数值大小不影响。
7.字符串
Verilog HDL 中的字符串不需要特殊位来终止。 字符串储存在寄存器中。
特殊字符
\n换行符 \t Tab键 \\ 符号“\” \*符号“*” \ddd3位八进制的ASCII码 \% 符号“%”
8.数据类型
1)线网(Net)
声明关键词: wire,默认为高阻态。
格式:wire[常数值表达式1,常数值表达式2]net1,net2,net3……;
举例如下:
wire net1; //定义了线网net1
wire net2=0 ;//定义了线网net2,将其值设定为0
总线是线网的组合,总线的声明也用wire
wire[3:0]test2=3'b100;
2)寄存器类型
声明关键词reg,
表达格式:reg[常数值表达式1,常数值表达式2]reg1,reg2,reg3……;如果没有定义范围,则缺省值为一位寄存器。
reg[2:0]d2; //d2 为3位reg类型
reg d1; //d1位reg类型
3)时间类型
关键词 time,属于未定义的64位的数据,用于储存仿真时的系统时间。
格式:time time_id1,time_id2……[msb,lsb] //最后的msb与lsb表示范围界限的常量表达式,未定义的标识符存储一个至少64位的时间值。
4)参数类型
关键词 parameter,定义仿真时在程序内部保持不变的常数
格式 parmeter parm1 =常数
5)存储器类型,多个位的寄存器组合而成的数据类型。
关键词 reg ,
格式:reg[msb,lsb]memory1[upper1,lower1],memory[upper2,lower2],……;//upper,lower为寄存器范围i。
reg[7:0]men[0:1023];//深度1k,宽度为8位的存储器