UVMに入門したくて、簡単な例を用いて試してみることにした。以下のようなシンプルなデザインをテストしたい。
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 // adder
つまり、入力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回動いているから大丈夫なのかしら。
これから、このデザインを読み解いていこうと思う。