相关文章
Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html
1.disable语句
disable语句提供了终止并发活动过程的能力,同时保持了Verilog过程描述的结构化本质。disable语句在处理意外情况时很有用,例如硬件中断或全局复位。
disable语句可以有如下用途。
1、提前结束task的执行。
2、终止命名块的执行,执行后面的语句(类似于C语言的goto)。
3、跳出循环语句(类似于C语言的break)。
4、跳出循环中的后续语句(类似于C语言的continue)。
disable语句能够终止task或命名块的活动,说明如下:
1、在disable语句执行后,task或者命名块的执行(包括此时命名块内已经使能的task)将被停止,然后位于task使能语句和命名块之后的语句开始执行。
2、如果task使能时嵌套的(例如,A使能B,B使能C),那么在disable一个task时,将禁用所有向下嵌套的task(例如,disable A,那么A、B和C全部终止),不管此时是否B,C是否已被使能。
3、如果task被并发地使能多次,那么disable该任务将终止该任务的所有激活。
如果任务被终止,那么下面的结果没有定义。
1、从output和inout参数返回给实参的值。
2、已经调度但还没进行LHS赋值的非阻塞赋值。
3、过程连续赋值(assign 和 force)。
可以在命名块和任务中使用disable语句来禁用包含disable语句的命名块或任务。disable语句也可用于禁用函数中的命名块,但不能用于禁用函数。如果函数中的disable语句禁用了调用该函数的命名块或任务,则该行为是未定义的。禁用自动任务或自动任务中的命名块的过程与禁用常规任务的过程一样,适用于该任务的所有并发执行(第三条)。
2.disable语句的例子
例子:禁用包含disable语句的命名块。
//块在块内终止了自己
begin: block_name
rega = reg b;
disable block_name;
regc = rega; //这条语句永远不会被执行
end
例子:disable语句当做goto使用,命名块后的语句继续执行。
begin: block_name
...........
if(a == 0)
disable block_name;
end //命名块的结束
//继续执行下面的语句
..........
例子:这个例子演示了使用disable语句终止不包含此disable语句的命名块的执行。如果块当前正在执行,这将导致控制跳转到块之后的语句。如果块是循环体,它的行为就像一个continue(进入下一次循环)。如果该块当前没有执行,则disable不起作用。
module m (...);
always begin:always1
....
task1(); //task使能
....
end
always begin
....
disable always1; //跳出always块,如果此时task1正在执行,则会终止执行
....
end
endmodule
例子:这个例子演示了disable被当做从一个task的提早返回(注意是提早)。
task proc_a;
begin: block_name
...........
if(a == 0)
disable proc_a;//退出任务,此时的返回值是不定的
end //命名块的结束
endtask //任务的结束
例子:这个例子演示了disable被当做从一个task的返回(类似于C语言的return)。
task proc_a;
begin: block_name
...........
if(a == 0)
disable block_name;//退出命名块,随后任务正常返回
end //命名块的结束
endtask //任务的结束
例子:这个例子展示了以与continue和break两个语句相同的方式使用disable语句。
begin : outer_block
for (i = 0; i < n; i = i+1) begin : inner_block
@clk
if (a == 0) // "continue" loop
disable inner_block ; //这相当于退出for中的命名块,根据条件可能执行下一次for循环
... // statements
@clk
if (a == b) // "break" from loop
disable outer_block; //这相当于退出包括for的命名块,这会终止for语句的执行
... // statements
end
end
例子:这个例子展示了并发执行的disable语句。使用disable语句同时禁用一系列语句和名为action的任务。该示例显示了一个fork-join块,其中包含一个命名的顺序块(event_expr)和一个disable语句,该语句等待事件reset的发生。顺序块和disable语句并行执行。event_expr块等待事件ev1出现一次,事件trig出现三次。当这四个事件发生后,再加上d个时间单位的延迟,任务操作就会执行。当事件重置发生时,无论顺序块中的事件是什么,fork-join块都会终止,包括任务的执行。
fork
begin : event_expr
@ev1;
repeat (3) @trig;
#d action (areg, breg);
end
@reset disable event_expr;
join
例子:下一个例子是可触发单稳态的行为描述。事件retrig的发生将重新启动单稳定时间段并给q赋值1。如果在250个时间单位内retrig重复发生,那么q将保持为1,而不会变成0。文章来源:https://www.toymoban.com/news/detail-538725.html
always begin : monostable
#250 q = 0;
end
always @retrig begin
disable monostable;
q = 1;
end
以上内容来源于《Verilog 编程艺术》和《IEEE Standard for SystemVerilog》文章来源地址https://www.toymoban.com/news/detail-538725.html
到了这里,关于Verilog基础:disable语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!