1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flip-Flopでお手軽UVM(できなかった)

Last updated at Posted at 2024-12-29

はじめに

DSimのおかげで、無料で手軽にUVMを試せるようになったじゃないですか。
じゃあさ、実際にちょっと手を動かして、UVMを使ってなんかしてみたいじゃないですか。
いつやるの?いまでしょ!

この記事を書くときに、主に参考にしたもの1

DUT

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

Screenshot 2024-12-29 203032.png

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

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

Screenshot 2024-12-29 212237.png

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
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の判定は人力、つまり、目視確認が必要です7

Screenshot 2024-12-30 081412.png

波形を見ると、

  • リセットRSTN = 0時、DFFの出力がQ = 0なので、期待通り。
  • リセット解除RSTN = 1後、
    • DFFの入力がD = 1で、CLKの立ち上がり後にFFの出力がQ = 1なので、期待通り。
    • DFFの入力がD = 0で、CLKの立ち上がり後にFFの出力がQ = 0なので、期待通り。

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

おわりに

次回から、ちょっとずつ真面目にUVMっぽいことをしていきます、乞うご期待。

Screenshot 2024-12-29 222948.png
のんのんびより

  1. お察しのとおり、この記事はタイトルからして、vega77さんの「UVMのお気軽導入」にもろに影響を受けています。パパパパパクリじゃないよ、リスペクトですよ!

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

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

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

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

  6. わふぅー、このテストベンチ、まるで実家のような安心感をおぼえるですぅ

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

  8. そして実機評価で見つかる大量のバグ。何を見てヨシ!って言ったんですか?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?