SystemVerilog:unique, priority

SystemVerilog 2012:unique constraint でも紹介しましたが、SystemVerilogでは if/caseに対して以下の制約が追加されています。

  • unique
  • unique0
  • priority

これらの予約語を使いことにおいて、シミュレータに検知されることができます。

  • 共通条件
    すべての条件が記述されている

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
    priority casez(data)
      3'b00? : $display("data 0 or 1");
      3'b0?? : $display("data 2 or 3");
      3'b1?? : $display("data 4 to 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 
# none
# data 0 or 1
# data 0 or 1
# data 2 or 3
# data 2 or 3
# data 4 to 7
# data 4 to 7
# data 4 to 7
# data 4 to 7
# ** Note: $finish    : sample.sv(10)

unique0

unique0 に関しては、ModelSim-ASEでは未サポートのため、
動作を確認が出来なかった。(一部の市販ツールも。。。)

規格では、こんな感じです。

bit [2:0] a;
unique case(a) // values 3,5,6,7 cause a violation report
       0,1: $display("0 or 1");
       2: $display("2");
       4: $display("4");
endcase

priority casez(a) // values 4,5,6,7 cause a violation report
       3’b00?: $display("0 or 1");
       3’b0??: $display("2 or 3");
endcase

unique0 case(a) // values 3,5,6,7 do not cause a violation report
       0,1: $display("0 or 1");
       2: $display("2");
       4: $display("4");
endcase