pkg

ここでは、以下の例が言いたいのだと思います。

  • print_configの使い方と出力例
  • printの出力例。uvm_default_printerを置き換えるとどうなるかも含む。
  • factory.print(1)の出力例
  initial begin
    set_config_int("mu.*", "data", 101);
    set_config_string("mu.*", "str", "hi");
    set_config_int("mu.l1", "data", 55);
    set_config_object("mu.*", "obj", bar);
    //mu.print_config_settings("", null, 1);
    mu.print_config(1,0);
    uvm_default_printer = uvm_default_tree_printer;
    mu.print();
    factory.print(1);
    run_test();
    mu.print();
  end

mu.print_config_settings("", null, 1); の実行結果が長く見づらく、そしてDUPRECATEDって書いてあったので、代わりに mu.print_config(1,0); の実行結果に置き換えました。

# UVM_INFO @ 0: mu [CFGPRT] visible resources:
# <none>
# UVM_INFO @ 0: mu.l1 [CFGPRT] visible resources:
# str [mu.*] : (string) hi
# -
# str [mu.l1] : (string) hi
# -
# obj [mu.*] : (class uvm_pkg::uvm_config_object_wrapper) @mydata@2 1
# -
# obj [mu.*] : (class uvm_pkg::uvm_object) {} 482 1 492 @uvm_status_container@1
# -
# data [mu.l1] : (reg signed[4095:0]) 55
# -
# data [mu.*] : (reg signed[4095:0]) 101
# -
# da* [mu.*] : (reg signed[4095:0]) 256
# -
# UVM_INFO @ 0: mu.l2 [CFGPRT] visible resources:
# str [mu.*] : (string) hi
# -
# obj [mu.*] : (class uvm_pkg::uvm_config_object_wrapper) @mydata@2 1
# -
# obj [mu.*] : (class uvm_pkg::uvm_object) {} 482 1 493 @uvm_status_container@1
# -
# data [mu.*] : (reg signed[4095:0]) 101
# -
# da* [mu.*] : (reg signed[4095:0]) 256
# -

mu.print();を実行すると、以下のログが出るのですが

# -------------------------------
# Name      Type      Size  Value
# -------------------------------
# mu        myunit    -     @338
#   l1      lower     -     @348
#     data  integral  32    'h30
#     str   string    0     ""
#   l2      lower     -     @356
#     data  integral  32    'h40
#     str   string    0     ""
#   a       array     5     -
#     [0]   integral  32    'h0
#     [1]   integral  32    'h1
#     [2]   integral  32    'h4
#     [3]   integral  32    'h9
#     [4]   integral  32    'h10
# -------------------------------

その前に、uvm_default_printer = uvm_default_tree_printer; を実行しておくとこうなります。

# mu: (myunit@338) {
#   l1: (lower@348) {
#     data: 'h30
#     str: ""
#   }
#   l2: (lower@356) {
#     data: 'h40
#     str: ""
#   }
#   a: {
#     [0]: 'h0
#     [1]: 'h1
#     [2]: 'h4
#     [3]: 'h9
#     [4]: 'h10
#   }
# }

uvm_printerに興味がわいたので、調べてみました。セットできるものは

  • uvm_default_tree_printer
  • uvm_default_line_printer
  • uvm_default_table_printer

があり、初期値は uvm_default_table_printer だそうです。なお、line_printerの適用結果も載せようと思いましたが、このprinterは1行にメンバ値を出すものでした。見づらいので掲載は省きます。

なお、それぞれのprinterは細かい調整が可能で、それは以下のように記述すればいいようです。

  • uvm_default_table_printer.knobs.name_width=20;
  • uvm_default_table_printer.knobs.type_width=50;
  • uvm_default_table_printer.knobs.size_width=10;
  • uvm_default_table_printer.knobs.value_width=14;

変更可能なパラメータの種類は、uvmクラスライブラリに付属するHTML版のマニュアルをご覧ください。

factory.print(1);の実行結果は

#### Factory Configuration (*)
#
#   No instance or type overrides are registered with this factory
#
# All types registered with the factory: 39 total
# (types without type names will not be printed)
#
#   Type Name
#   ---------
#   lower
#   myobject
#   myunit
# (*) Types with no associated type name will be printed as <unknown>

でした。inst_overrideやtype_overrideの結果も出るよ、と書かれてますね。