SystemVerilog 2012 : unique constraint

Bringing in uniqueness constraint to SystemVerilog ? welcome P1800-2012 より、SystemVerilog 2012では constraintにも uniqueが設定出来るようになるみたいです。

これは便利かも!

unique とは?

case文を記述例としてあげています。
unique/priorityについては後日書きます。

  • サンプルコード
module testbench;

  logic [2:0] data;

  initial begin
    for(int i=0; i<8; i++) begin
      #10 data = i;
    end
    #10;
    $finish(1);
  end

  always_comb begin
    unique case(data)
      0   : $display("data = 0");
      1   : $display("data = 1");
      2   : $display("data = 2");
      3   : $display("data = 3");
      3,4 : $display("data = 3 or 4"); // ①値 3が重複
      5   : $display("data = 5");
      6   : $display("data = 6");
      7   : $display("data = 7");
      // default: $display("none"); // ②全条件が記載されていない。
    endcase
  end

endmodule: testbench
  • 実行結果
# vsim -L work -do {run -all; quit} -c testbench 
# Loading sv_std.std
# Loading work.testbench
# run -all 
# ** Warning: (vsim-8315) sample.sv(14): No condition is true in the unique/priority if/case statement.
# data = 0
# data = 1
# data = 2
# ** Warning: (vsim-8360) sample.sv(14): The if/case statement is not unique.
# data = 3
# data = 3 or 4
# data = 5
# data = 6
# data = 7
# ** Note: $finish    : sample.sv(10)

このように、

① 条件が重複していないこと
② すべての条件が記述されている

をチェックしてくれます。