はじめに
UVMを久しぶりに書くと、Driver, Sequencerの書き方を忘れます。
なので、Defineマクロを使って簡単に作成できるようにしましょう。
マクロを作成する
Sequencer
uvm_sequnecerを継承したSequncerを作成するマクロです。
sequncer_def.svh
`define SEQUENCER(sequencer) \
class sequencer extends uvm_sequencer; \
`uvm_component_utils(sequencer) \
function new(string name=`"sequencer`", uvm_component parent); \
super.new(name, parent); \
endfunction \
endclass
Driver
uvm_driverを継承したDriverを作成するマクロです。
driver_def.svh
`define DRIVER(driver) \
class driver extends uvm_driver; \
`uvm_component_utils(driver) \
function new(string name=`"driver`", uvm_component parent); \
super.new(name, parent); \
endfunction \
extern task run_phase(uvm_phase phase); \
endclass
run_phaseはexternで宣言しているため、外部から書き換えることができます。
では、これらを使ってテストベンチを作成してみます。
サンプルコード
sample_driverのtask run_phaseを外部で書き換えて、実行すると”OK”が出力されます。
`include "sequencer_def.svh"
`include "driver_def.svh"
module top();
import uvm_pkg::*;
`include "uvm_macros.svh"
`DRIVER(sample_driver)
task sample_driver::run_phase(uvm_phase phase);
`uvm_info("", "OK", UVM_NONE)
endtask
`SEQUENCER(sample_sequencer)
class sample_test extends uvm_test;
sample_sequencer sequencer;
sample_driver driver;
`uvm_component_utils(sample_test)
function new(string name="sample_test", uvm_component parent=null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
driver = sample_driver::type_id::create("driver", this);
sequencer = sample_sequencer::type_id::create("sequencer", this);
endfunction
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
driver.seq_item_port.connect(sequencer.seq_item_export);
endfunction
endclass
initial begin
run_test("sample_test");
end
endmodule
まとめ
Sequencer, Driverを作成するマクロを作成しました。
コメント