UVMに入門したくて、簡単な例を用いて試してみることにした。以下のようなシンプルなデザインをテストしたい。
vlsiverify.com
module adder
(input logic clk,
input logic reset,
input logic [ 7: 0] in1,
input logic [ 7: 0] in2,
output logic [ 8: 0] out
);
always@(posedge clk, posedge reset) begin
if (reset)
out <= 'h0;
else
out <= in1 + in2;
end
endmodule
つまり、入力in1
とin2
に対して、出力out
が正しく出力されていることを確認したいというわけだ。1サイクル後に結果が出力される。
上記のリファレンスによると、UVMで以下のような構成を想定するらしい。
必要な環境は:
TB_top
: テストベンチ全体を含む。テスト環境とインタフェース・DUTをすべて含む
Test
:テスト環境を含む。エージェントとスコアボードを含む
Agent
:テストを駆動する側。シーケンサ・ドライバ・モニタを含む
Sequencer
: おそらくはテストシーケンスを生成する側。
Driver
:シーケンスを元にインタフェースをドライブする。
Monitor
:インタフェースを通じて結果を取得する。
Scoreboard
:結果を想定する値と比較する。
.
├── design
│ └── adder.sv
├── verify
│ ├── add_if.sv
│ ├── agent.sv
│ ├── base_seq.sv
│ ├── base_test.sv
│ ├── driver.sv
│ ├── env.sv
│ ├── monitor.sv
│ ├── scoreboard.sv
│ ├── seq_item.sv
│ ├── seqcr.sv
│ └── tb_top.sv
└── xsim
├── Makefile
└── filelist.vf
まずは、Vivado Simulatorを用いてUVMのシミュレーションを行う。
.PHONY: all
all: build run
.PHONY: build
build:
xvlog -sv $(SRCS) -L uvm --include ../verify
xelab $(TOP_MODULE) -L uvm -timescale 1ns/1ps
.PHONY: run
run:
xsim $(TOP_MODULE) -R --testplusarg "UVM_TESTNAME=base_test" -testplusarg "UVM_VERBOSITY=UVM_LOW"
UVM_INFO /tools/Xilinx/Vivado/2023.2/data/system_verilog/uvm_1.2/xlnx_uvm_package.sv(18648) @ 0: reporter [NO_DPI_TSTNAME] UVM_NO_DPI defined--getting UVM_TESTNAME directly, without DPI
UVM_INFO @ 0: reporter [RNTST] Running test base_test...
UVM_INFO /tools/Xilinx/Vivado/2023.2/data/system_verilog/uvm_1.2/xlnx_uvm_package.sv(20867) @ 0: reporter [UVM/COMP/NAMECHECK] This implementation of the component name checks requires DPI to be enabled
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/base_seq.sv(10) @ 5000: uvm_test_top.env_o.agt.seqr@@bseq [base_seq] Base seq: Inside Body
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/driver.sv(22) @ 5000: uvm_test_top.env_o.agt.drv [driver] ip1 = 34, ip2 = 44
----------------------------------------------------------------------------------------------------------
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/scoreboard.sv(29) @ 10000: uvm_test_top.env_o.sb [scoreboard] Matched: ip1 = 34, ip2 = 44, out = 78
----------------------------------------------------------------------------------------------------------
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/base_seq.sv(10) @ 10000: uvm_test_top.env_o.agt.seqr@@bseq [base_seq] Base seq: Inside Body
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/driver.sv(22) @ 10000: uvm_test_top.env_o.agt.drv [driver] ip1 = 31, ip2 = 31
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/base_seq.sv(10) @ 15000: uvm_test_top.env_o.agt.seqr@@bseq [base_seq] Base seq: Inside Body
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/driver.sv(22) @ 15000: uvm_test_top.env_o.agt.drv [driver] ip1 = 50, ip2 = 59
----------------------------------------------------------------------------------------------------------
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/scoreboard.sv(29) @ 18000: uvm_test_top.env_o.sb [scoreboard] Matched: ip1 = 31, ip2 = 31, out = 62
----------------------------------------------------------------------------------------------------------
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/base_seq.sv(10) @ 20000: uvm_test_top.env_o.agt.seqr@@bseq [base_seq] Base seq: Inside Body
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/driver.sv(22) @ 20000: uvm_test_top.env_o.agt.drv [driver] ip1 = 9, ip2 = 14
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/base_seq.sv(10) @ 25000: uvm_test_top.env_o.agt.seqr@@bseq [base_seq] Base seq: Inside Body
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/driver.sv(22) @ 25000: uvm_test_top.env_o.agt.drv [driver] ip1 = 44, ip2 = 87
----------------------------------------------------------------------------------------------------------
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/scoreboard.sv(29) @ 26000: uvm_test_top.env_o.sb [scoreboard] Matched: ip1 = 9, ip2 = 14, out = 23
----------------------------------------------------------------------------------------------------------
...
----------------------------------------------------------------------------------------------------------
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/scoreboard.sv(29) @ 50000: uvm_test_top.env_o.sb [scoreboard] Matched: ip1 = 9, ip2 = 74, out = 83
----------------------------------------------------------------------------------------------------------
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/base_seq.sv(10) @ 50000: uvm_test_top.env_o.agt.seqr@@bseq [base_seq] Base seq: Inside Body
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/driver.sv(22) @ 50000: uvm_test_top.env_o.agt.drv [driver] ip1 = 53, ip2 = 9
UVM_INFO /home/kimura/work/sv/uvm_adder/verify/base_test.sv(24) @ 50000: uvm_test_top [base_test] End of testcase
UVM_INFO /tools/Xilinx/Vivado/2023.2/data/system_verilog/uvm_1.2/xlnx_uvm_package.sv(19968) @ 50000: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
UVM_INFO /tools/Xilinx/Vivado/2023.2/data/system_verilog/uvm_1.2/xlnx_uvm_package.sv(13673) @ 50000: reporter [UVM/REPORT/SERVER]
--- UVM Report Summary ---
** Report counts by severity
UVM_INFO : 32
UVM_WARNING : 0
UVM_ERROR : 0
UVM_FATAL : 0
** Report counts by id
[NO_DPI_TSTNAME] 1
[RNTST] 1
[TEST_DONE] 1
[UVM/COMP/NAMECHECK] 1
[UVM/RELNOTES] 1
[base_seq] 10
[base_test] 1
[driver] 10
[scoreboard] 6
$finish called at time : 50 ns : File "/tools/Xilinx/Vivado/2023.2/data/system_verilog/uvm_1.2/xlnx_uvm_package.sv" Line 18699
exit
INFO: [Common 17-206] Exiting xsim at Thu Mar 14 09:01:44 2024...
これ、良く分からんけど6個しかテスト動いて無くない?でも、base_seq
とdriver
が10回動いているから大丈夫なのかしら。
これから、このデザインを読み解いていこうと思う。