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


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

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

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

乗算器の検証の続き。

msyksphinz.hatenablog.com

デザインの修正

デザインを修正した。修正後のコードは以下の通りである。

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
  if (b[0]) begin
    tmp_m[0] = a;
  end else begin
    tmp_m[0] = 'h0;
  end

  for (int i = 1; i < 8; i++) begin
    if (b[i]) begin
      tmp_m[i] = tmp_m[i-1] + (a << i);
    end else begin
      tmp_m[i] = tmp_m[i-1];
    end
  end
end
assign m = tmp_m[7];

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

endmodule // mult

主な修正点は以下の通りである:

  1. 最初のビット(b[0])の処理を特別扱い
  2. シフト演算(a << i)の追加
  3. 配列のインデックスを修正(tmp_m[7]を最終出力として使用)

修正後の検証結果

修正後のデザインで再度検証を実施した。結果は以下の通りである。

... 途中省略 ...
SBY 16:06:27 [mult_bmc] engine_0: ##   0:02:54  Checking assertions in step 18..
SBY 16:06:38 [mult_bmc] engine_0: ##   0:03:05  Checking assumptions in step 19..
SBY 16:06:38 [mult_bmc] engine_0: ##   0:03:05  Checking assertions in step 19..
SBY 16:06:49 [mult_bmc] engine_0: ##   0:03:16  Checking assumptions in step 20..
SBY 16:06:49 [mult_bmc] engine_0: ##   0:03:16  Checking assertions in step 20..
SBY 16:06:59 [mult_bmc] engine_0: ##   0:03:26  Checking assumptions in step 21..
SBY 16:06:59 [mult_bmc] engine_0: ##   0:03:26  Checking assertions in step 21..
SBY 16:07:08 [mult_bmc] engine_0: ##   0:03:36  Checking assumptions in step 22..
SBY 16:07:08 [mult_bmc] engine_0: ##   0:03:36  Checking assertions in step 22..
SBY 16:07:19 [mult_bmc] engine_0: ##   0:03:46  Checking assumptions in step 23..
SBY 16:07:19 [mult_bmc] engine_0: ##   0:03:46  Checking assertions in step 23..
SBY 16:07:29 [mult_bmc] engine_0: ##   0:03:56  Checking assumptions in step 24..
SBY 16:07:29 [mult_bmc] engine_0: ##   0:03:56  Checking assertions in step 24..
SBY 16:07:39 [mult_bmc] engine_0: ##   0:04:06  Checking assumptions in step 25..
SBY 16:07:39 [mult_bmc] engine_0: ##   0:04:06  Checking assertions in step 25..
SBY 16:07:48 [mult_bmc] engine_0: ##   0:04:15  Checking assumptions in step 26..
SBY 16:07:48 [mult_bmc] engine_0: ##   0:04:15  Checking assertions in step 26..
SBY 16:07:56 [mult_bmc] engine_0: ##   0:04:23  Checking assumptions in step 27..
SBY 16:07:56 [mult_bmc] engine_0: ##   0:04:23  Checking assertions in step 27..
SBY 16:08:07 [mult_bmc] engine_0: ##   0:04:34  Checking assumptions in step 28..
SBY 16:08:07 [mult_bmc] engine_0: ##   0:04:34  Checking assertions in step 28..
SBY 16:08:17 [mult_bmc] engine_0: ##   0:04:44  Checking assumptions in step 29..
SBY 16:08:17 [mult_bmc] engine_0: ##   0:04:44  Checking assertions in step 29..
SBY 16:08:27 [mult_bmc] engine_0: ##   0:04:54  Checking assumptions in step 30..
SBY 16:08:27 [mult_bmc] engine_0: ##   0:04:54  Checking assertions in step 30..
SBY 16:08:36 [mult_bmc] engine_0: ##   0:05:03  Checking assumptions in step 31..
SBY 16:08:36 [mult_bmc] engine_0: ##   0:05:03  Checking assertions in step 31..
SBY 16:08:45 [mult_bmc] engine_0: ##   0:05:13  Checking assumptions in step 32..
SBY 16:08:46 [mult_bmc] engine_0: ##   0:05:13  Checking assertions in step 32..
SBY 16:08:54 [mult_bmc] engine_0: ##   0:05:22  Checking assumptions in step 33..
SBY 16:08:54 [mult_bmc] engine_0: ##   0:05:22  Checking assertions in step 33..
SBY 16:09:03 [mult_bmc] engine_0: ##   0:05:31  Checking assumptions in step 34..
SBY 16:09:03 [mult_bmc] engine_0: ##   0:05:31  Checking assertions in step 34..
SBY 16:09:13 [mult_bmc] engine_0: ##   0:05:40  Checking assumptions in step 35..
SBY 16:09:13 [mult_bmc] engine_0: ##   0:05:40  Checking assertions in step 35..
SBY 16:09:23 [mult_bmc] engine_0: ##   0:05:50  Checking assumptions in step 36..
SBY 16:09:23 [mult_bmc] engine_0: ##   0:05:50  Checking assertions in step 36..
SBY 16:09:35 [mult_bmc] engine_0: ##   0:06:02  Checking assumptions in step 37..
SBY 16:09:35 [mult_bmc] engine_0: ##   0:06:02  Checking assertions in step 37..
SBY 16:09:45 [mult_bmc] engine_0: ##   0:06:12  Checking assumptions in step 38..
SBY 16:09:45 [mult_bmc] engine_0: ##   0:06:12  Checking assertions in step 38..
SBY 16:09:56 [mult_bmc] engine_0: ##   0:06:23  Checking assumptions in step 39..
SBY 16:09:56 [mult_bmc] engine_0: ##   0:06:23  Checking assertions in step 39..
SBY 16:10:07 [mult_bmc] engine_0: ##   0:06:34  Status: passed
SBY 16:10:07 [mult_bmc] engine_0: finished (returncode=0)
SBY 16:10:07 [mult_bmc] engine_0: Status returned by engine: pass
SBY 16:10:07 [mult_bmc] summary: Elapsed clock time [H:MM:SS (secs)]: 0:06:34 (394)
SBY 16:10:07 [mult_bmc] summary: Elapsed process time [H:MM:SS (secs)]: 0:06:34 (394)
SBY 16:10:07 [mult_bmc] summary: engine_0 (smtbmc z3) returned pass
SBY 16:10:07 [mult_bmc] summary: engine_0 did not produce any traces
SBY 16:10:07 [mult_bmc] DONE (PASS, rc=0)

うまくいったようだ。




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

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