1.模块的端口定义
module 模块名(口1,口2,口3,口4, ………);
2.(数据类型及其常量、变量)
数字
整数: <位宽><进制><数字>这是一种全面的描述方式。
1) 二进制整数(b或B)
2) 十进制整数(d或D)
3) 十六进制整数(h或H)
4) 八进制整数(o或O)
x和z值 :在数字电路中,x代表不定值,z代表高阻值
负数: 一个数字可以被定义为负数,只需在位宽表达式前加一个减号,
-8'd5 //这个表达式代表5的补数(用八位二进制数表示)
8'd-5 //非法格式
参数(Parameter)型: parameter 参数名1=表达式,参数名2=表达式, …,参数名n=表达式;在Verilog HDL中用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性。
3.变量:
wire型:
wire [n-1:0] 数据名1,数据名2,…数据名i; //共有i条总线,每条总线内有n条线路.或wire [n:1] 数据名1,数据名2,…数据名i;
reg型:
寄存器是数据储存单元的抽象。寄存器数据类型的关键字是reg.通过赋值语句可以改变寄存器储存de值,其作用与改变触发器储存的值相当. 在“always”块内被赋值的每一个信号都必须定义成reg型.
reg [n-1:0] 数据名1,数据名2,… 数据名i;或reg [n:1] 数据名1,数据名2,… 数据名i;
memory型:
在Verilog语言中没有多维数组存在。 memory型数据是通过扩展reg型数据的地址范围来生成的.
reg [7:0] mema[255:0];这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255.
4.运算符及表达式:
1) 算术运算符(+,-,×,/,%)
2) 赋值运算符(=,<=)
3) 关系运算符(>,<,>=,<=)
4) 逻辑运算符(&&,||,!)
5) 条件运算符(?:)
6) 位运算符(~,|,^,&,^~)
7) 移位运算符(<<,>>)
8) 拼接运算符({ })
9) 其它
1) ~ //取反
2) & //按位与
3) | //按位或
4) ^ //按位异或
5) ^~ //按位同或(异或非)
1) == (等于)
2) != (不等于)
3) === (等于)
4) !== (不等于)
"==="和"!=="运算符不同,它在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,两个操作数必需完全一致,其结果才是1,否则为0
位拼接运算符(Concatation),用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作.{信号1的某几位,信号2的某几位,..,..,信号n的某几位}
{a,b[3:0],w,3’b101}={a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}
缩减运算 是对单个操作数进行或与非递推运算,最后的运算结果是一位
的二进制数C = &B;相当于:C =( (B[0]&B[1]) & B[2] ) & B[3];
5.关键词:
always, and, assign,begin,buf,bufif0,bufif1,case,casex,casez,cmos,deassign,
default,defparam,disable,edge,else,end,endcase,endmodule,endfunction,endprimitive,endspecify, endtable, endtask, event, for, force, forever, fork, function,highz0,highz1, if,initial, inout, input,integer,join,large,macromodule,medium,module,nand,negedge,nmos,nor,not,notif0,notifl, or, output, parameter, pmos, posedge,primitive, pull0, pull1, pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos,rtran, rtranif0,rtranif1,scalared,small,specify,specparam,strength,strong0, strong1,supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand,trior,trireg,vectored,wait,wand,weak0,weak1,while, wire,wor, xnor, xor
6.赋值语句和块语句
非阻塞(Non_Blocking)赋值方式( 如 b <= a; ) 块结束后才完成赋值操作。2) b的值并不是立刻就改变的。
阻塞(Blocking)赋值方式( 如 b = a; ) 赋值语句执行完后,块才结束。2) b的值在赋值语句执行完后立刻就改变的
7.块语句:
块语句通常用来将两条或多条语句组合在一起,使其在格式上看更象一条语句
顺序块
begin
语句1;
语句2;
......
语句n;
End
并行块
fork
语句1;
语句2;
.......
语句n;
join
8.条件语句
if_else
case
9.循环语句
forever : 连续的执行语句 …forever begin 多条语句 end
repeat : 连续执行一条语句 n 次…. repeat(表达式) begin 多条语句 end
while : while(表达式) begin 多条语句 end
for : for(表达式1;表达式2;表达式3) 语句
10,结构说明语句
Initial : initial语句在仿真开始时对各变量进行初始化, 另一用途,用initial语句来生成激励波形作为电路的测试仿真信号。
Always : 语句在仿真过程中是不断重复执行的
Task : 任务的定义.
Function : 函数的目的是返回一个用于表达式的值。
11.系统调用函数:
$display和$write:任务这两个函数和系统任务的作用是用来输出信息,即将参数p2到pn按参数p1给定的格式输出。
$monitor:当启动一个带有一个或多个参数的$monitor任务时,仿真器则建立一个处理机制,使得每当参数列表中变量或表达式的值发生变化时,整个参数列表中变量或表达式的值都将输出显示。
$time和$realtime:用这两个时间系统函数可以得到当前的仿真时刻
$finish:作用是退出仿真器,返回主操作系统,也就是结束仿真过程
$stop: 任务的作用是把EDA工具(例如仿真器)置成暂停模式
$readmemb和$readmemh : 用来从文件中读取数据到存贮器中
12.编译预处理:
`define: 宏定义,用一个指定的标识符(即名字)来代表一个字符串
`include : 文件包含”处理,所谓“文件包含”处理是一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中
`timescale : 时间尺度命令用来说明跟在该命令后的模块的时间单位和时间精度
`ifdef、`else、`endif : 条件编译命令,有时希望对其中的一部分内容只有在满足条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。