UVM糖果爱好者教程 - 33.定义do_record

这是关于“do”钩子函数系列的最后一篇文章。 do_record函数是由记录对象属性的uvm_object记录函数调用的用户可定义的钩子。

定义do_record

定义do_record不是很困难。我们来定义jelly_bean_transaction的do_record。我记录了与我在do_print中打印的属性相同的属性。我使用了UVM定义的记录宏(第14至19行)。

class jelly_bean_transaction extends uvm_sequence_item;
  virtual function void do_print( uvm_printer printer );
    super.do_print( printer );
    printer.print_string( "name",   get_name() );
    printer.print_string( "flavor", flavor.name() );
    printer.print_string( "color",  color.name() );
    printer.print_field_int( "sugar_free", sugar_free, .size( 1 ) );
    printer.print_field_int( "sour",       sour,       .size( 1 ) );
    printer.print_string( "taste",  taste.name() );
  endfunction: do_print
 
  virtual function void do_record( uvm_recorder recorder );
    super.do_record( recorder );
    `uvm_record_string( "name",   get_name() )
    `uvm_record_string( "flavor", flavor.name() )
    `uvm_record_string( "color",  color.name() )
    `uvm_record_int( "sugar_free", sugar_free, 1 ) // SIZE=1
    `uvm_record_int( "sour",       sour,       1 ) // SIZE=1
    `uvm_record_string( "taste",  taste.name() )
  endfunction: do_record
  // ...
endclass: jelly_bean_transaction

使用do_record

uvm_object的记录函数调用do_record。让我们在我们的jelly bean记分板中调用记录。记录功能将录制策略对象作为参数(第14行)。它是可选的,但除非指定,否则不进行记录。 UVM提供了名为uvm_text_recorder的默认记录器实现。第8至10行显示了如何获得这个默认记录器。

第8行获取UVM事务数据库(uvm_tr_database)的实例。 get_default_tr_database函数返回uvm_text_tr_database的一个实例,这是uvm_tr_database的默认实现。然后第9行在数据库中打开一个流。最后,第10行在流上打开一个新的事务记录器。

class jelly_bean_sb_subscriber extends uvm_subscriber#( jelly_bean_transaction );
  uvm_tr_database tr_db;
  uvm_tr_stream   tr_strm;
  uvm_recorder    rec;
 
  virtual function void build_phase( uvm_phase phase );
    super.build_phase( phase );
    tr_db   = uvm_coreservice_t::get().get_default_tr_database();
    tr_strm = tr_db.open_stream( "tr_strm" );
    rec     = tr_strm.open_recorder( "rec" );
  endfunction: build_phase
 
  function void write( jelly_bean_transaction t );
    t.record( rec );
  endfunction: write
  // ...
endclass: jelly_bean_sb_subscriber

仿真

默认情况下,uvm_text_tr_database使用名为tr_db.log的文件进行记录。运行仿真之后,您应该得到这样的文本文件。

  CREATE_STREAM @0 {NAME:tr_strm T: SCOPE: STREAM:2893}
    OPEN_RECORDER @0 {TXH:2899 STREAM:2893 NAME:rec TIME:0 TYPE=""}
  CREATE_STREAM @0 {NAME:jb_seq T:Transactions SCOPE:uvm_test_top.jb_env.jb_agent.jb_seqr STREAM:2957}
      SET_ATTR @25 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @25 {TXH:2899 NAME:flavor VALUE:BUBBLE_GUM   RADIX:UVM_STRING BITS=18}
      SET_ATTR @25 {TXH:2899 NAME:color VALUE:RED   RADIX:UVM_STRING BITS=11}
      SET_ATTR @25 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @25 {TXH:2899 NAME:sour VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @25 {TXH:2899 NAME:taste VALUE:YUMMY   RADIX:UVM_STRING BITS=13}
      SET_ATTR @45 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @45 {TXH:2899 NAME:flavor VALUE:BUBBLE_GUM   RADIX:UVM_STRING BITS=18}
      SET_ATTR @45 {TXH:2899 NAME:color VALUE:RED   RADIX:UVM_STRING BITS=11}
      SET_ATTR @45 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @45 {TXH:2899 NAME:sour VALUE:0   RADIX:UVM_HEX BITS=1}
      SET_ATTR @45 {TXH:2899 NAME:taste VALUE:YUMMY   RADIX:UVM_STRING BITS=13}
      SET_ATTR @65 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @65 {TXH:2899 NAME:flavor VALUE:BUBBLE_GUM   RADIX:UVM_STRING BITS=18}
      SET_ATTR @65 {TXH:2899 NAME:color VALUE:RED   RADIX:UVM_STRING BITS=11}
      SET_ATTR @65 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @65 {TXH:2899 NAME:sour VALUE:0   RADIX:UVM_HEX BITS=1}
      SET_ATTR @65 {TXH:2899 NAME:taste VALUE:YUMMY   RADIX:UVM_STRING BITS=13}
      SET_ATTR @85 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @85 {TXH:2899 NAME:flavor VALUE:BUBBLE_GUM   RADIX:UVM_STRING BITS=18}
      SET_ATTR @85 {TXH:2899 NAME:color VALUE:RED   RADIX:UVM_STRING BITS=11}
      SET_ATTR @85 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @85 {TXH:2899 NAME:sour VALUE:0   RADIX:UVM_HEX BITS=1}
      SET_ATTR @85 {TXH:2899 NAME:taste VALUE:YUMMY   RADIX:UVM_STRING BITS=13}
      SET_ATTR @105 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @105 {TXH:2899 NAME:flavor VALUE:CHOCOLATE   RADIX:UVM_STRING BITS=17}
      SET_ATTR @105 {TXH:2899 NAME:color VALUE:GREEN   RADIX:UVM_STRING BITS=13}
      SET_ATTR @105 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @105 {TXH:2899 NAME:sour VALUE:0   RADIX:UVM_HEX BITS=1}
      SET_ATTR @105 {TXH:2899 NAME:taste VALUE:YUMMY   RADIX:UVM_STRING BITS=13}
      SET_ATTR @125 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @125 {TXH:2899 NAME:flavor VALUE:CHOCOLATE   RADIX:UVM_STRING BITS=17}
      SET_ATTR @125 {TXH:2899 NAME:color VALUE:GREEN   RADIX:UVM_STRING BITS=13}
      SET_ATTR @125 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @125 {TXH:2899 NAME:sour VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @125 {TXH:2899 NAME:taste VALUE:YUCKY   RADIX:UVM_STRING BITS=13}
      SET_ATTR @145 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @145 {TXH:2899 NAME:flavor VALUE:CHOCOLATE   RADIX:UVM_STRING BITS=17}
      SET_ATTR @145 {TXH:2899 NAME:color VALUE:BLUE   RADIX:UVM_STRING BITS=12}
      SET_ATTR @145 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @145 {TXH:2899 NAME:sour VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @145 {TXH:2899 NAME:taste VALUE:YUCKY   RADIX:UVM_STRING BITS=13}
      SET_ATTR @165 {TXH:2899 NAME:name VALUE:jb_tx   RADIX:UVM_STRING BITS=13}
      SET_ATTR @165 {TXH:2899 NAME:flavor VALUE:CHOCOLATE   RADIX:UVM_STRING BITS=17}
      SET_ATTR @165 {TXH:2899 NAME:color VALUE:BLUE   RADIX:UVM_STRING BITS=12}
      SET_ATTR @165 {TXH:2899 NAME:sugar_free VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @165 {TXH:2899 NAME:sour VALUE:1   RADIX:UVM_HEX BITS=1}
      SET_ATTR @165 {TXH:2899 NAME:taste VALUE:YUCKY   RADIX:UVM_STRING BITS=13}

为了您的参考,这些是我在本文中使用的类。


                                                UVM recorder类图


您可以在EDA Playground上查看并运行代码。

为了优化该脚本,可以考虑以下几点: 1. 减少文件操作次数:可以将查询结果直接存入数组中,避免频繁读取文件。例如: ```bash # 将查询结果存入数组all_odsname中 all_odsname=($(ssql -d cibfl -U edw_user -c "select relname from pg_class where relnamespace=16596 and relkind='p'")) # 遍历数组进行操作 for line in "${all_odsname[@]}"; do echo ods_db.$line$backTime is copying ssql -d cibfl -U seabox -c "COPY ods_db.$line$backTime TO '/data1/init/$backTime/$line.txt' (delimiter '|') ;" done ``` 2. 减少循环次数:可以将多个查询结果合并为一个查询语句,避免多次查询。例如: ```bash # 将查询语句合并为一个语句 ssql -d cibfl -U seabox -c "COPY ods_db.$(echo "${all_odsname[@]}" | tr ' ' ',') TO '/data1/init/$backTime/' (delimiter '|') ;" ``` 3. 优化文件传输:可以使用rsync命令代替ftp命令进行文件传输,rsync命令支持增量传输,传输速度更快。例如: ```bash rsync -avz /data1/init/ dw_ftp@15.8.17.6:/data1/init/ ``` 综上所述,优化后的脚本如下: ```bash #!/bin/bash # 将查询结果存入数组all_odsname中 all_odsname=($(ssql -d cibfl -U edw_user -c "select relname from pg_class where relnamespace=16596 and relkind='p'")) # 遍历backuptime.txt中的时间,并进行操作 while read backTime; do mkdir /data1/init/$backTime ssql -d cibfl -U seabox -c "COPY ods_db.$(echo "${all_odsname[@]}" | tr ' ' ',') TO '/data1/init/$backTime/' (delimiter '|') ;" tar -cvPf /data1/init/$backTime.tar /data1/init/$backTime rm -rf /data1/init/$backTime echo ------------rsyncing-------------- rsync -avz /data1/init/ dw_ftp@15.8.17.6:/data1/init/ echo $backTime备份数据上传成功 完成系统时间 $(date +%Y%m%d%n%H:%M) >> backup.log rm -f /data1/init/$backTime.tar done < backuptime.txt ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值