《第6章VHDL时间控制和赋值语句》由会员分享,可在线阅读,更多相关《第6章VHDL时间控制和赋值语句(108页珍藏版)》请在金锄头文库上搜索。
1、第6章 行为描述(二):时间控制和赋值语句 第第6章行章行为为描述描述(二二):时间时间控制控制 和和赋值语赋值语句句 6.1 时间时间控制控制 6.2 赋值语赋值语句句 1第6章 行为描述(二):时间控制和赋值语句 6.1 时时 间间 控控 制制时间控制可以用来对过程块中各条语句的执行时间(时序)进行控制。时间控制可以分为两类:(1) 延延时时控制控制:为行为语句的执行指定一个延时时间的时间控制方式。(2) 事件控制事件控制:为行为语句的执行指定触发事件的时间控制方式。其中事件控制方式又可以分成两类: 边边沿触沿触发发事件控制事件控制 电电平敏感事件控制平敏感事件控制2第6章 行为描述(二)
2、:时间控制和赋值语句 6.1.1 延延时时控制控制延时控制的格式为:# 行行为语为语句;句;或 # ;其中:符号“#”是延时控制的标识符;“”是直接指定的延迟时间量,它是以多少个仿真时间单位的形式给出的,可以是一个立即数、变量或表达式。3第6章 行为描述(二):时间控制和赋值语句 1. 第一种形式的延第一种形式的延时时控制控制语语句句在上面给出的第一种延时控制格式中,的后面跟着一条行为语句。在这种情况下,仿真进程在遇到这条带有延时控制的行为语句后并不立即执行行为语句指定的操作,而是要延迟等待到“”所指定的时间量过去后才真正开始执行行为语句指定的操作,如例6-1所示的程序。4第6章 行为描述(二
3、):时间控制和赋值语句 【例例6-1】第一种形式的延时控制语句。module clk_gen(clk);output clk;reg clk;initialbeginclk=0; /语句S1#10 clk = 1; /语句S2#20 clk = 0; /语句S3#30 clk = 1; /语句S4endendmodule串行块内共有四条赋值语句,其中语句S1没有时间控制部分,而语句S2、S3和S4带有延时控制。5第6章 行为描述(二):时间控制和赋值语句 表表6.1给给出了例出了例6-1在在进进行仿真行仿真时时的的时时序以及序以及输输出信号出信号clk的的变变化情况化情况:6第6章 行为描述(
4、二):时间控制和赋值语句 2. 第二种形式的延第二种形式的延时时控制控制语语句句延时控制的第二种格式中,在“”后面没有出现任何行为语句,而只有一个语句结束符号“;”。在在这这种情况下,仿种情况下,仿真真进进程在遇到程在遇到这这条延条延时时控制控制语语句后不句后不执执行任何操作,而是行任何操作,而是进进入一入一种等待状种等待状态态,等到,等到过过了由了由“”所指定的所指定的时间时间量后仿真流量后仿真流程,程,结结束束这这条延条延时时控制控制语语句的句的执执行。行。 这种形式的延时语句出现在串行块和并行块中时产生的作用是不同的,下面我们举例说明。7第6章 行为描述(二):时间控制和赋值语句 【例例
5、6-2】第二种形式的延时控制语句使用于串行块。module clk_gen(clk);output clk;reg clk;initial begin /串行块clk=0; /语句S1#10 clk = 1; /语句S2#10 ; /语句S3#10 clk = 0; /语句S4#30 clk = 1; /语句S5endendmodule8第6章 行为描述(二):时间控制和赋值语句 表表6.2给给出了例出了例6-2所示代所示代码进码进行仿真行仿真时时的程序控制流程和的程序控制流程和输输出出变变化情况化情况:9第6章 行为描述(二):时间控制和赋值语句 在例6-2的执行中我们可以看出:第二种形式的
6、延时控制语句在串行块中的作用是使该控制语句后的下一条语句的执行时刻延迟了指定的时间量。因此,如下语句:begin#10 ; a=b ; end 将等价于下面这一条语句: #10 a=b;下面我们给出另一个例子来说明第二种形式的延时控制语句在并行块中使用的情况。10第6章 行为描述(二):时间控制和赋值语句 【例例6-3】第二种形式的延时控制语句使用于并行块。module clk_gen(clk);output clk;reg clk;initial fork/并行块clk=0;/语句P1#10 clk = 1;/语句P2#10 ;/语句P3#20 clk = 0;/语句P4#30 clk =
7、1;/语句P5joinendmodule11第6章 行为描述(二):时间控制和赋值语句 在这种情况下延时控制语句P3既没有产生具体的操作,又没有对并行块仿真执行的时序产生影响,所以在上例中有没有延时控制语句P3对于要实现的功能不会产生任何影响。 如果我们将例6-3中的延时控制语句P3改为“#40;”,那么情况如何?12第6章 行为描述(二):时间控制和赋值语句 在介绍了如上两种形式的延时控制语句后,还必须对语法定义中的“”这一项进行说明。“”这一项还可以是一个变量或表达式,而不必将其局限于某一立即数,比如:initialbegin : SEQ_1parameter DELAY_TIME=50
8、;#DELAY_TIME out_1=0; /第一条赋值语句#(DELAY_TIME / 2) out_2=1; /第二条赋值语句end13第6章 行为描述(二):时间控制和赋值语句 当“”是由一个变量或由一个表达式表示时,有可能出现该变量或表达式的值为负值以及取值为x或z的情况。Verilog语语法法规规定:如果代表延定:如果代表延时时间时时间的的变变量或表达式的量或表达式的值为值为x或或z,那么,那么该该延延时时控制等效于零控制等效于零时时延控制;如果代表延延控制;如果代表延时时间时时间的的变变量量或表达式的或表达式的值为负值值为负值,则则以以该负值该负值的二的二进进制制补码值补码值作作为
9、实际为实际的延的延时时量。量。14第6章 行为描述(二):时间控制和赋值语句 6.1.2 边边沿触沿触发发事件控制事件控制事件控制方式是时间控制的另一种方式。在这种时间控制方式下,行为语句的执行需要由指定事件的发生来触发,该事件被称为“触发事件”。在always语句块格式中所使用的敏感事件列表就是一种事件控制。事件控制方式不仅能用于always语句块,而且还可以用于其它的行为语句。事件控制方式又可以进一步分成两类:边沿触发事件控制和电平敏感事件控制。15第6章 行为描述(二):时间控制和赋值语句 1. 边边沿触沿触发发事件控制事件控制这一类时间控制方式在指定的信号变化时刻,也就是在指定的信号的
10、跳变边沿才触发语句的执行;而当信号处于稳定状态时则不会触发语句的执行。边沿触发事件控制的语法格式可以为如下几种:第一种: () 行为语句;第二种: () ; 第三种: ( or or or) 行为语句;第四种: ( or or or) ; 符号“”是边沿触发事件控制的标识符,“事件表达式”代表着触发语句执行的触发事件;而“行为语句”则指出了触发事件所要触发执行的具体操作16第6章 行为描述(二):时间控制和赋值语句 1) 事件表达式事件表达式可以是如下三种形式之一: 。 posedge negedge 其中,“”可以是任何数据类型的标量或矢量。17第6章 行为描述(二):时间控制和赋值语句 2
11、) 语法格式下面讨论前面给出的边沿触发事件控制的四种语法格式:(1) 边沿触发事件控制的第一种语法格式: () 行行为语为语句;句;这种语法格式的敏感事件列表内只包含了一个触发事件,只有当这个指定的触发事件发生之后,后面的行为语句才能启动执行;18第6章 行为描述(二):时间控制和赋值语句 【例例6-4】时钟脉冲计数器。module clk_counter(clk,count_out);input clk,output count_out;reg 3:0 count_out;initialcount_out=0; /给count_out赋初值0always ( posedge clk ) co
12、unt_out=count_out+1;/在clk的每个正跳变边沿count_out增加1endmodule所指定的触发事件是时钟信号“clk”发生正跳变。因此在执行这条事件控制语句时,仿真进程将等待时钟“clk”正跳变的发生,然后为计数寄存器“count_out”增值。19第6章 行为描述(二):时间控制和赋值语句 (2) 边沿触发事件控制的第二种语法格式: () ; 这种格式的事件控制语句的执行过程与延时控制语句中没有行为语句的情况类似,仿真进程在遇到这条事件控制语句后会进入等待状态,直到指定的触发事件发生后才结束等待状态,退出该事件控制语句的执行并开始下一条语句的执行。比如例6-5中程序
13、所示。20第6章 行为描述(二):时间控制和赋值语句 【例例6-5】用于测定输入时钟正电平,负电平持续时间以及时钟周期的模块。module clk_time_mea(clk );input clk;time pos_edge_time,neg_edge_time;time high_last_time,low_last_time,last_time;initial begin (posedge clk) ; /* 等待,直到时钟发生正跳变后退出等待状态,继续执行下一条语句 */pos_edge_time=$time; (negedge clk) ; /* 等待,直到时钟发生负跳变后退出等待状态
14、,继续执行下一条语句 */neg_edge_time=$time;21第6章 行为描述(二):时间控制和赋值语句 (posedge clk) ; /* 等待,直到时钟再次正跳变后退出等待状态,继续执行下一条语句 */last_time=$time- pos_edge_time ;high_last_time= neg_edge_time pos_edge_time ;low_last_time= last_time- high_last_time;$display(The clk stay in High level for:%t,high_last_time );$display(The c
15、lk stay in Low level for:%t,low_last_time );$display(The clk signal Period is :%t,last_time );endendmodule 22第6章 行为描述(二):时间控制和赋值语句 (3) 边沿触发事件控制的第三种语法格式: ( or or or ) 行行为语为语句;句;在仿真进程遇到这种格式的边沿触发事件控制语句时如果所有的触发事件都没有发生,则仿真进程就会进入等待状态,直到其中的某一个触发事件发生后才启动执行后面给出的行为语句,仿真进程继续向下进行。例如例6-6给出的initial语句块所示。23第6章 行为描
16、述(二):时间控制和赋值语句 【例例6-6】边沿触发事件控制语句的例子。initialbegina=1;(posedge clk1 or negedge clk2 or b) a=b;end只要发生了这三个触发事件中的任一个,赋值语句“a=b;”的执行就被启动。程序实现的功能是:给a赋初值1,然后等到clk1发生正跳变或clk2发生负跳变或信号b发生跳变时,将b的逻辑值赋值给a。24第6章 行为描述(二):时间控制和赋值语句 (4) 边沿触发事件控制的第四种语法格式: ( or or or ) ; 仿真进程在遇到这条事件控制语句后会进入等待状态,直到敏感事件列表所包含的多个触发事件中的任何一个
17、得到发生后才结束等待状态,退出该事件控制语句并开始执行该事件控制语句后的下一条语句。25第6章 行为描述(二):时间控制和赋值语句 【例例6-7】连续监测信号a或b发生变化的时间。module display_information_of_change(a,b);input a,b;wire a,b;always /always过程块,重复进行监测begin (a or b ); /* 等待,直到a或b发生变化后退出等待状态,并开始下一条语句的执行 */$display (One of a and b changed in time:%t,$time);endendmodule26第6章 行为
18、描述(二):时间控制和赋值语句 可以看出,例6-7中begin-end串行块内的两条语句可以用如下一条语句替换: (a or b ) $display (One of a and b changed in time:%t,$time) ; 27第6章 行为描述(二):时间控制和赋值语句 2. 敏感事件列表在敏感事件列表在always过过程程块块中的使用中的使用always过程块可以带有事件控制。带有事件控制的always过程块既可以实现组合逻辑又可以实现时序逻辑;在用于实现这两种不同逻辑功能种类时,always过程块内的敏感事件列表会具有不同的特点。下面分别加以讨论。1) 用always过程块
19、实现组合逻辑功能(1) 事件表达式内不能包含“posedge”和“negedge”关键词,也就是说敏感事件列表中的事件表达式只能是前面所述的第一种事件表达式形式。上面给出的第一个特点是因为组合逻辑电路的输出是由输入电平所决定的,输入不同的跳变方式对输出不会产生任何影响,因此敏感事件列表中的事件表达式不能是其余两种对跳变边沿加以指定的形式。28第6章 行为描述(二):时间控制和赋值语句 (2) 组合逻辑的所有输入信号都要作为“”出现在敏感事件列表中。是因为组合逻辑电路的输入输出关系在每个时刻都应该是严格成立的,也就是说,无论什么时刻输入发生了变化,在输出端都应该立即有反应。如果某个输入信号没有出
20、现在敏感事件列表中,那么过程块就没有办法检测到该信号的变化,这个输入信号对输出的影响就不能实现,这样就不能在任意时刻保证组合逻辑的输入输出关系。29第6章 行为描述(二):时间控制和赋值语句 【例例6-8】不能正确实现三输入与门的模块。module three_input_and(a,b,c,out);input a,b,c ; /三个输入a,b,coutput out;reg out;always (a or b) /敏感事件列表中只包含了两个输入: a,bbeginout=a&b&c;endendmodule30第6章 行为描述(二):时间控制和赋值语句 【例例6-9】正确实现三输入与门的
21、模块。module three_input_and(a,b,c,out);input a,b,c ; /三个输入a,b,coutput out;reg out;always (a or b or c) /敏感事件列表中包含了所有输入beginout=a&b&c;endendmodule31第6章 行为描述(二):时间控制和赋值语句 下面再举一个用always过程块实现组合逻辑功能的例子。【例例6-10】利用敏感事件列表来对组合逻辑建模。module selective_adder_and_multiplier(a,b,sel,y);input a,b,sel;output y;wire3:0
22、a,b;reg7:0 y;always (a or b or sel)beginif (sel=0) y = a + b;else if(sel=1) y = a * b;endendmodulealways过程块中的敏感事件列表内包含了所有的输入信号,当任何一个输入发生变化都能及时地对输出进行更新。32第6章 行为描述(二):时间控制和赋值语句 2) 用always过程块实现时序逻辑功能(1) 事件表达式可以是事件表达式三种形式中的任何一种事件表达式可以是事件表达式三种形式中的任何一种,也就是说所采用的事件表达式既可以是带有“posedge”或“negedge”关键词的事件表达式,也可以是只
23、包含“信号名” 的事件表达式。33第6章 行为描述(二):时间控制和赋值语句 (2) 不要求所有的不要求所有的输输入信号都出入信号都出现现在敏感事件列表的在敏感事件列表的“信号名信号名”中。中。 这是由于时序逻辑电路逻辑状态的改变只发生在某个或某几个时钟输入信号的变化边沿,而在其它输入信号发生变化时电路逻辑状态保持不变。所以这时事件控制只需对这几个时钟输入信号进行监测就可以了,没有必要把其它输入信号也放入敏感事件列表中。34第6章 行为描述(二):时间控制和赋值语句 下面我们举几个例子来说明敏感事件列表在描述时序逻辑功能时的使用。【例例6-11】时钟下降沿触发的D触发器。module d_ff
24、(q,clk,d);input clk,d;output q;reg q;always ( negedge clk)begin q=d;endendmodule always过程块的敏感事件列表包含了事件表达式“negedge clk”。这个事件表达式带有“negedge”关键词,它指出该D触发器状态的改变发生在clk信号的负跳变边沿,在其余时刻D触发器状态将保持不变。35第6章 行为描述(二):时间控制和赋值语句 【例例6-12】同时由两个时钟沿:clk1上升沿和clk2下降沿进行控制的8位移位寄存器。module 8bits_shift_register(d_in,d_out,clk1,c
25、lk2);input clk1,clk2,d_in;output d_out;reg d_out; /d_out保存1bitreg1:7 data; / reg1:7保存其余7bitsreg1:4 i ; / i用于循环计数always ( posedge clk1 or negedge clk2)begind_out=data1; for ( i=1;i7;i=i+1)datai=datai+1;data7=d_in;endendmodule36第6章 行为描述(二):时间控制和赋值语句 3) always过程块实现组合和时序混合的逻辑功能要实现组合和时序混合的逻辑功能,我们可以在一个模块中
26、建立多个并行结构来实现。用一个或多个带有事件控制的always过程块来实现时序逻辑部分的功能;再用连续赋值语句或另外一个(或多个)always过程块来实现组合逻辑部分功能。在这种情况下,每一个always过程块只实现了一类逻辑,而我们现在要讨论的是用同一个always过程块来实现组合和时序混合的逻辑功能的情况。37第6章 行为描述(二):时间控制和赋值语句 在组合逻辑和时序逻辑混合的情况下,模块逻辑状态和输出发生变化时刻要同时受时钟信号跳变沿和某些输入控制信号的控制,典型的例子是带有异步置位(清零)控制输入的时钟边沿触发器。比如一个带有异步清零控制输入位clr的时钟上升沿T触发器,其输入输出真
27、值表如表6.4所示。38第6章 行为描述(二):时间控制和赋值语句 真值表的第1行说明:当清零信号clr为1时,无论其它输入信号和触发器当前状态如何(用“?”表示“任何状态”),触发器状态(也就是输出q)将始终为0; 真值表的第2行到第5行说明了清零信号clr为0时,T触发器处于正常工作状态:若在时钟上升沿输入t= 0则触发器状态保持不变,而如果在时钟上升沿输入t = 1则触发器的状态将发生翻转。39第6章 行为描述(二):时间控制和赋值语句 因此在输入clr为0时,触发器的逻辑功能是普通的时序逻辑,其状态和输出在时钟上升沿发生变化;而在输入clr变为1时,T触发器的输出立即变为0,这时的逻辑
28、功能就是关于控制信号clr的组合逻辑。 我们可以用一个always过程块来实现这种混合的逻辑功能,如例6-13所示。40第6章 行为描述(二):时间控制和赋值语句 【例例6-13】带有异步清零位clr(高电平有效)的时钟上升沿T触发器。module asyn_clear_Tff(clk,clr,t,q);input clk,clr,t;output q;reg q;always (posedge clk or posedge clr)beginif(clr=1)q=0;else if(t=1)q=q;endendmodule可以看出:在可以看出:在实现组实现组合和合和时时序序混合混合逻辑时逻辑
29、时,always语语句的敏句的敏感事件列表内要包含感事件列表内要包含时时序序逻辑逻辑部分的部分的时钟时钟信号和信号和组组合合逻辑逻辑部部分的分的输输入控制信号。入控制信号。 clk和和 clr就出就出现现在敏感事件在敏感事件列表中。列表中。这这两个信号中的任何两个信号中的任何一个一个发发生生变变化都会启化都会启动语动语句句块块的的执执行:根据控制信号行:根据控制信号clr的的逻逻辑电辑电平取平取值值,分,分别实现组别实现组合合逻逻辑辑和和时时序序逻辑逻辑41第6章 行为描述(二):时间控制和赋值语句 虽然可以利用一个always过程块来实现组合逻辑功能或者混合的逻辑功能,但必须注意到alway
30、s过程块主要是为了对时序逻辑建模而引入的一种描述方式。所以在实际硬件设计工作中应该尽量使用结构描述方式来描述组合逻辑,这样可以使综合后的结果更加接近实际硬件的结构。42第6章 行为描述(二):时间控制和赋值语句 6.1.3 电电平敏感事件控制平敏感事件控制(wait语语句句)“电平敏感事件控制”是与“边沿触发事件控制”对应的另一种事件控制类别。与边沿触发事件控制不同,在电平敏感事件控制方式下启动语句执行的触发条件是某一个指定的条件表达式为真。电平敏感事件控制用关键词“wait”来表示。它可以有如下三种形式: wait (条件表达式) 语句块; wait (条件表达式) 行为语句; wait (
31、条件表达式);43第6章 行为描述(二):时间控制和赋值语句 电平敏感事件控制的第一种形式中包含了一个语句块,它可以是串行块(begin-end块)或并行块(fork-join块)。在这种事件控制语句形式下,语句块启动执行的触发条件是:条件表达式的值为“真(逻辑1)”。如果当仿真进程执行到这条电平敏感事件控制语句时条件表达式的值是“真”,那么语句块立即得到执行;否则语句块要一直等到条件表达式变为“真”时再开始执行。比如如下语句:wait (enable=1) begind=a&b;d=d | c;end44第6章 行为描述(二):时间控制和赋值语句 电平敏感事件控制的第二种形式中包含了一条行为
32、语句,在这种事件控制语句形式下,行为语句启动执行的触发条件与前面第一种形式下的触发条件相同。 两者之两者之间间惟一不同之惟一不同之处处在于:在于:这这里启里启动动的是一条行的是一条行为语为语句的句的执执行,而在第一种形式下启行,而在第一种形式下启动动的是一个的是一个语语句句块块的的执执行。行。比如:wait (enable=1) d= (a&b) | c ;同样实现了“等待使能信号变为1后执行a,b,c的与或逻辑操作”的功能。在这里wait语句触发执行的是单条赋值语句“d= (a&b) |c;”。45第6章 行为描述(二):时间控制和赋值语句 在电平敏感事件控制的第三种形式中没有包含行为语句或
33、语句块。 wait (条件表达式); 这种形式的电平敏感事件控制常常用来对串行块中各条语句的执行时序进行控制。比如如下语句:beginwait (enable=1);d=a&b;d=d | c;end注意这种形式的wait语句在串行结构(串行块)中 才能实现时序控制功能。46第6章 行为描述(二):时间控制和赋值语句 电平敏感事件控制语句(wait语句)与 “边沿触发事件控制”的区别: 以以“”开开头头的的边边沿触沿触发发事件控制只事件控制只对对信号的跳信号的跳变边变边沿敏感,它沿敏感,它给给出的触出的触发发事件是指定的信号跳事件是指定的信号跳变边变边沿;沿; 以以“wait”开开头头的的电电
34、平敏感事件控制只平敏感事件控制只对对信号的信号的电电平敏感,它平敏感,它给给出的触出的触发发事件是指定的信号事件是指定的信号稳稳定定逻辑逻辑状状态态。 举一例加以说明:47第6章 行为描述(二):时间控制和赋值语句 【例例6-14】电平敏感事件控制与边沿触发事件控制的比较。module level_and_edge_sensitive_compare( flag1,flag2 );output flag1,flag2;reg enable,flag1,flag2;initial /第一个initial过程块,用于产生enable信号beginflag1=1;flag2=1;enable=1;#
35、10 enable=0;#10 enable=1;#10 $finish;end48第6章 行为描述(二):时间控制和赋值语句 initial /第二个initial过程块,用于实现电平敏感事件控制begin #10 ;wait(enable=1) flag1=flag1;/若触发条件成立,flag1翻转endinitial /第三个initial过程块,用于实现边沿触发事件控制begin #10 ; (posedge enable) flag2=flag2;/若触发条件成立,flag2翻转endendmodule 49第6章 行为描述(二):时间控制和赋值语句 图6.1 例6-14所示模块仿
36、真执行时产生的波形50第6章 行为描述(二):时间控制和赋值语句 6.2 赋赋 值值 语语 句句6.2.1 过过程程赋值语赋值语句的基本格式句的基本格式过程赋值语句是使用于两种结构化过程块(initial过程块和always过程块)中的赋值语句。在过程块中只能使用过程赋值语句(不能在不能在过过程程块块中出中出现连续赋值语现连续赋值语句句),同时过程赋值语句也只能用在过程块中。过程赋值语句的基本格式为: 其中是“=”或“=”之一,它们分别代表了阻塞型赋值和非阻塞型赋值类型。51第6章 行为描述(二):时间控制和赋值语句 过程赋值语句只能用于对寄存器类的变量(寄存器reg、整型integer、实型
37、real或时间型time变量)进行赋值操作。在经过过程赋值后,上面的这些变量的取值将保持不变,直到另一条过程赋值语句对变量重新赋值为止。52第6章 行为描述(二):时间控制和赋值语句 【例例6-15】过程赋值语句赋值操作的各种目标变量形式。reg a;reg 0:7 b;integer i;reg0:7 mem_10:1023 ;initialbegina=0;/对一个1位寄存器a赋值i=356;/对一个整型变量i赋值b2=1b1;/对8位寄存器b的第3位赋值b0:3=4b1111;/对8位寄存器b的前4位赋值mem_1 200=8hfd;/对存储器mem_1的第201个存储单元进行赋值a,b
38、=9b101110110;/对用连接运算符构成的一个整体进行赋值end 53第6章 行为描述(二):时间控制和赋值语句 根据对被赋值变量产生作用的优先级差别,可以将过程赋值语句分为如下两种类型: 普通过程赋值语句(简称过程赋值语句)。 过程连续赋值语句。其中普通过程赋值语句又可以根据赋值操作执行时的不同时序特点分成阻塞型过程赋值语句和非阻塞型过程赋值语句。54第6章 行为描述(二):时间控制和赋值语句 6.2.2 过过程程赋值赋值的两种延的两种延时时方式方式各种过程赋值语句都可以带有时间控制,过程赋值语句中可以出现延延时时控制形式的控制形式的时间时间控制控制和事件控制形式的事件控制形式的时间时
39、间控制控制。根据时间控制部分在过程赋值语句中出现的位置,可以把过程赋值语句中的时间控制方式分为如下两类: 外部时间控制方式。 内部时间控制方式。55第6章 行为描述(二):时间控制和赋值语句 1. 外部外部时间时间控制方式控制方式如果时间控制部分出现在整个过程赋值语句的最左端,也就是出现在赋值目标变量的左边,那么这种时间控制方式就是外部时间控制方式。在外部在外部时间时间控制方式下,控制方式下,过过程程赋值语赋值语句的仿真句的仿真执执行行过过程程:比如语句:#5 a=b; 56第6章 行为描述(二):时间控制和赋值语句 在仿真执行时就相当于如下几条语句的执行:initialbegin#5; /先
40、延时a=b; /再求b值并将其赋值给aend可见,在外部时间控制方式下,时间控制所“控制”的是过程赋值语句开始执行时刻到赋值表达式被计算以及赋值操作执行时刻之间的时间差。赋值表达式的计算以及对左端变量的赋值操作是发生在由时间控制部分所指定的时刻之后的。57第6章 行为描述(二):时间控制和赋值语句 【例例6-16】外部时间控制方式。module timing_control_out_mode(b,c,d,clk,enable);input clk,enable;output b,c,d;reg b,c,d;initial /此过程块用于对输出进行初始化forkb=0;c=0;d=0;joini
41、nitial /此过程块用于对输出进行赋值,其中包含了外部时间控制58第6章 行为描述(二):时间控制和赋值语句 fork#5 b=b; /语句S1(posedge clk) c=c; /语句S2wait (enable) d=d; /语句S3joinendmodule59第6章 行为描述(二):时间控制和赋值语句 2. 内部内部时间时间控制方式控制方式 过程赋值语句中的时间控制部分还可以出现在“赋值操作符”和“赋值表达式”之间。这种情况下的时间控制称为“内部时间控制方式”。在内部时间控制方式下,过程赋值语句执行步骤:A.A.仿真仿真仿真仿真进进进进程遇到程遇到程遇到程遇到带带带带有内部有内部
42、有内部有内部时间时间时间时间控制的控制的控制的控制的过过过过程程程程赋值语赋值语赋值语赋值语句后,立即句后,立即句后,立即句后,立即计计计计算算算算赋值语赋值语赋值语赋值语句中句中句中句中“ “赋值赋值赋值赋值表达式表达式表达式表达式” ”的的的的值值值值B.B.进进进进入入入入时间时间时间时间控制部分指定的等待状控制部分指定的等待状控制部分指定的等待状控制部分指定的等待状态态态态,一直等待指定的延,一直等待指定的延,一直等待指定的延,一直等待指定的延时时时时时时时时间间间间量量量量 或者是指定的触或者是指定的触或者是指定的触或者是指定的触发发发发事件事件事件事件发发发发生生生生C.C.将将将
43、将赋值赋值赋值赋值表达式的取表达式的取表达式的取表达式的取值赋给值赋给值赋给值赋给左端的被左端的被左端的被左端的被赋值变赋值变赋值变赋值变量。量。量。量。60第6章 行为描述(二):时间控制和赋值语句 比如语句: a = #5 b;它的执行等价于:initialbegintemp=b; /先求b的值#5; /再延时a=temp; /延时结束后再进行赋值操作End可见,在内部在内部时间时间控制方式下,控制方式下,时间时间控制所控制所“控制控制”的是的是赋值赋值表达式被表达式被计计算算时时刻到刻到赋值赋值操作被操作被执执行行时时刻之刻之间间的的时间时间差。差。61第6章 行为描述(二):时间控制和
44、赋值语句 【例例6-17】过程赋值语句中的内部时间控制方式。module timing_control_inner_mode(a,b,c,d,clk,enable);input a,clk,enable;output b,c,d;reg b,c,d;initial /此过程块用于对输出进行初始化forkb=0;c=0;d=0;join62第6章 行为描述(二):时间控制和赋值语句 initial /此模块用于对输出进行赋值,其中包含了内部时间控制forkb=#5 a; /语语句句S1c=(posedge clk) a ; /语语句句S2d= wait (enable) a ; /语语句句S3j
45、oinendmodule例6-17中第二个initial过程块内出现的三条过程赋值语句都带有内部方式的时间控制。63第6章 行为描述(二):时间控制和赋值语句 6.2.3 阻塞型阻塞型过过程程赋值赋值以以赋值赋值操作符操作符“”来来标识标识的的赋值赋值操作称操作称为为“阻塞型阻塞型过过程程赋值赋值”。阻塞型过程赋值语句的特点如下:(1) 串行串行块块(begin-end语语句句块块)中的各条阻塞型中的各条阻塞型过过程程赋值语赋值语句句将以它将以它们们在在顺顺序序块块中的先后排列次序依次得到中的先后排列次序依次得到执执行;而行;而fork-join并行并行块块中的各条阻塞型中的各条阻塞型过过程程
46、赋值语赋值语句句则则是同是同时时得到得到执执行的。行的。 (2) 阻塞型阻塞型过过程程赋值语赋值语句的句的执执行行过过程:首先程:首先计计算右端算右端赋值赋值表达表达式的取式的取值值,然后立即将,然后立即将计计算算结结果果赋值给赋值给“=”左端的被左端的被赋值变赋值变量。量。64第6章 行为描述(二):时间控制和赋值语句 【例例6-18】阻塞型过程赋值语句带有延时控制时的情况。initialbegina=0; /语语句句S1a=#5 1; /语语句句S2a=#10 0; /语语句句S3a=#15 1; /语语句句S4end65第6章 行为描述(二):时间控制和赋值语句 图6.4 带有延时控制的
47、阻塞型过程赋值产生的波形图6.4给出了例618所示模块仿真执行时输出信号a的波形。66第6章 行为描述(二):时间控制和赋值语句 6.2.4 非阻塞型非阻塞型过过程程赋值赋值 以以赋值赋值操作符操作符“=”来来标识标识的的赋值赋值操作称操作称为为“非阻塞型非阻塞型过过程程赋值赋值”非阻塞型过程赋值语句的特点是:(1) 在在begin-end串行串行语语句句块块中,一条非阻塞型中,一条非阻塞型过过程程赋值语赋值语句句的的执执行不会阻塞下一条行不会阻塞下一条语语句的句的执执行。行。 (2) 仿真仿真进进程在遇到非阻塞型程在遇到非阻塞型过过程程赋值语赋值语句后首先句后首先计计算其右端算其右端赋值赋值
48、表达式的表达式的值值,然后要等到当前仿真,然后要等到当前仿真时间时间步步结结束束时时再将再将该计该计算算结结果果赋值给赋值变赋值给赋值变量。量。67第6章 行为描述(二):时间控制和赋值语句 为了了解非阻塞型过程赋值语句的上述两个特点,我们可以观察如下语句:initialbeginA = B; /语语句句S1B = A; /语语句句S2end68第6章 行为描述(二):时间控制和赋值语句 非阻塞型非阻塞型过过程程赋值语赋值语句句带带有外部延有外部延时时控制控制它的它的执执行相当于在指定的延行相当于在指定的延时时之后之后执执行一条不行一条不带时间带时间控控制的非阻塞型制的非阻塞型过过程程赋值语赋
49、值语句。并且句。并且这这条非阻塞型条非阻塞型过过程程赋赋值语值语句不会阻塞其后面句不会阻塞其后面语语句的句的执执行。行。69第6章 行为描述(二):时间控制和赋值语句 【例例6-19】带有外部延时控制的非阻塞型过程赋值语句。initial /过过程程块块1begin#5 a = b; /语语句句S1#10 c = d; /语语句句S2end70第6章 行为描述(二):时间控制和赋值语句 上面的过程块1相当于如下的过程块2:initial /过程块2forkbegin /语语句句块块1#5;a=b;endbegin /语语句句块块2#10;c=d;endjoin71第6章 行为描述(二):时间控
50、制和赋值语句 图6.5 带有外部延时控制的非阻塞型过程赋值语句的执行时序过程块的执行时序如图6.5所示。 72第6章 行为描述(二):时间控制和赋值语句 非阻塞型非阻塞型过过程程赋值语赋值语句句带带有内部延有内部延时时控制控制 仿真仿真进进程在遇到程在遇到这这种种赋值语赋值语句后将立即句后将立即计计算算语语句右端句右端赋值赋值表表达式的达式的值值,然后,然后进进入延入延时时控制部分所指定的等待状控制部分所指定的等待状态态,直到退出,直到退出等待状等待状态时态时刻所在刻所在时间时间步的末尾才步的末尾才执执行行赋值赋值操作,将已操作,将已计计算得到算得到的的赋值赋值表达式表达式结结果果值赋给值赋给
51、被被赋值变赋值变量。量。 例如如下语句:a=#10 b;73第6章 行为描述(二):时间控制和赋值语句 同同时时使用了阻塞型使用了阻塞型过过程程赋值语赋值语句和非阻塞型句和非阻塞型过过程程赋值语赋值语句的句的一个例子,注意两种一个例子,注意两种赋值赋值方式的区方式的区别别。【例例6-21】同时使用阻塞型过程赋值语句和非阻塞型过程赋值语句。reg a,b,c;initialbegin a=0; /语语句句S1a=1; /语语句句S2b=a; /语语句句S3#5; /等待一定的等待一定的时时延延c=a; /语语句句S4end74第6章 行为描述(二):时间控制和赋值语句 6.2.5 连续赋值语连续
52、赋值语句句Verilog HDL语言中的连续赋值语句与过程块一样也是一种行为描述语句。主要主要对组对组合合逻辑电逻辑电路的行路的行为进为进行描述。行描述。连续赋值语句只能用来对连线型变量进行驱动(赋值),而不能对寄存器型变量进行赋值,它可以采取如下两种格式:(1) 显显式式连续赋值语连续赋值语句:句:连线连线型型变变量量类类型型 连线连线型型变变量位量位宽宽 连线连线型型变变量名;量名;assign #(延延时时量量) 连线连线型型变变量名量名 = 赋值赋值表达式;表达式;(2) 隐隐式式连续赋值语连续赋值语句:句:连线连线型型变变量量类类型型(赋值驱动赋值驱动强强度度)连线连线型型变变量位量
53、位宽宽 #(延延时时量量) 连线连线型型变变量名量名= 赋值赋值表达式;表达式;它包含了两条它包含了两条语语句:第一条句:第一条语语句是句是对连线对连线型型变变量量进进行行类类型型说说明的明的说说明明语语句;第二条句;第二条语语句是句是对这对这个已得到声明的个已得到声明的连线连线型型变变量量进进行行连续赋值连续赋值的的赋值语赋值语句。句。75第6章 行为描述(二):时间控制和赋值语句 【例例6-22】显式连续赋值语句。module and_cont_assignment (z,x,y);input 3:0 x,y;output 3:0 z; wire 3:0 z, x, y; / 连线型变量说
54、明assign #(1.5, 1.0, 2.0) z = x & y; /连续赋值语句endmodule其中指定的延时量为“(1.5,1.0,2.0)”,它指明了从信号x或y发生变化时刻到变量z被更新时刻之间的延时时间量:上升延时为1.5个时间单位,下降延时为1个时间单位,关断延时为2个时间单位。一个一个显显式式连续赋值语连续赋值语句的例子句的例子:76第6章 行为描述(二):时间控制和赋值语句 【例例6-23】隐式连续赋值语句。module and_cont_assignment(z,x,y);input 3:0 x,y;output 3:0 z; wire 3:0 x, y; / 输输入入
55、连线连线型型变变量量说说明明wire 3:0 #(1.5,1.0,2.0) z = x & y; /隐隐式式连续赋值语连续赋值语句句endmodule再再给给出一个出一个隐隐式式连续赋值语连续赋值语句的例子,它描述了与上例相同的句的例子,它描述了与上例相同的硬件行硬件行为为。77第6章 行为描述(二):时间控制和赋值语句 在实际使用中,连续赋值语句的赋值目标可以是如下几种: (1) 标量连线型变量。如wire a,b;assign a = b;(2) 向量连线型变量。如wire 7:0 a,b;assign a = b;(3) 向量连线型变量中的某一位。如wire 7:0 a,b;assign
56、 a3 = b3 ;78第6章 行为描述(二):时间控制和赋值语句 (4) 向量连线型变量中的某几位。如:wire 7:0 a,b;assign a3:2 = b3:2;(5) 上面几种类型的任意拼接运算结果。如wire a,c;wire 2:1 b;assign a,c = b ;在需要对多个多个连线连线型型变变量量进进行行连续赋值连续赋值时,还可以采用如下形式的连续赋值语句,它可以实现对多个变量进行连续赋值:assign out_and = a&b;out_or = a|b;out_xor = ab;out_not_a = a;out_not_b = b;上述语句是下面5条独立的连续赋值语
57、句的简化形式:assign out_and = a&b;assign out_or = a|b;assign out_xor = ab;assign out_not_a = a;assign out_not_b = b;79第6章 行为描述(二):时间控制和赋值语句 连续赋值语连续赋值语句特点:句特点:正如“连续赋值”这一名称所表述的含义,连续赋值语句对连线型变量(wire)进行的是连续的驱动。与寄存器型变量类型不同,连线型变量没有数据保持能力,只有在被连续驱动后才能取得确定值,若一个连线型变量没有得到任何连续驱动则它的取值将为不定态“x”。连续赋值就是实现对连线型变量进行连续驱动的一种方法。
58、80第6章 行为描述(二):时间控制和赋值语句 一个一个一个一个连线连线连线连线型型型型变变变变量一旦被量一旦被量一旦被量一旦被连续赋值语连续赋值语连续赋值语连续赋值语句句句句赋值赋值赋值赋值后,后,后,后,赋值语赋值语赋值语赋值语句右端句右端句右端句右端赋值赋值赋值赋值表达式的表达式的表达式的表达式的值值值值将始将始将始将始终对终对终对终对被被被被赋值连线赋值连线赋值连线赋值连线型型型型变变变变量量量量产产产产生生生生驱动驱动驱动驱动( (连续驱动连续驱动连续驱动连续驱动) )。在仿真在仿真在仿真在仿真执执执执行行行行时时时时,只要右端,只要右端,只要右端,只要右端赋值赋值赋值赋值表达式内的
59、任一操作数表达式内的任一操作数表达式内的任一操作数表达式内的任一操作数发发发发生生生生变变变变化,化,化,化,就会立即触就会立即触就会立即触就会立即触发对发对发对发对被被被被赋值连线赋值连线赋值连线赋值连线型型型型变变变变量的更新操作:重新量的更新操作:重新量的更新操作:重新量的更新操作:重新计计计计算算算算赋值赋值赋值赋值表表表表达式的取达式的取达式的取达式的取值值值值,然后将,然后将,然后将,然后将计计计计算得到的算得到的算得到的算得到的结结结结果果果果赋值给赋值给赋值给赋值给被被被被赋值连线赋值连线赋值连线赋值连线型型型型变变变变量。量。量。量。 例例6.24 AND 例例6.2581第
60、6章 行为描述(二):时间控制和赋值语句 【例例6-24】连续赋值语句的例子。module or_by_cont_assignment(c,a,b);input a,b;output c;assign c=a|b;endmodule82第6章 行为描述(二):时间控制和赋值语句 【例例6-25】与例624等价的描述。module or_by_proc_assignment(c,a,b);input a,b;output c;reg c;initial/initial过过程程块块用于用于对对c赋赋初初值值beginc=x;endalways (a or b)/always过过程程块块用于更新用于
61、更新c的取的取值值c=a|b;endmodule83第6章 行为描述(二):时间控制和赋值语句 如果连续赋值语句带有延时(#delay),则在仿真执行时,只要右端赋值表达式中的任一信号发生变化,都将立即对赋值表达式进行重新计算,然后进入延时等待状态,等到指定的延时时间过去后再将计算得到的赋值表达式取值结果赋值给被赋值连线型变量。84第6章 行为描述(二):时间控制和赋值语句 例如,下面这条连续赋值语句:assign #5 a = b; 指定的驱动方式就是:当当当当b b的的的的值发值发值发值发生生生生变变变变化化化化时时时时,立即,立即,立即,立即对赋值对赋值对赋值对赋值表达式表达式表达式表达
62、式“b”“b”的取的取的取的取值进值进值进值进行行行行计计计计算算算算 ,然后,然后,然后,然后进进进进入入入入“ “5”5”指定的延指定的延指定的延指定的延时时时时等待状等待状等待状等待状态态态态,直到,直到,直到,直到过过过过了了了了5 5个个个个时间单时间单时间单时间单位的延位的延位的延位的延时时间时时间时时间时时间后才后才后才后才对对对对a a执执执执行行行行赋值赋值赋值赋值操作,操作,操作,操作,赋值赋值赋值赋值表达式表达式表达式表达式取取取取值值值值的的的的计计计计算算算算结结结结果果果果(b(b发发发发生生生生变变变变化后的采化后的采化后的采化后的采样值样值样值样值) )赋值给赋
63、值给赋值给赋值给a a。图6.7给出了这条连续赋值语句在仿真执行时的时序图。85第6章 行为描述(二):时间控制和赋值语句 图6.7 连续赋值语句“assign #5 a=b;”执行时的时序图86第6章 行为描述(二):时间控制和赋值语句 如果在一个模块内包含了多条连续赋值语句,或者在一个模块中同时包含了连续赋值语句、过程块、模块实例或原语实例时,各条连续赋值语句和其它的过程块、模块实例和原语实例之间是以并行并行并行并行方式执行的:各条连续赋值语句、模块实例和原语实例都是同时在零仿真时刻产生作用,并且过程块也是从零时刻开始执行的。下面给出用连续赋值语句实现4位全加器的一个例子,如例6-26所示
64、。87第6章 行为描述(二):时间控制和赋值语句 【例例6-26】4位全加器。module adder_4(a,b,ci,sum,co);input 3:0 a,b;input ci;output 3:0sum;output co;assign coassign co,sum = a + b + cisum = a + b + ci; / /连续赋值语连续赋值语连续赋值语连续赋值语句句句句endmodule88第6章 行为描述(二):时间控制和赋值语句 最后最后总结总结一下一下连续赋值语连续赋值语句和句和过过程程赋值语赋值语句之句之间间的区的区别别:(1) 从语法上来看,连续赋值语句由“ass
65、ign”关键词来标识,而过程赋值语句中则不包含这个关键词。 (2) 连续赋值语句左边的被赋值变量必须是连线类型的变量,而过程赋值语句中的被赋值变量则必须是寄存器类型的变量。(3) 连续赋值语不能出现在过程块(initial过程块或always过程块)中,而过程赋值语句则只能出现在过程块内。89第6章 行为描述(二):时间控制和赋值语句 (4) 连续赋值语句主要用来对组合逻辑电路进行建模以及对连线型变量间的连接进行描述,而过程赋值语句则主要用来对时序逻辑电路进行行为描述。(5) 连续赋值语句对被赋值变量(连线类型变量)的赋值是“连续”的,而在过程赋值语句情况下,只有在过程赋值语句被执行时才执行赋
66、值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响。90第6章 行为描述(二):时间控制和赋值语句 6.2.6 过过程程连续赋值语连续赋值语句句过程连续赋值语句也是一种过程性赋值语句,它用来实现过程连续赋值。过程连续赋值是在过程块内对变量进行连续赋值。过过程程连续赋值语连续赋值语句与句与连续赋值语连续赋值语句的不同之句的不同之处处在于:在于: 过程连续赋值语句只能用在过程块(initial过程块或always过程块)中,而连续赋值语句则不能出现在过程块中。 过程连续赋值语句可以对寄存器类变量进行连续赋值 ,它的赋值目标不可以是变量的某一位或者某几位,而连续赋值语句只能对连线型变量产生
67、作用,它的赋值目标可以是变量的某一位或者某几位。91第6章 行为描述(二):时间控制和赋值语句 过程连续赋值语句执行的是一种“连续赋值”:一旦对某个变量进行了过程连续赋值,则该变量将一直受到过程连续赋值语句内“赋值表达式”的连续驱动,“赋值表达式”内操作数的任何变化都会引起被赋值变量取值的更新,直到对该变量执行了“撤销过程连续赋值”操作为止。在Verilog HDL中有两组过程连续赋值语句可以实现过程连续赋值,它们是“assign“assigndeassign”deassign”语语语语句句句句组组组组和“force“forcerelease”release”语语语语句句句句组组组组过过程程连
68、续赋值语连续赋值语句与句与连续赋值语连续赋值语句的相同之句的相同之处处在于:在于:92第6章 行为描述(二):时间控制和赋值语句 1. assign与与deassign“assign语句”和“deassign语句”构成了一组过程连续赋值语句。它们只能用于对寄存器类变量的连续赋值操作,而不能用来对连线类变量进行连续赋值操作。其中“assign语句”用来实现对寄存器类变量的连续赋值,而“deassign语句”则是一条撤销连续赋值的语句,它用来解除寄存器类变量上的、由assign语句实现的连续赋值状态。93第6章 行为描述(二):时间控制和赋值语句 (1) “assign语句”的使用语法是:assi
69、gn assign ;其中“寄存器类变量”指明了连续赋值操作的目标变量,而“赋值表达式”则指明了连续赋值的“驱动源”。一旦assign语句得到执行,寄存器类变量将由赋值表达式进行连续驱动,它将进入被连续赋值的状态。如果这时有普通的过程赋值语句对该寄存器变量进行过程赋值操作,由于过过程程连续赋连续赋值语值语句句“assign”的的优优先先级级高于普通高于普通过过程程赋值语赋值语句句,所以处于连续赋值状态下的寄存器变量将忽视普通过程赋值语句对它的过程赋值操作,它的逻辑状态仍然由过程连续赋值语句内的赋值表达式所决定。94第6章 行为描述(二):时间控制和赋值语句 如果先后有两条assign语句对同一
70、寄存器变量进行了过程连续赋值,那么第二条assign语句的执行将覆盖第一条assign语句的执行效果,也就是说寄存器变量最终将进入由第二条assign语句实现的连续赋值状态。比如下面的语句:reg out3:0initialbeginout=0; /S1,过程赋值语句#10;assign out = a & b; /S2,第一条过程连续赋值语句#10;assign out = a | b;/S3,第二条过程连续赋值语句end95第6章 行为描述(二):时间控制和赋值语句 (2) “deassign语句”的使用语法是:deassign deassign ;“deassign语句”是一条撤销连续赋
71、值语句。当它得到执行后,原先由assign语句对变量进行的连续赋值操作将失效,寄存器变量被连续赋值的状态将得到解除,该变量又可以由普通的过程赋值语句进行赋值操作了。96第6章 行为描述(二):时间控制和赋值语句 需要注意的是:当用deassign语句来撤销了对某个寄存器变量的连续赋值后,该寄存器变量仍将保持deassign语句执行前的原有取值,比如在如下语句:reg3:0 out;initialbeginout = 0out = 0;/S1/S1,过过过过程程程程赋值语赋值语赋值语赋值语句句句句assign out =1assign out =1;/S2/S2,第一条,第一条,第一条,第一条过
72、过过过程程程程连续赋值语连续赋值语连续赋值语连续赋值语句句句句 assign out = 2assign out = 2;/S3/S3,第二条,第二条,第二条,第二条过过过过程程程程连续赋值语连续赋值语连续赋值语连续赋值语句句句句 deassign outdeassign out;/S4/S4,撤,撤,撤,撤销连续赋值语销连续赋值语销连续赋值语销连续赋值语句句句句end 97第6章 行为描述(二):时间控制和赋值语句 2. force与与release“force语句”和“release语句”也构成了一组过程连续赋值语句。这组过程连续赋值语句不仅能对寄存器类变量产生作用,还能对连线型变量进行连
73、续赋值操作。 “ “forceforce语语语语句句句句” ”用来用来用来用来实现对实现对实现对实现对寄存器或寄存器或寄存器或寄存器或连线连线连线连线型型型型变变变变量的量的量的量的连续赋值连续赋值连续赋值连续赋值,我,我,我,我们们们们称它称它称它称它为为为为“ “强强强强制制制制语语语语句句句句” ”。 forceforce语语语语句的句的句的句的优优优优先先先先级级级级高于高于高于高于“ “assignassign语语语语句句句句” ”。 “ “releaserelease语语语语句句句句” ”则类则类则类则类似于似于似于似于“ “deassigndeassign语语语语句句句句” ”的
74、作用,它用来解除指的作用,它用来解除指的作用,它用来解除指的作用,它用来解除指定寄存器定寄存器定寄存器定寄存器变变变变量或量或量或量或连线连线连线连线型型型型变变变变量上的、由量上的、由量上的、由量上的、由“ “forceforce语语语语句句句句” ”实现实现实现实现的的的的连续赋连续赋连续赋连续赋值值值值状状状状态态态态,我,我,我,我们们们们称它称它称它称它为为为为“ “释释释释放放放放语语语语句句句句” ”。98第6章 行为描述(二):时间控制和赋值语句 (1) “force语句”的使用语法如下:force force ;如果如果force语语句内指定的被句内指定的被赋值赋值目目标变标
75、变量是寄存器量是寄存器类变类变量量:则在“force语句”得到执行后,该寄存器类变量将强制地由“”进行连续驱动,进入被连续赋值的状态,这时将忽略其它较低优先级的赋值语句(普通过程赋值语句或assign语句)对这个寄存器变量的赋值操作,直到执行了一条“release语句”来释放对这个寄存器变量的连续赋值为止。比如例6-28中的过程块所示。99第6章 行为描述(二):时间控制和赋值语句 【例例6-28】force语句的例子。reg 2:0 var_reg1,var_reg2 ; initialbeginvar_reg1 = 0; /S1,过程赋值语句assign var_reg2 = 1; /S2
76、, 过程连续赋值语句,assign语句#10;force var_reg1 = 4; /S3, 过程连续赋值语句,force语句force var_reg2 = 4; /S4, 过程连续赋值语句,force 语句end上述语句实现了对两个寄存器变量var_reg1和var_reg2的过程连续赋值100第6章 行为描述(二):时间控制和赋值语句 如果如果force语语句指定的被句指定的被赋值赋值目目标变标变量是量是连线连线型型变变量量: 在force语句得到执行后,对应的连线型变量将得到“赋值表达式”的连续驱动,此时将忽略该连线型变量上的较低优先级的驱动(如assign连续赋值语句对该连线型变量
77、的驱动,实例输出端对连线型变量的驱动),直到有一条release语句来释放对该变量的连续驱动为止。101第6章 行为描述(二):时间控制和赋值语句 【例例6-29】force语句的例子。module demo(var_net1,var_net2,in1,in2);input in1,in2;output var_net1,var_net2;wire var_net1,var_net2,in1,in2; / 本例中用到的都是连线型变量assign var_net1= 0; / S1,连续赋值语句,将var_net1连续赋值为0or #1 ( var_net2, in1, in2 ); / S2,
78、原语实例语句,指定“或”门输出对var_net2进行驱动initial /initial过程块102第6章 行为描述(二):时间控制和赋值语句 begin#5;force var_net1= in1 & in2; / S3,过程连续赋值语句,force语句,作用于var_net1, 注意force语句只能出现在过程块中force var_net2 = (in1) & in2; / S4, 过程连续赋值语句, force语句, 作用于var_net2endendmodule103第6章 行为描述(二):时间控制和赋值语句 (2) “release语句”的使用语法如下: release relea
79、se ; 在执行了release语句后,原先由force语句对变量实施的连续赋值操作将失效,变量将解除被连续赋值的状态,从此刻起该变量又可以由其它低优先级的赋值语句进行赋值操作了。104第6章 行为描述(二):时间控制和赋值语句 1. 1. 在在在在releaserelease语语语语句内的目句内的目句内的目句内的目标变标变标变标变量是寄存器量是寄存器量是寄存器量是寄存器类变类变类变类变量的情况下:量的情况下:量的情况下:量的情况下:2. 如果在force语句执行之前该寄存器变量已经由于受“assign语句”的作用而处于被连续赋值的状态,那么在执行了“release语句”后,这个寄存器变量将恢
80、复到由assign语句实现的连续赋值状态;3. 如果在force语句执行之前该寄存器变量没有处于被连续赋值的状态,那么在执行了“release语句”后,这个寄存器变量将退出连续赋值状态,其取值保持不变。105第6章 行为描述(二):时间控制和赋值语句 举例来说, 如果我们在例6-28所示的过程块中加上release语句。【例例6-30】release语句的例子。reg 2:0 var_reg1,var_reg2 ; initialbeginvar_reg1 = 0; /S1,过程赋值语句assign var_reg2 = 1; /S2,过程连续赋值语句,assign语句#10;force va
81、r_reg1 = 4; /S3,过程连续赋值语句,force语句force var_reg2 = 4; /S4,过程连续赋值语句,force 语句#10;release var_reg1; /S5,release语句,作用于变量var_reg1release var_reg2; /S6,release语句,作用于变量var_reg2end106第6章 行为描述(二):时间控制和赋值语句 在在在在releaserelease语语语语句内的目句内的目句内的目句内的目标变标变标变标变量是量是量是量是连线连线连线连线型型型型变变变变量的情况下:量的情况下:量的情况下:量的情况下: 如果在force语句执行之前该连线型变量已经通过“assign语语句句”或原原语实语实例例语语句句指定了驱动源,那么在执行了release语句后,这个连线型变量将恢复到原有的驱动方式。107第6章 行为描述(二):时间控制和赋值语句 108