Verilog支持设计者从算法的角度,即从电路外部行为的角度对其进行描述,在这个层次上设计数字电路更类似于使用C语言编程。
一、结构化过程always 和 initial 在行为级建模中的重要性
initial 块在整个仿真期间只能执行一次,因此他一般被用于初始化、信号监视、生成仿真波形等目的。always 语句通常用于对数字电路中一组反复执行的活动进行建模。例如,信号发生器。
二、阻塞与非阻塞
阻塞语句是按顺序进行的,一个begin-end 中使用阻塞赋值语句,那么就表现为串行行为。非阻塞赋值语句允许赋值调度,但他不会阻塞位于同一个顺序块中其后的执行。
三、时序控制
三种时序控制方法:基于延时的时序控制、基于事件的时序控制和电平敏感的时序控制。基于延迟的时序控制:常规延迟控制、赋值内嵌延迟控制和零延迟控制。零延迟控制可以保证带零延迟控制的语句将在执行时刻相同的多条语句中最后执行,从而避免发生竞争。4种类型时间控制:常规事件控制、命名事件控制、or(或)事件控制、电平敏感时序控制。命名事件控制例子:
Verilog语言使用wait表示等待电平敏感的条件为真。
always
wait (count_enalbe) #20 count = count + 2;
仿真器连续监视count_enable的值,若为0;则不执行后面的语句,仿真会停顿下来,若为1,则在20个时间单位之后执行这条语句。若count_enable 始终为1,那么每20个时间单位执行一次。
四、条件语句
五、多路分支语句
case语句使用case、endcase、default来表示。casez语句将条件表达式或候选项表达式中的z作为无关值,所有值为z的位也可以用“?”来代表;casex语句将条件表达式或候选项表达式中的x作为无关项。
六、循环语句
四种循环语句:while、for、repeat、forever。只能在always和initial中使用。repeat循环的次数必须是一个常量、一个变量、或者一个信号。执行固定次数的循环。forever是永久循环。通常与时序控制结构使用的。
七、顺序块和并行块
begin和end用于将多条语句组成顺序块。并行块由fork和join声明。块语句的3个特点:嵌套块、命名块和命名块的禁用。
嵌套块
命名块
命名块的禁用
Verilog 通过关键字disable提供了一种终止命名执行的方法。disable可以用来从循环中退出、处理错误条件以及根据控制信号来控制某些代码段是否被执行。对快语句的禁用导致紧接在块后面的那条语句被执行。对于C程序员来说,这一点类似用使用break退出循环。两者的区别在于break只能退出当前的循环,而是用disable则可以禁用设计中的任意一个命名块。
八、生成块
在仿真开始之前,在代码编写的仔细推敲过程中,生成语句可以动态地生成Verilog代码。这一声明语句方便参数化模块的生成。当对向量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者再根据参数的定义来确定程序中是否应该包括某段Verilog代码的时候,使用生成语句能够大大简化程序的编写过程。
九、举例