1 过程赋值
过程赋值的RHS可以是任何能够计算出值的表达式。LHS必须是一个能够接受RHS赋值的变量。过程赋值分两种:阻塞赋值 非阻塞赋值
1.1 阻塞赋值
在顺序块中,阻塞赋值语句必须在它的后续语句执行之前执行,但在并行块中,阻塞语句不能阻止它的后续语句执行。这里的并行块指fork/join语句。
1.2 非阻塞赋值
非阻塞赋值能够在不阻塞过程流的情况下允许赋值调度。非阻塞赋值不能阻塞过程流,在非阻塞赋值计算RHS和调度LHS的更改是,他不会阻塞同一块内后续语句的执行。
// 仿真器必须保证在一个过程块内对同一变量的不同非阻塞值的执行顺序。
module multiple;
reg a;
initial a = 1;
initial begin
a <= #4 0; //schedule a = 0 at time 4
a <= #4 1; //schedule a = 1 at time 4
end //at time 4, a = 1
endmodule
// 如果仿真器并发的执行两个过程块,并且两个过程块包含对同一变量的非阻塞赋值,那个这个变量的结果可能是不定的,也可能是确定的。
module multiple2;
reg a;
initial a = 1;
initial a <= #4 0;
initial a <= #4 1;
// at time 4 . a = ??
endmodule
//如果仿真调度时间不同。按照顺序进行赋值
module multiple3;
reg a;
initial #8 a <= #8 1; //executed at time 8 , schedules an update of 1 at time 16
initial #12 a <= #4 0; //executed at time 12 , schedules an update of 0 at time 16
// at time 16,a = 0
endmodule
2 过程连续赋值
过程连续赋值是运行表达式对变量或线网连续驱动的过程赋值,包括assign / deassign 语句和 force / release 语句。
assign过程连续赋值的使用规则:
1.对变量的assign过程连续赋值优先于所有的其他过程赋值。
2.deassign过程语句用于终止对此变量的assign过程连续赋值。
3.对变量做assign过程连续赋值是,变量的值保持不变,直到通过过程赋值或过程连续赋值对这个变量赋一个新值。
force 和 release 过程语句
和assign / deassign 语句有类似的作用,但force既可以对变量使用,也可以对线网使用。
1 force过程连续赋值优先于过程赋值和assign过程连续赋值,知道在此变量执行release语句。
2 如果release此变量时,没有active的assign过程连续赋值,那么此变量就保持不变,知道发生过程赋值。
3如果release变量时,有assign过程连续赋值,那么赋值马上起效。
4对一个线网的force语句将优于所有对线网的drivers。
3 条件语句
if语句对应综合出来的逻辑具有优先级,靠前的逻辑少、路径短,靠后的逻辑多、路径长。
else总是和它最近的if配对,如果不是我们期望的,就需要使用begin end强制与外层if配对
4 循环语句
Verilog有四种循环语句:
forever :持续不断的执行,就是死循环
repeat :执行括号内表达式指定的循环次数,如果表达式是x或z就不执行
while :当括号内表达式为true时执行,否则不进入循环或跳出循环、
for : 与C相同,括号内分三部分
// 当循环个数是常量的时候,这样书写的for循环是可以综合的
// 如果循环个数是变量的时候。那么任何综合工具都综合不出来。因为硬件规模必须是有限的、固定的。
5 disable语句
当disable执行的时候,命名块就被终止执行,所以它可以谭咏麟用于停止块、退出循环、或退出task和function。实际上就是用disable实现C语言的continue break return语句
6 过程时序控制
延时控制 #
事件控制 @
wait语句,如同操作一个事件控制和while循环的组合
逻辑门和线网的延迟也会让仿真时间前进