もう何回目になるのかわからないが、そろそろUVMを覚えなければならないのでVivado Simulatorを使ってUVMに入門してみよう。
前回作ったテストが、Vivado 2023.2 だと、なんとなく動かなかったので、DSimでも試行している。
参考にしているのは例によって以下のウェブサイトだ:
UVMによりいくつかのテストシーケンスを用意する、という話だ。sample_testとsample_test2というテストを用意している。
sample_test.sv
class sample_test extends uvm_test; `uvm_component_utils(sample_test) /* ... 途中省略 ... */ function void build_phase(uvm_phase phase); super.build_phase(phase); uvm_config_db #(uvm_object_wrapper)::set(this, "env.master.sequencer.run_phase", "default_sequence", write_read_seq::type_id::get()); uvm_config_db #(uvm_object_wrapper)::set(this, "env.slave.sequencer.run_phase", "default_sequence", normal_response_seq::type_id::get()); env = sample_env::type_id::create("env", this); endfunction // build_phase class sample_test2 extends uvm_test; `uvm_component_utils(sample_test2) /* ... 途中省略 ... */ function void build_phase(uvm_phase phase); super.build_phase(phase); uvm_config_db #(uvm_object_wrapper)::set(this, "env.master.sequencer.run_phase", "default_sequence", write_read_seq::type_id::get()); uvm_config_db #(uvm_object_wrapper)::set(this, "env.slave.sequencer.run_phase", "default_sequence", random_response_seq::type_id::get()); env = sample_env::type_id::create("env", this); endfunction // build_phase
sample_testとsample_test2の違いは、受け取り側のタスクがnormal_response_seqかrandom_response_seqのどちらかである、ということだ。
model/sample_slave_seq_lib.sv
class random_response_seq extends sample_slave_base_seq; `uvm_object_utils(random_response_seq) function new (string name="random_response_seq"); super.new(name); endfunction // new virtual task body(); forever begin `uvm_create (req); req.wait_cycle <= $urandom_range(8, 0); `uvm_send(req) end endtask // body endclass // random_response_seq
sample_test2では、レスポンスのためのreadyの立ち上がりのタイミングがランダムになる。
UVM_INFO @ 1000: uvm_test_top.env.slave.driver [SLAVE] write access accept. addr=10h, data=5ah UVM_INFO @ 1000: uvm_test_top.env.master.monitor [MON] write addr=10h wdata=5ah UVM_INFO @ 1000: uvm_test_top.env.master.driver [DRIVER] Hi UVM_INFO @ 2000: uvm_test_top.env.slave.driver [SLAVE] read access accept. adr=10h UVM_INFO @ 2000: uvm_test_top.env.slave.driver [SLAVE] read data is = 5ah UVM_INFO @ 2000: uvm_test_top.env.master.monitor [MON] read addr=10h rdata=5ah UVM_INFO @ 2000: uvm_test_top.env.master.driver [DRIVER] Hi
