前回はこちら:msyksphinz.hatenablog.com
UVMについて理解を深めるために、4入力のArbiterを用いたデザインのUVM検証パタンを作っていこうと思う。
arbiter4.sv
デザインとしては非常にシンプルで優先度も単純なのだが、とりあえずこれでUVMが走るところまで行きたい。
テストを流してみて、信号が駆動していなかったので、ランダムな値を設定するようにした。
arbiter4_sequence.sv
virtual task body (); assert(this.randomize()) else `uvm_error("SEQ", "Randomization of num failed"); for (int i = 0; i < num; i++) begin arbiter4_seq_item item = arbiter4_seq_item::type_id::create("item"); if (!item.randomize()) begin `uvm_error("arbiter4_seq", "Randomization failed!") end start_item(item); `uvm_info ("SEQ", $sformatf ("Generate new item: "), UVM_LOW) item.print(); finish_item(item); end `uvm_info ("SEQ", $sformatf ("Done generation of %0d items", num), UVM_LOW) endtask // body
とりあえず実行すると、スコアボードに結果が表示される。
UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 300000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=1, i_data0=0xbcd0, i_valid1=1, i_data1=0x9e9d, i_valid2=0, i_data2=0xe653, i_valid3=1, i_data3=0xe74, o_valid=1, o_data=0xe74 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 500000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=1, i_data0=0x33aa, i_valid1=0, i_data1=0xafb, i_valid2=1, i_data2=0xd13d, i_valid3=1, i_data3=0x1582, o_valid=1, o_data=0x1582 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 700000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=1, i_data0=0x9360, i_valid1=1, i_data1=0x349a, i_valid2=0, i_data2=0x9a57, i_valid3=1, i_data3=0xbf54, o_valid=1, o_data=0xbf54 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 900000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=1, i_data0=0x3f58, i_valid1=0, i_data1=0x8103, i_valid2=0, i_data2=0xb7a8, i_valid3=0, i_data3=0x8499, o_valid=1, o_data=0x3f58 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 1100000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=0, i_data0=0x1986, i_valid1=1, i_data1=0x84ab, i_valid2=1, i_data2=0x8253, i_valid3=0, i_data3=0xf6b9, o_valid=1, o_data=0x8253 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 1300000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=1, i_data0=0x1b86, i_valid1=1, i_data1=0x5122, i_valid2=0, i_data2=0xd82b, i_valid3=1, i_data3=0x5ffd, o_valid=1, o_data=0x5ffd UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 1500000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=0, i_data0=0x29ae, i_valid1=1, i_data1=0x7784, i_valid2=0, i_data2=0xe304, i_valid3=0, i_data3=0xf09d, o_valid=1, o_data=0x7784 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 1700000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=1, i_data0=0x52c, i_valid1=1, i_data1=0xa65b, i_valid2=1, i_data2=0x5894, i_valid3=0, i_data3=0xea9e, o_valid=1, o_data=0x5894 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 1900000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=0, i_data0=0xe2a8, i_valid1=1, i_data1=0xea03, i_valid2=1, i_data2=0xbc7, i_valid3=0, i_data3=0x6603, o_valid=1, o_data=0xbc7 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 2100000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=0, i_data0=0xb0d5, i_valid1=1, i_data1=0xb464, i_valid2=0, i_data2=0x85b4, i_valid3=0, i_data3=0x1599, o_valid=1, o_data=0xb464 UVM_INFO ./model/arbiter4_scoreboard.sv(18) @ 2300000: uvm_test_top.e0.sb0 [arbiter4_scoreboard] Scoreboard found packet i_valid0=0, i_data0=0xf8c8, i_valid1=1, i_data1=0xc5f, i_valid2=0, i_data2=0xa15c, i_valid3=1, i_data3=0x97d6, o_valid=1, o_data=0x97d6
正しく動いているようだ。UVMで、テストを実行することができた。