差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

disable  [2018/09/14 13:33] (当前版本)
group001 创建
行 1: 行 1:
 +disable语句提供了终止并发活动进程的能力,同时保持了Verilog过程描述的结构化本质。disable语句在处理意外情况时很有用,例如硬件中断或全局复位。\\ 
 +disable语句可以有如下用途。\\ 
 +  - 提前结束task的执行。 
 +  - 终止命名块的执行。 
 +  - 跳出循环语句(类似于C语言的break)。 
 +  - 忽略循环中的后续语句(类似于C语言的continue)。 
 +disable语句能够终止task或命名块的活动,说明如下:\\ 
 +  - 在disable语句执行后,task或命名块就停止执行,然后位于task使能之后或位于命名块之后的语句开始执行。 
 +  - 如果task使能是嵌套的(例如,A使能B,B使能C),那么在disable一个task时,也disable所有被嵌套使能的task(例如,disable A,那么A、B和C全都终止)。 
 +  - 如果task被并发地使能多次,那么当一个并发的task被disable时,所有使能的task全都被终止。 
 +如果task被disable,那么下面的结果没有定义。\\ 
 +  - 从output和input参数返回的结果。 
 +  - 已经调度但是还没有执行的非阻塞赋值。 
 +  - 过程连续赋值(assign和force语句)。 
 +disable语句可以用在包含disable语句的命名块,或者用在包含disable语句的task。disable语句可以用于function中的命名块,但是不能用于function。\\ 
 +例子:包含disable语句的命名块。\\ 
 +<code verilog>​ 
 +begin : block_name 
 +  rega = regb; 
 +  disable block_name;​ 
 +  regc = rega; // this assignment will never execute 
 +end 
 +</​code>​ 
 +\\ 
 +例子:disable语句当做goto使用,命名块后面的语句继续执行。\\ 
 +<code verilog>​ 
 +begin : block_name 
 +........ 
 + if (a == 0) 
 +  disable block_name;​ 
 +........ 
 +end // end of named block 
 +// continue with code following named block 
 +........ 
 +</​code>​ 
 +\\ 
 +例子:disable语句当做early-return使用。\\ 
 +注意:它不像C语言中的return,因为output和inout参数是不定的。\\ 
 +<code verilog>​ 
 +task proc_a; 
 + ​begin 
 +  ........ 
 +  if (a == 0) 
 +   ​disable proc_a; // return if true 
 +  ........ 
 + end 
 +endtask 
 +</​code>​ 
 +\\ 
 +例子:disable语句当做return使用。\\ 
 +注意:这里它才像C语言中的return,因为output和inout参数会正确地返回。\\ 
 +<code verilog>​ 
 +task proc_a; 
 + ​begin:​ block_proc_a 
 +  ........ 
 +  if (a == 0) 
 +   ​disable block_proc_a;​ // return if true 
 +  ........ 
 + end 
 +endtask 
 +</​code>​ 
 +\\ 
 +例子:disable语句当做循环中的break和continue(C语言)使用。\\ 
 +<code verilog>​ 
 +begin: break_block 
 + for (i = 0; i < n; i = i+1) begin: continue_block 
 +  @clk 
 +  if (a == 0) // "​continue"​ loop 
 +   ​disable continue_block;​ 
 +  ........ 
 +  @clk 
 +  if (a == b) // "​break"​ from loop 
 +   ​disable break_block;​ 
 +  ........ 
 + end 
 +end 
 +</​code>​