控制流

Untitled Diagram-Page-2 drawio (17)

1. 条件语句#

条件语句用于检查块中的语句是否被执行。条件语句创建语句块。如果给出的表达式是 true,执行块中的语句集,如果表达式为 false,则 else 块语句将最后执行。

序号条件语句
1.if
2.if-else
3.if-else ladder
4.unique if
5.unique0 if
6.priority if

1.1 不同条件表达式之间的差异#

条件if elseifunique ifunique0 ifpriority if
只有一个条件表达式为真执行 true 条件块内的语句集执行 true 条件块内的语句集执行 true 条件块内的语句集执行 true 条件块内的语句集
多个条件表达式为真执行第一个 true 条件块语句,不显示警告执行第一个为真的条件块语句,显示警告执行第一个为真的条件块语句,显示警告执行第一个 true 条件块语句,不显示警告
没有 else,条件表达式都不为真不执行 true 条件块内的语句, 不显示警告不执行 true 条件块内的语句, 显示警告不执行 true 条件块内的语句, 不显示警告不执行 true 条件块内的语句, 显示警告

警告的目的

unique if、unique0 if 和priority if 是 SystemVerilog 中 if-else 条件语句的更新版本。这些条件语句显示警告,有助于检测死代码或未使用的条件语句。

1.2 死代码 Dead code#

死代码(Dead code)是对模拟或综合没有任何影响的代码。死代码的示例是从未使用的信号或从未触发的条件。

死代码不会打扰模拟器或综合工具。然而,它会消耗任何阅读代码的人的精神能量。人们会尝试找出给定语句的目的,可能需要一段时间才能意识到他们正在处理死代码。这使得审查代码和重用代码的成本更高。一般来说,死代码是一种应该避免的技术债务。

2. case 语句#

case 语句允许我们执行特定 case 表达式的代码。这将为长代码提供正确的结构,并降低代码的复杂性。

case 语句计算给定的表达式,并根据计算值(匹配特定条件)执行与其关联的语句。基本上,它用于根据不同的条件执行不同的操作。

systemVerilog case 语句以 case 关键字开始,以 endcase 关键字结束。多个语句的块必须分组在开始和结束语句中。

流程图:

Untitled Diagram drawio (23)

语法:

        case(condition)
        condition_1: Statements ;
        condition_2: Statements ;
        ...........
        conditon_N: Statements;
        default   : Statements;
        endcase

没有条件为真的 case 语句

示例:

            x = 2'b11;
            case(x)
            00 : $display("Value of x = %0b", x);
            01 : $display("Value of x = %0b",x);
            10 : $display("Value of x = %0b",x);
            //11 : $display("Value of x = %0b" ,x);
            default : $display("Value of x is not found");
            endcase

在上面的示例中,这里的表达式=“x”应该匹配案例项之一,但这里没有条件为真。在此,“11”值被赋予 x,因此案例项“11”与表达式 =“x”不匹配。然后默认执行 get。如果没有一个条件为真,则执行默认语句。这将在输出中显示“找不到 x 的值”。

使用没有默认值的 Case 语句

在 case 语句中,使用 default 语句。 default语句是可选的,一个case语句中只能有一个default语句。

如果给定的 case 条件都不成立,则执行 default 语句中的语句。

如果没有任何项目与条件匹配并且未给出默认语句,则执行将退出 case 块而不执行任何操作。

流程图:

Untitled Diagram drawio (24)

语法:

            case(condition)  
            condition_1: Statements ;   
            condition_2: Statements ;  
            ...........  
            conditon_N: Statements;  
            endcase  

示例:

              x = 2'b01;  
              case(x)  
              00 : $display("Value of x = %0b", x);  
              01 : $display("Value of x = %0b",x);  
              10 : $display("Value of x = %0b",x);  
              11 : $display("Value of x = %0b" ,x);  
              endcase  

在上面的示例中,使用了 case 语句,而没有使用 default 语句。当所有条件都不成立时,将使用默认语句。在这一条件为真时,它将打印 x 的值为“1”

在此示例中,如果没有任何 case 条件为 true 或未给出默认语句,则执行将退出 case 块而不执行任何操作

在 case 语句中使用范围语句并结合使用 inside 语句:

在此,范围是使用 inside 语句在 case 语句中声明的。

如果我们想在 case 语句中给出范围值,这将在 inside 语句的帮助下完成。

语法:

           case(condition) inside
           condition_1_[a:b]: Statements ;
           condition_2:_[c:d] Statements ;
           ...........
           conditon_N_[y:z]: Statements;
           endcase

示例:

               case(x) inside
              [2:3] : $display("Value of x = %0d", x);
              [4:5] :$display("Value of x = %0d",x);
              [6:9] : $display("Value of x = %0d",x);
              [8:9]  : $display("Value of x = %0d" ,x);
              default : $display("Value of x is not found");
              endcase

在上面的示例中,我们使用 inside 语句在 case 语句中声明范围。在此,他们将通过使用内部语句从声明的范围中获取值。

在 case 语句中使用 Break 语句:

不允许在循环内使用 break 语句。在 case 语句中使用 break 时,会发生错误。

Syntax

            case(condition) inside
            condition_1: Statements ;
            condition_2: begin
                       Statements ;
                        break;
                        end
            ...........
            conditon_N: Statements;
            endcase

示例:

              case(x)
              00 : $display("Value of x = %0b", x);
              01 : begin
              $display("Value of x = %0b",x);
              break;
              end
              10 : $display("Value of x = %0b",x);
              11 : $display("Value of x = %0b" ,x);
              default : $display("Value of x is not find");
              endcase

在上面的例子中,我们在 case 语句中使用了一个break语句。这将引发错误,即 case 语句中不允许使用 break 语句。

使用 disable 关键字禁用任务内的嵌套循环

在任务后面使用disable关键字只会禁用任务和命名块。禁用语句会停止执行指定的一组语句。

示例:

            task nes();
            for (int i=1;i<=3;i++)
            begin
            for(int j=1;j<=3;j++)
            begin
            if(i==2)
            begin
            disable nes;
            end
            $display("\t i= %0d , j= %0d ",i,j);
            end
            end
            endtask
            endmodule:nested_loop

在上面的示例中,disable 关键字用于在特定迭代中禁用任务。在任务内部,我们声明了两个嵌套的“for”循环,其中我们使用 if 条件并使用禁用关键字从循环中移出。在任务内部,“if”条件已在迭代“2”处声明。在迭代“2”时,如果条件匹配,它将在禁用关键字的帮助下禁用该任务。

SystemVerilog 中的 case 语句有 3 个更新,它们是

  • unique case
  • unique0 case
  • priority case

2. unique case#

在 unique case 语句中,如果所有的 case 条件都为假,它将显示一个警告(没有找到匹配的 case 语句),但不会有错误。 如果所有的条件都为真或有多个条件为真,它将读取第一个正确或匹配的 case 条件,并显示输出,同时伴随一个警告,但不会有错误。

语法:

      unique case(condition)
      condition_1: Statements ;
      condition_2: Statements ;
      ............
      conditon_N: Statements;
      endcase

示例:

所有条件都为假

          x = 2'b01;
          unique case(x)
          00 : $display(" Value of x is = %0b", x);
          //01 : $display(" Value of x is = %0b", x);
          10 : $display(" Value of x is = %0b", x);
          11 : $display(" Value of x is = %0b", x);
          endcase

在上述示例中,使用了 unique case 语句。这里所有的条件都为假,这将打印输出,并伴随一个警告,但不会有错误。

有多个条件为真

在 unique case 语句中,如果所有的 case 条件都为假,它将显示一个警告(没有找到匹配的 case 语句),但不会有错误。 如果所有的条件都为真或有多个条件为真,它将读取第一个正确或匹配的 case 条件,并显示输出,同时伴随一个警告,但不会有错误。

流程图:

Untitled Diagram-Page-2 (1)

示例:

             x = 2'b00;
             unique case(x)
             00 : $display("Value of x is =%0b" , x);
             00 : $display("Value of x is =%0b" , x);
             01 : $display("Value of x is =%0b" , x);
             10  : $display("Value of x is =%0b" , x);
             11  :$display("Value of x is =%0b" , x);
             endcase

在上述示例中,使用了 unique case 语句。在 unique case 中,如果有多个条件为真,它将读取第一个正确或匹配的 case 条件,并显示输出,同时伴随一个警告,但不会有错误。 如果这两个条件为真,在执行时,它将采用第一个匹配的条件,并打印 x = ‘0’ 的值,同时伴随一个警告(没有错误)。

2.1 unique case 语句带 default 语句#

在这里,我们将在 unique case 语句中使用 default 语句。 如果 unique case 语句中的所有条件都不为真,那么将执行 default 语句。

流程图:

Untitled Diagram-Page-2 drawio (12)

语法:

           unique case(condition)
           condition_1: Statements ;
           condition_2: Statements ;
           ............
           conditon_N: Statements;
           default :   Statements;
           endcase 

示例:

            x = 2'b01;
            unique case(x)
            00 : $display("Value of x is =%0b" , x);
           // 01 : $display("Value of x is =%0b" , x);
            10 : $display("Value of x is =%0b" , x);
            11 : $display("Value of x is =%0b" , x);
            default  :$display("Value of x is =%0b" , x);
            endcase

在上述示例中,default 语句被用在了 unique case 语句内部。在这种情况下,如果 case 语句的所有条件都不为真,则会执行 default 语句。

3. uniuqe0 case#

在 uniuqe0 case 中,如果所有的 case 条件都为假,它将不会显示警告,也不会有错误。 如果所有的条件都为真或有多个条件为真,它将读取第一个正确或匹配的 case 条件,并显示输出,同时伴随一个警告,但不会有错误。

语法:

       unique0 case(condition)
       condition_1: Statements ;
       condition_2: Statements ;
       ...........
       conditon_N: Statements;
      endcase

示例:

            x = 2'b01;
            unique0 case(x)
            00 : $display(" Value of x is = %0b", x);
            01 : $display(" Value of x is = %0b", x);
            10 : $display(" Value of x is = %0b", x);
            11 : $display(" Value of x is = %0b", x);
            01 : $display(" Value of x is = %0b", x);
            endcase

在上述示例中,使用了 unique0 case。在这两个条件为真的情况下,unique0 将读取第一个正确或匹配的条件,并打印输出 x 的值为 “1”,伴随一个警告。

4. priority case#

在这种类型的 case 语句中,如果有多个 case 条件为真,它将在不提供任何错误或警告的情况下显示输出。

流程图:

Untitled Diagram-Page-2 (2)

语法:

             priority case(condition)
             condition_1: Statements ;
             condition_2: Statements ;
             ...........
             conditon_N: Statements;
             endcase

示例:

            pqr = 5;
            priority case (pqr)
            5 : $display ("Found to be 5");
            5 : $display ("Again found to be 5");
            7 : $display ("Found to be 7");
            endcase

在上述示例中,使用了 priority case。在这两个条件中,第一个是正确或匹配的条件,因此 priority case 将读取第一个正确的条件并执行它,并显示输出,而不会有警告和错误。



5. break#

break 语句用于立即终止循环。当在循环内部遇到 break 语句时,循环迭代立即停止。通常情况下,我们在使用 if 语句在代码中给出条件后使用 break。

我们可以在任何循环(for、foreach、forever、do-while、while、do-while)中使用 break 语句来终止循环的执行。它总是在循环内部使用。当遇到 break 语句时,它立即结束循环。

流程图:

Untitled Diagram-Page-1 drawio (5)

语法:

break;

示例:

            foreach(array[i])
            if(i==2)begin
            $display("----Calling break----");
            break;
            end

在上述示例中,一个 break 语句被用在循环内部,当条件为真时终止循环。在这里,break 被用在索引为 2 处,以便循环在索引 2 处停止并退出循环。


6. continue:#

continue 语句用于跳过循环的当前迭代。我们可以在任何类型的循环中使用 continue 语句,比如 for、while 和 do-while 循环。基本上,continue 语句用于在我们想要继续循环但不想执行循环中特定迭代的情况下使用。

使用 continue,我们可以跳过循环的当前迭代,并立即跳转到循环的下一迭代。

流程图:

Untitled Diagram-Page-1 drawio (6)

语法:

continue;

示例:

            foreach(array[i])
            begin
            if(i==2)begin
            $display("-----Calling Continue----");
            continue;
            end

在上述示例中,continue 语句被用在循环内部,用于跳过循环的当前迭代。在下面的循环中,continue 被用在索引为 2 的位置,以便循环跳过索引为 2 的特定迭代,并继续执行下一次迭代。