Flip-Flopでお手軽UVM（できなかった）

## はじめに

[DSim](https://qiita.com/ds54e/items/67fb480ba5c1b55664e2)のおかげで、無料で手軽にUVMを試せるようになったじゃないですか。
じゃあさ、実際にちょっと手を動かして、UVMを使ってなんかしてみたいじゃないですか。
いつやるの？いまでしょ！

この記事を書くときに、主に参考にしたもの[^okigaru]
  - [vega77 -  UVMのお気軽導入](https://qiita.com/vega77/items/0393ba588de26bc805ae)
  - [JoseIuri - Simple UVM](https://github.com/JoseIuri/Simple_UVM)
  - [nelsoncsc - easyUVM](https://github.com/nelsoncsc/easyUVM)

[^okigaru]: お察しのとおり、この記事はタイトルからして、[vega77](https://qiita.com/vega77)さんの「[UVMのお気軽導入](https://qiita.com/vega77/items/0393ba588de26bc805ae)」にもろに影響を受けています。パパパパパクリじゃないよ、リスペクトですよ！

## DUT

このシリーズにおける主役、DUT[^dut]のFlip-Flopくんです。今日はこの子をこねくり回すような簡単なテストを書いてみようと思います[^yoro]。

[^dut]: DUT = Device Under Testの略です。DUV（Device Under Verification）と呼ぶ人たちもいます……が、まあどっちでもいいです。ようするに、テストや検証の対象物のこと。「でぃーゆーてぃー」と言ったり、「だっと」と言ったり、発音もいろいろ。

[^yoro]: 世間一般のまじめな解説では、最低でも加算器やALU、あるいは単純なメモリくらいの複雑さのブロックがDUTだったりするわけですが、ここではFlip-Flopが選ばれました。なぜかって？ だって、むずかしいのわかんないんだもん。

![Screenshot 2024-12-29 203032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863735/3d44c57e-e947-e89c-d67c-9b39182b22ad.png)

```verilog:DFF.v
`timescale 1ns/1ps

module DFF (
  input wire D,
  input wire CLK,
  input wire RSTN,
  output reg Q
);

  always @(posedge CLK, negedge RSTN) begin
    if (!RSTN) begin
      Q <= 1'b0;
    end else begin
      Q <= D;
    end
  end

endmodule
```

## テストベンチ

いきなり、がっつりとUVMする[^do_uvm]のはちょっとハードルが高いですよね。<font color="DarkGray">~~そもそもUVMなんて本当に必要なんですか？ みんなこれが常識、みたいに言うけど、何か巨大な悪の組織によってゴリ押しされているだけの、ただの産業廃棄物なんじゃないですか？ 私たちの目的は、あくまでも検証ですよね？ それに何を使うか、どんな方法で取り組むかは自由ですよね？ だってほら、こんな原始的なテストベンチと波形の目視確認だって十分に仕（略）だから私は今はまだUVMを導入する必要はないと思うんですよね。大体そんな時間どこにもな~~</font>

ってことで、とりあえず今回は、従来型のモジュールベースのテストベンチを用意しました[^module]。トップにDUTを置いて、そこに適当な変数をつなぎ、トップの`initial begin-end`内でその変数を操作してDUTを動かす、ごくごく普通のテストベンチです[^home]。

[^do_uvm]: UVMは動詞じゃないよ。「UVMする」なんて日本語もないよ。よい子はこんな言い回しをマネしないでね。きっとこわいお兄さんたち（デジタル設計者や検証エンジニア）が集まってきて袋叩ｋ【このメッセージは不適切な表現が含まれると判断されたため削除されました】

[^module]: あのぉ……この記事、「お手軽UVM」って題名でほんとうに合ってます？ まさかタイトル詐欺……じゃないですよね？

[^home]: [わふぅー](https://dic.nicovideo.jp/a/%E8%83%BD%E7%BE%8E%E3%82%AF%E3%83%89%E3%83%AA%E3%83%A3%E3%83%95%E3%82%AB)、このテストベンチ、まるで実家のような安心感をおぼえるですぅ

![Screenshot 2024-12-29 212237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863735/270f0ca8-6954-00cb-44a3-7e890008286d.png)


```verilog:top.sv
module top;
  timeunit 1ns;
  timeprecision 1ps;

  parameter realtime clk_period = 1ns;
  bit clk = 1'b0;

  initial begin
    forever begin
      #(0.5*clk_period);
      clk = ~clk;
    end
  end

  logic d;
  logic rstn;
  logic q;

  DFF dut (
    .D(d),
    .CLK(clk),
    .RSTN(rstn),
    .Q(q)
  );

  parameter realtime output_skew = 0.2ns;

  initial begin
    $display("Started");

    @(posedge clk);
    #(output_skew);
    d <= 1'b0;
    rstn <= 1'b0;
    $display("RSTN = 0");

    @(posedge clk);
    #(output_skew);
    rstn <= 1'b1;
    $display("RSTN = 1");

    @(posedge clk);
    #(output_skew);
    d <= 1'b1;
    $display("D = 1");

    @(posedge clk);
    #(output_skew);
    d <= 1'b0;
    $display("D = 0");

    repeat (2) begin
      @(posedge clk);
    end
    $display("Finished");
    $finish();
  end
  
endmodule
```

## DSimの実行スクリプト
```options.txt
// DSim
-top top
+acc
-waves waves.vcd

// DUT
DFF.v

// Test bench
top.sv
```

```winbatch:run.bat
@echo off
set "DSIM_LICENSE=%USERPROFILE%\AppData\Local\metrics-ca\dsim-license.json"
cd "%USERPROFILE%\AppData\Local\metrics-ca\dsim\20240923.7.0"
call shell_activate.bat
cd %~dp0
dsim -f options.txt
pause
exit
```

## シミュレーション結果

テストを実行すると、こんなかんじの結果が得られます。出力を自動で確認してくれるチェッカー的なものを何も実装していないので、結果のPASS/FAILの判定は人力、つまり、目視確認が必要です[^man]。

![Screenshot 2024-12-30 081412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863735/b4118235-5640-0c64-a174-2f66b98db18a.png)

[^man]: 我々が普段お世話になっている半導体は、このように職人たちの心のこもった「手仕事」によって支えられているのです。（そんなバカな……っておもうでしょ？ でも、半分冗談/半分本当らしいですよ。知らんけど）

波形を見ると、
- リセット`RSTN = 0`時、DFFの出力が`Q = 0`なので、期待通り。
- リセット解除`RSTN = 1`後、
  - DFFの入力が`D = 1`で、CLKの立ち上がり後にFFの出力が`Q = 1`なので、期待通り。
  - DFFの入力が`D = 0`で、CLKの立ち上がり後にFFの出力が`Q = 0`なので、期待通り。

すべて期待通りの出力なので……PASS！
ヨシッ、異常なし！エクセルにチェックつけて、テープアウトだ！[^tapeout]

[^tapeout]: そして実機評価で見つかる大量のバグ。[何を見てヨシ！って言ったんですか？](https://x.com/karaage_rutsubo/status/1188797606555570179/photo/1)

## おわりに

[次回から](https://qiita.com/ds54e/items/82ed3068505a17064f05)、ちょっとずつ真面目にUVMっぽいことをしていきます、乞うご期待。

![Screenshot 2024-12-29 222948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863735/fc9c648d-8496-1ef4-5a99-6742edfc9ddf.png)
[のんのんびより](https://www.tv-tokyo.co.jp/anime/nonnon/index2.html)