常量:
数字表达方式:<位宽><进制><数字>
例:8'b10101100 //位宽为8的数的二进制表示, 'b表示二进制
x表示不确定值,
z表示高阻
负数:位宽前面加一个负号
下划线:用于数字中间提高可读性
参数(Parameter)型 :用来定义常量
变量:
wire:wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。
wire [n-1:0] 数据名1,数据名2,…数据名i; //共有i条总线,每条总线内有n条线路
或
wire [n:1] 数据名1,数据名2,…数据名i;
reg:reg型数据常用来表示用于 “always”模块内的指定信号, 常代表触发器。 通常, 在设计中要由“always”块通过使用行为描述语句来表达逻辑关系。
在“always”块内被赋值的每一个信号都必须定义成reg型。
memory型:
在Verilog语言中没有多维数组存在。 memory型数据是通过扩展reg型数据的地址范围来生成的。
reg [n-1:0] 存储器名[m-1:0];
或 reg [n-1:0] 存储器名[m:1];
在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器。存储器名后的[m-1:0]或[m:1]则定义了该存储器中有多少个这样的寄存器。
等式运算符:
"=="和"!="又称为逻辑等式运算符。其结果由两个操作数的值决定。由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。
而"==="和"!=="运算符则不同,它在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,两个操作数必需完全一致,其结果才是1,否则为0。
"==="和"!=="运算符常用于case表达式的判别,所以又称为"case等式运算符"。
位拼接运算符(Concatation)
位拼接运算符{}。用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:
{信号1的某几位,信号2的某几位,..,..,信号n的某几位}
即把某些信号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号。
在位拼接表达式中不允许存在没有指明位数的信号 。
缩减运算符(reduction operator)
缩减运算是对单个操作数进行或与非递推运算,最后的运算结果是一位的二进制数。
缩减运算的具体运算过程是这样的:第一步先将操作数的第一位与第二位进行或与非运算,第二步将运算结果与第三位进行或与非运算,依次类推,直至最后一位。
例如:reg [3:0] B;
reg C;
C = &B;
相当于:
C =( (B[0]&B[1]) & B[2] ) & B[3];
赋值语句:
在Verilog HDL语言中,信号有两种赋值方式:
(1).
非阻塞(Non_Blocking)赋值方式( 如 b <= a; )
1) 块结束后才完成赋值操作。
2) b的值并不是立刻就改变的。
3) 这是一种比较常用的赋值方法。(特别在编写可综合模块时)
(2).
阻塞(Blocking)赋值方式( 如 b = a; )
1) 赋值语句执行完后,块才结束。
2) b的值在赋值语句执行完后立刻就改变的。
3) 可能会产生意想不到的结果。
顺序块:begin_end语句
1) 块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。
2) 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
3) 直到最后一条语句执行完,程序流程控制才跳出该语句块。
并行块:fork_join语句
1) 块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。
2) 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。
3) 延迟时间是用来给赋值语句提供执行时序的。
4) 当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。
条件语句:
如果用到if语句,最好写上else项。如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,
同时也增强了Verilog程序的可读性。
循环语句:
1) forever 连续的执行语句。
2) repeat 连续执行一条语句 n 次。