以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/05/31/040000より取得しました。


オープンソース形式検証ツールSymbiYosysを用いて形式検証に入門する (5. 乗算器の検証)

カテゴリインデックス:https://msyksphinz.hatenablog.com/entry/2024/12/14/040000

SymbiYosysを使った乗算器の形式検証

SymbiYosysを使用して乗算器の形式検証を行ってみる。

検証対象の乗算器

検証対象の乗算器は以下のようなVerilogコードで記述されている。8ビットの入力a, bを受け取り、16ビットの出力mを生成する単純な乗算器である。

module mult
  (
   input logic [ 7: 0]  a,
   input logic [ 7: 0]  b,
   output logic [15: 0] m
   );

logic [15: 0]           tmp_m[9];

always_comb begin
  tmp_m[0] = 'h0;
  for (int i = 0; i < 8; i++) begin
    if (b[i]) begin
      tmp_m[i+1] = tmp_m[i] + a;
    end else begin
      tmp_m[i+1] = tmp_m[i];
    end
  end
end
assign m = tmp_m[8];

`ifdef FORMAL
always_comb begin
  assert (m == a * b);
end
`endif // FORMAL

endmodule // mult

この乗算器は、シフト加算アルゴリズムを使用して実装されている。入力bの各ビットを順番にチェックし、ビットが1の場合に入力aを加算する方式である。

見ればわかるが、この乗算器は普通に実装が間違っており、正しい結果が得られない(普通にミスした)。

形式検証の設定

形式検証は以下の設定で実行した:

[options]
mode bmc
depth 40

[engines]
smtbmc z3

[script]
read -sv -formal mult.v
prep -top mult

[files]
mult.v
  • BMC(Bounded Model Checking)モードを使用
  • 検証深度は40
  • SMTソルバーとしてZ3を使用

検証結果

検証を実行したところ、以下のような結果が得られた:

SBY 15:47:03 [mult_bmc] engine_0: ##   0:00:00  BMC failed!
SBY 15:47:03 [mult_bmc] engine_0: ##   0:00:00  Assert failed in mult: mult.v:24.3-24.22 (_witness_.check_assert_mult_v_24_14)

検証は失敗し、アサーション違反が検出された。当たり前だ。 波形を取得して、表示してみた。このように、不具合が起きている波形を取得して確認することができる。




以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/05/31/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14