一、词法约定
1.Verilog是大小写相关的,要区分,其中关键字全部都要小写
2.空白符又空格(/b)和制表符(/t)组成,除字符串中的空白符,其它的仅作分割表示,无实际意义。
3.注释:单行 // 多行:/* */,多行的不准嵌套多行,但可以嵌套单行的。
4.操作符有三种,用来分隔三个操作数:单目、双目和三目操作数,单目操作数优先于双目的,如:~>&&。三目的举例:a = b ? c : d;
5.数字声明:
5.1指明位宽的:<size位宽>'<base format基数><number值>,2(b/B)、8(o/O)、十进制(d/D)、十六进制(h/H)。如16’d255。
5.2不指明位数:未指定基数时,默认为十进制数。未指定位宽,默认位宽与仿真器和使用的计算机有关(最小为32位)。如23456或 ' o21。
5.3 x=不确定值;z=高阻值
5.4 负数,符号放最前面:-6d'3。亦可加一个可选的带符号说明符:-6'sd3,这是一个6位的用于带符号算术运算的负数。
5.5下划线除出现在第一个字符,其它随意,仅提高可读性。
6.字符串必须一行写完,不能有回车符。
7.关键字全部小写。标识符是对象的名字,由字母数字、下划线、$组成,区分大小写,首字母必须是字母数字或下划线(与5.5区分)
8.转义标识符:不懂,懒得理解
二、数据类型
1.四值电平:0、1、x、z。八种信号强度supply>stromg>pull>large>weak>medium>small>highz
2.线网wire,位宽1 ,默认值z。
注:net不是关键字,它代表一组数据类型。包括wire,wand,wor,tri,triand,trior,trireg。
3.寄存器,存储元件,与硬件寄存器作区分,register仅仅意味着一个保存数值的变量,无需驱动,可通过赋值改变。寄存器数据类型一般用关键字reg来声明,默认值位x。例:
reg rester;//声明能保持数值的变量reset
initial;//忽略
begin
reset = 1'b1; // 初始化为1
#100 reset = 1'b0; // 100个时间单位后,reset置为0
end
寄存器也可以声明为带符号(signed)类型的变量。
reg signed [63:0] m;//64位带符号数
integer i;//32位带符号的值
4.向量,略,太多了没耐心看
5.整数、实数、和时间寄存器数据类型:
整数:integer,有符号数。
常实量和实数寄存器数据类型:real,可用十进制或科学计数法表示,不能带有范围。
时间寄存器:time,保存仿真时间。
time save_sim_time;//定义时间类型的变量save_sim_tim
initial
save_sim_tim = $time;//把当前的仿真时间记录下来
6.数组,维度不限,形<数组名>[<下表>]
integer count[0:7];//由8个计数变量组成的数组
reg bool[31:0];由32个1位的布尔寄存器变量组成的数组
注意,数组与线网或寄存器向量混淆,向量是一个单独的元件,位宽位n,数组由多个元件组成,美国元件位宽位n或1。
7.存储器,42页,写的不多
8.参数,使用parameter在模块内定义常数,还可以的意义参数的类型和范围进行定义。
parameter port_id = 5;
parameter signed [15:0] WIDTH;//规定WIDTH有正负号,宽度位为16位
局部参数:localparam,等同于参数,区别在于局部参数不可更改。一般参数可以通过参数重载语句(defparam)或通过有序参数列表或命名参数赋值来直接修改。
9.字符串,保存在reg类型的变量中。宽度应足够大
三、系统任务和编译指令
3.1.系统任务
3.1.1显示信息:$display, $display(p1,p2,p3,···,pn);pn是用双引号扩起来,它会在末尾自动加一个换行符哦
3.1.2监视信息:$monitor,对信号值进行监视,$monitor(p1,p2,p3,···,pn);pn是用双引号扩起来,调用一次即可在整个仿真过程中生效,与display不同。
3.1.2暂停和结束仿真:$stop和$finish
initial
begin
clock = 0;
reset = 1;
#100 $stop;//在仿真时刻为100单位时,暂停仿真
#900 $finish;//在仿真时刻为1000单位时,终止仿真
end
3.2编译指令
3.2.1 'define:定义文本宏,类似C中的#define
3.2.2 'include:将一个Verilog源文件包含在另一个Verilog文件中,类似C中的#include