目录

  1. 多路分支语句概述
  2. Verilog 多路分支语句类型
    • ifelse ifelse 语句
    • case 语句
    • casezcasex 语句
  3. 多路分支语句应用实例
  4. 参考资料

多路分支语句概述

在 Verilog 中,多路分支语句允许基于不同的条件或表达式值执行多个不同的代码块。当有多个条件需要检查时,使用多路分支语句非常有效。Verilog 支持几种多路分支语句,包括 ifelse ifelse 语句和 case 语句。

  • ifelse ifelse:适用于多个条件的顺序判断。
  • case:适用于选择根据某个表达式值的多个分支。
  • casezcasex:是 case 的扩展,支持对未知(z)和高阻(x)值进行匹配。

这些语句都能够让你在硬件描述中实现更复杂的逻辑判断。


Verilog 多路分支语句类型

ifelse ifelse 语句

ifelse ifelse 语句允许基于多个条件来选择性执行不同的代码块。它是条件语句的扩展,适用于多个条件的判断。

语法:

if (condition1) begin
    // condition1 为真时执行的语句
end else if (condition2) begin
    // condition2 为真时执行的语句
end else if (condition3) begin
    // condition3 为真时执行的语句
end else begin
    // 如果没有条件满足,则执行这部分
end

  • 通过多个 else if 来检查不同的条件,确保只执行一个匹配的语句块。

示例:

module multi_condition_example(input [1:0] a, output reg [3:0] result);
    always @ (a) begin
        if (a == 2'b00) begin
            result = 4'b0001;
        end else if (a == 2'b01) begin
            result = 4'b0010;
        end else if (a == 2'b10) begin
            result = 4'b0100;
        end else begin
            result = 4'b1000;  // 默认情况
        end
    end
endmodule

在这个例子中,ifelse ifelse 语句根据 a 的不同值赋给 result 不同的值。这样可以通过多个条件判断来决定 result 的最终值。


case 语句

case 语句允许根据一个表达式的不同值来选择执行不同的语句块。它类似于其他编程语言中的 switch 语句,是一种有效的多路选择结构。

语法:

case (expression)
    value1: begin
        // 当 expression 等于 value1 时执行的语句
    end
    value2: begin
        // 当 expression 等于 value2 时执行的语句
    end
    default: begin
        // 如果没有值匹配,则执行默认语句
    end
endcase

  • expression 是要比较的信号或表达式。
  • value1, value2expression 可能的值,当 expression 的值与某个 value 匹配时,执行对应的语句块。
  • default 是可选的,它处理所有没有匹配的情况。

示例:

module case_example(input [1:0] state, output reg [2:0] light);
    always @ (state) begin
        case (state)
            2'b00: light = 3'b001; // Red
            2'b01: light = 3'b010; // Yellow
            2'b10: light = 3'b100; // Green
            default: light = 3'b001; // Default to Red
        endcase
    end
endmodule

这个例子展示了一个交通灯的控制逻辑。根据 state 的值,选择不同的灯光状态。case 语句使得代码更加清晰、易于维护。


casezcasex 语句

casezcasexcase 语句的扩展,允许在模式匹配时使用 zxz 代表高阻态,而 x 代表未知状态。

  • casez:在模式匹配时,zx 会被当作“通配符”,允许匹配任意值。
  • casex:除了 zxcasex 还将 x 视为一个通配符。

语法:

casez (expression)
    value1: begin
        // 匹配到 value1 时执行的语句
    end
    value2: begin
        // 匹配到 value2 时执行的语句
    end
    default: begin
        // 默认执行的语句
    end
endcase

// casex 用法类似,区别是 'x' 也可以作为通配符
casex (expression)
    value1: begin
        // 匹配到 value1 时执行的语句
    end
    default: begin
        // 默认执行的语句
    end
endcasex

示例:

module casez_example(input [3:0] a, output reg [1:0] result);
    always @ (a) begin
        casez (a)
            4'b1??? : result = 2'b01; // 以 1 开头的任意值
            4'b01?? : result = 2'b10; // 以 01 开头的任意值
            default: result = 2'b00;
        endcase
    end
endmodule

在这个例子中,casez 语句匹配了 a 的值,? 表示任何值的通配符,而 z 表示高阻态。


多路分支语句应用实例

1. 使用 ifelse if 进行条件判断

module multi_condition_example(input [2:0] a, output reg [3:0] result);
    always @ (a) begin
        if (a == 3'b000)
            result = 4'b0001;
        else if (a == 3'b001)
            result = 4'b0010;
        else if (a == 3'b010)
            result = 4'b0100;
        else
            result = 4'b1000; // 默认情况
    end
endmodule

2. 使用 case 语句选择不同的操作

module case_example(input [3:0] a, output reg [7:0] result);
    always @ (a) begin
        case (a)
            4'b0001: result = 8'b00000001;
            4'b0010: result = 8'b00000010;
            4'b0100: result = 8'b00000100;
            4'b1000: result = 8'b00001000;
            default: result = 8'b00000000; // 默认操作
        endcase
    end
endmodule

3. 使用 casez 匹配不确定的输入

module casez_example(input [3:0] a, output reg [1:0] result);
    always @ (a) begin
        casez (a)
            4'b1???: result = 2'b01;  // 以 1 开头的值
            4'b01??: result = 2'b10;  // 以 01 开头的值
            default: result = 2'b00;
        endcase
    end
endmodule

在这个例子中,casez 语句可以有效地匹配包含 ?z 的模式,从而简化了多路分支的判断。


参考资料