FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Vivado Simulatorを用いてUVMに入門する (1. adderを用いたシンプルな例)

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 // adder

つまり、入力in1in2に対して、出力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_seqdriverが10回動いているから大丈夫なのかしら。 これから、このデザインを読み解いていこうと思う。