过程赋值语句的基本形式:
寄存器变量 = 表达式
考虑赋值过程的定时控制时,根据定时控制在过程赋值语句中的不同位置,存在两类定时模式:
(一)外部定时模式
表达式:
<定时控制><寄存器变量>=<表达式>
该延时的模型:经“定时控制”所确定的延时后,计算出右端表达式的值,把结果赋值给左端的“寄存器变量”。其中的“定时控制”分为两种类型:延时控制和事件控制。
1 延时控制就是直接给出所需延时的时间,如:#delay a=b;
这条语句表面,经过delay确定的延时时间后,过程赋值语句右端表达式才被求值并被赋给左端的寄存器变量。
2 事件控制
事件控制以符号“@”开头,后面紧跟的是事件控制敏感表,有以下几种形式:
(1)@(信号名)
信号名所指定的信号通常是一位标量,也可以是多位的矢量。该形式的含义:只要被检验的信号发生变化(一般是值上升沿或下降沿)时,后面的赋值语句就被执行。如:
@(clock) reg_a = reg_b;
当clock发生跳变(上升沿或下降沿),reg_b的值就赋给reg_a。
(2)@(posedge 信号名)
信号发生上升沿跳变,如:@(posedge clock) reg_a = reg_b;
只要检测到clock信号出现上升沿,reg_b的值就赋给reg_a。
(3)@(negedge 信号名)
信号发生下降沿跳变,如:@(negedge clock) reg_a = reg_b;
只要检测到clock信号的下降沿,reg_b的值就赋给reg_a。
(4)@(事件1 or 事件2 or 事件3…)
表达式中的事件是指上面1、2、3三类事件中的任何一种事件,or表示逻辑或的意思,即只要所列举的任何一种情况出现,都将激活这里的事件控制。
注意:Verilog只提供“或”方式来处理多重触发情况,没有再定义诸如“与”等其他方式。
(二)内部定时模式
<寄存器变量> = <定时控制> <表达式>;
在内部模式中,有关“定时控制”的表现形式与上面对外部模式中的说明完全一致。两者之间的差别在于,在外部模式中,定时控制位于过程赋值语句之前,直接体现为对过程赋值语句执行事件的延期上,只有当延时事件被满足,或其他类型的激发条件被满足后,过程赋值语句才能被计算和赋值。
在内部模式中,定时控制位于赋值语句内部,与外部模式相同的是,两者都是在延时时间到期后再执行过程赋值操作,不同的是右端表达式的求值过程是在不同的事件段进行的。在外部模式中,直到延时到后,再对表达式求值,并执行赋值过程。而在内部模式中,先完成对表达式的求值,待延时到后,条件满足时,再把前面求得结果赋给左边的寄存器变量。
下表说明了两者之间的关系:**