在 Verilog 中为不同情况命名的最佳方式是什么?

What is the best way to give name to different cases in Verilog?

我想知道是否有人可以告诉我在 Verilog 中为不同状态命名的最佳方式是什么?例如代替下面的案例

case (a)
  1'b0 : statement1;
  1'b1 : statement2;
  1'bx : statement3;
  1'bz : statement4;
endcase

最好有一段这样格式的代码

case (a)
  Load : statement1;
  Store : statement2;
  Check : statement3;
  Reset : statement4;
endcase

logic 类型的 enum 可以帮助您。例如状态机的IDLE,BUSY等状态变量,只能定义所有的状态,用状态名显示,即enums.

枚举可以定义如下:

enum logic {Load,Store,Check,Reset} a;

您可以显式为枚举赋值,如下所示:

enum logic {Load='0,Store='1,Check='x,Reset='z} a;

此外,您还有 内置方法,例如 firstlastname 等,可以对 [=13] 执行操作=]s.

这是我要解释的确切代码:

module top();
  enum logic {Load='0,Store='1,Check='x,Reset='z} a;
  initial
    begin
      case (a)
        Load : $display("1");
        Store :  $display("2");
        Check :  $display("3");
        Reset :  $display("4");
      endcase
    end 
endmodule

有关详细信息,请参阅 Enumerations link。

如果不想使用枚举,那么 localparams 也是为您的状态使用助记符的好方法。

localparam LOAD  = 1'b0;
localparam STORE = 1'b1;
localparam CHECK = 1'bx;
localparam RESET = 1'bz;

always @* begin
  case (a)
    LOAD : statement1;
    STORE : statement2;
    CHECK : statement3;
    RESET : statement4;
  endcase
end

大多数语言使用大写来表示常量,在 Verilog 中使用局部参数和参数也是一种很好的做法。