はじめに
DSimのおかげで、無料で手軽にUVMを試せるようになったじゃないですか。
じゃあさ、実際にちょっと手を動かして、UVMを使ってなんかしてみたいじゃないですか。
いつやるの?いまでしょ!
この記事を書くときに、主に参考にしたもの1
DUT
このシリーズにおける主役、DUT2のFlip-Flopくんです。今日はこの子をこねくり回すような簡単なテストを書いてみようと思います3。
`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。
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の実行スクリプト
// DSim
-top top
+acc
-waves waves.vcd
// DUT
DFF.v
// Test bench
top.sv
@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。
波形を見ると、
- リセット
RSTN = 0
時、DFFの出力がQ = 0
なので、期待通り。 - リセット解除
RSTN = 1
後、- DFFの入力が
D = 1
で、CLKの立ち上がり後にFFの出力がQ = 1
なので、期待通り。 - DFFの入力が
D = 0
で、CLKの立ち上がり後にFFの出力がQ = 0
なので、期待通り。
- DFFの入力が
すべて期待通りの出力なので……PASS!
ヨシッ、異常なし!エクセルにチェックつけて、テープアウトだ!8
おわりに
次回から、ちょっとずつ真面目にUVMっぽいことをしていきます、乞うご期待。
-
お察しのとおり、この記事はタイトルからして、vega77さんの「UVMのお気軽導入」にもろに影響を受けています。パパパパパクリじゃないよ、リスペクトですよ! ↩
-
DUT = Device Under Testの略です。DUV(Device Under Verification)と呼ぶ人たちもいます……が、まあどっちでもいいです。ようするに、テストや検証の対象物のこと。「でぃーゆーてぃー」と言ったり、「だっと」と言ったり、発音もいろいろ。 ↩
-
世間一般のまじめな解説では、最低でも加算器やALU、あるいは単純なメモリくらいの複雑さのブロックがDUTだったりするわけですが、ここではFlip-Flopが選ばれました。なぜかって? だって、むずかしいのわかんないんだもん。 ↩
-
UVMは動詞じゃないよ。「UVMする」なんて日本語もないよ。よい子はこんな言い回しをマネしないでね。きっとこわいお兄さんたち(デジタル設計者や検証エンジニア)が集まってきて袋叩k【このメッセージは不適切な表現が含まれると判断されたため削除されました】 ↩
-
あのぉ……この記事、「お手軽UVM」って題名でほんとうに合ってます? まさかタイトル詐欺……じゃないですよね? ↩
-
我々が普段お世話になっている半導体は、このように職人たちの心のこもった「手仕事」によって支えられているのです。(そんなバカな……っておもうでしょ? でも、半分冗談/半分本当らしいですよ。知らんけど) ↩
-
そして実機評価で見つかる大量のバグ。何を見てヨシ!って言ったんですか? ↩