《Verilog HDL与数字系统设计简明教程》吴戈 人民邮电出版社 p34~35
1、时延的概念
连续赋值语句中经常出现时延,时延就是给出一个值,程序执行到此处就会暂停下来,等待这个值规定的若干个单位时间(单位时间的大小是默认值或由预处理指令timescale定义),然后再继续执行后面的语句。定义时延的形式是使用符号“#”,如#3就表示在此等待3个单位时间。
时延可以单独作为一句,如“#3;”就是程序中的一条语句。时延也可以内嵌在连续赋值语句中,跟在关键词assign之后。如果在连续赋值语句中没有定义时延,则默认时延值为0,右端表达式的值会立刻赋值给左端线网。如果在连续赋值语句中定义了时延值,例如:
assign #6 Ask = Quiet || Late;
那么右边表达式的计算结果要经过6个单位时间的时延之后才能赋给等号左端的线网目标。如下图中1所示,例如在时刻5,Late的值发生变化,则计算等号右端的表达式,并且在时刻11(从时刻5开始延时6个单位时间)时把结果值赋给Ask。
在整个时延过程中,如果等号右端表达式的值再次发生变化,那么时延结束时应把最新的值赋给等号左侧的线网。例如:
assign #4 Cab = Drm;
如下图2中所示,在时刻5,Drm从0变为1,那么根据连续赋值语句中的时延定义,应该在时刻9把新的值1赋给Cab,但是因为Drm在时刻8又变为0,所以到时刻9,赋给Cab的是Drm的最新值0。同样,因为值变化快于时