Verilog基础:disable语句

相关文章

Verilog基础:表达式位宽的确定(位宽拓展)        

Verilog基础:表达式符号的确定

Verilog基础:数据类型

Verilog基础:位宽拓展和有符号数运算的联系

Verilog基础:case、casex、casez语句

Verilog基础:casex和full_case、parallel_case的使用

Verilog基础:表达式中的整数常量(integer)

Verilog基础:task和function的使用(一)

Verilog基础:task和function的使用(二)

Verilog基础:标识符的向上向下层次名引用


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。

always begin : monostable
    #250 q = 0;
end 
always @retrig begin 
    disable monostable;
    q = 1;
end

以上内容来源于《Verilog 编程艺术》和《IEEE Standard for SystemVerilog》

猜你喜欢

转载自blog.csdn.net/weixin_45791458/article/details/131543670