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