UVM源码解读,UVM-1.2 code review notes

UVM源码解读,UVM-1.2 code review notes逐个文件解读 uvm 源码

uvm-1.2源码学习


? 声明

  • ? 作者主页:【MangoPapa的CSDN主页】。
  • ⚠️ 本文首发于CSDN,转载或引用请注明出处【点击查看原文】。
  • ⚠️ 本文为非盈利性质,目的为 个人学习记录知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
  • ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
  • ? 欢迎大家指出文章错误,欢迎同行与我交流 ~
  • ? 邮箱:


文章目录


前言


◼ uvm-1.2/src/ 顶层文件

◽ README.txt

  上来便是四家联合声明版权,然后才有以下内容。

✑ 如何安装UVM包

✑ 如何使用UVM

✑ 如何运行测试用例

◽ LICENSE.txt

◽ release-notes.txt

◽ uvm_checksum.txt

   uvm校验和,具体用途待考究,猜测是跟licence搭配使用的?还是说验证用户编程规范性用的?

◽ uvm.sv

   这就是需要放在最开始编译的文件,本文件里include uvm_pkg.sv,如果define了VCS,再把vcs/snps_reg.svh include进来

◽ uvm_pkg.sv

◽ uvm_macros.svh

  uvm_macros.svh里包含了所有UVM的宏定义。宏的作用、优劣就不介绍了。本文件除了把$UVM_HOME/src/macros/下的svh include进来,还定义了一些其他宏,比如UVM_USE_STRING_QUEUE_STREAMING_PACK、uvm_typename(X)、uvm_delay(TIME)及verdi、vcs控制相关的宏。

◽ uvm_vmm_pkg.sv

  重定向vmm message到uvm message、给vmm env重新包了一层wrap到uvm env等。

◽ uvm_asm.sv


◼ macros

  没错,uvm所有宏相关的东西都在这儿了。

◽ uvm_callback_defines.svh

  uvm_callback相关的宏:

◽ uvm_deprecated_defines.svh

  以下宏不建议使用:

◽ uvm_global_defines.svh

  UVM全局宏,主要有3个,UVM_MAX_STREAMBITS(4096)、UVM_PACKER_MAX_BYTES(4096)及超时退出默认值UVM_DEFAULT_TIMEOUT(9200s)

◽ uvm_message_defines.svh

  uvm打印信息相关的宏,常用的`uvm_info/warning/error/fatal等都在这里进行了定义,通过调用uvm_report_info/warning/error/fatal等函数实现打印。打印之前会进行判断,只有符合冗余度阈值条件的才会打印。只有`uvm_info需要手动设置冗余度,`uvm_warning/error/fatal的冗余度都是UVM_NONE,无需设置,若要关闭相关打印,可以在仿真选项sim_opts里关闭其action(+uvm_set_action=…UVM_NO_ACTION)。如果某些打印信息不方便在code中直接改冗余度,可以通过+uvm_set_verbosity选项重载其打印冗余度。

  此外还有uvm_message_begin、uvm_message_end、uvm_message_context_begin、uvm_message_context_end,其用途是uvm library内部使用,没有形成规范,也不对外开放。

  与之对应的,还有uvm_info_begin、uvm_info_end、uvm_warning_begin、uvm_warning_end、uvm_error_begin、uvm_error_end、uvm_fatal_begin、uvm_fatal_end、uvm_info_context_begin、uvm_info_context_end、uvm_warning_context_begin、uvm_warning_context_end、uvm_error_context_begin、uvm_error_context_end、uvm_fatal_context_begin、uvm_fatal_context_end,这些也是不建议使用。

  uvm message机制支持用户定制信息,通过uvm_message_add_int、uvm_message_add_string、uvm_message_add_tag、uvm_message_add_object实现定制。这几个平时我没用过,猜测啊,这些还要搭配uvm_info_begin/end来使用。

  仿真时加宏UVM_REPORT_DISABLE_FILE_LINE、UVM_REPORT_DISABLE_FILE、UVM_REPORT_DISABLE_LINE来选择控制关闭打印文件信息和(或)行号信息。

◽ uvm_object_defines.svh

  只有用uvm__utils宏注册过的component/onject,才能使用uvm factory机制的在check_fields、copy、compare、pack、unpack、record、print、setint方面提供的便利,建议仔细看看啊,还是很有意思的,由于宏太多就不一一讲了。相关的宏都列这儿啦。

  以上宏定义调用到的宏

  除了上边提到的宏之外,还有一些杂散的宏,写代码的时候可以调用

◽ uvm_phase_defines.svh

  文件描述写得很明白了,这个文件中的define是给uvm_root.svh用的,用以简单创建所有的phase。这些宏仅能够创建uvm内建的phase,因为其实从uvm_component来的,不支持自定义的phase。如果需要实现更复杂的phase,用户可以从uvm_task/topdown/bottomup_phase基类中派生出新的类,然后细化一下exec_task或exec_func就可以啦。

  m_uvm_task_phase实现了一个直接扩展自uvm_task_phase的类,详情可查看base/uvm_task_phase.svh的解读。

  m_uvm_bottomup_phase实现了一个直接扩展自uvm_bottomup_phase的类,m_uvm_topdown_phase实现了一个直接扩展自uvm_topdown_phase的类,两者里边比较简单,实现了new和get_type_name两个函数。除了父类不一样外,两者唯一的不同,就在于m_uvm_topdown_phase这个宏在例化phase的时候,类型是local的,bottomup没有特意指明local。

  在m_uvm_bottomup_phase和m_uvm_updown_phase基础上再包一层,有了uvm_buildin_task_phase、uvm_buildin_topdown_phase、uvm_buildin_bottomup_phase,三个参数中只有PHASE一个参数是变量,COMP=uvm_component,PREFIX=uvm_。未方便用户使用,继续放开,便有了uvm_user_task_phase、uvm_user_topdown_phase、uvm_user_bottomup_phase,PHASE、COMP、PREFIX三个参数都由用户指定。

◽ uvm_printer_defines.svh

  提供了一系列printing相关的宏,自己去看吧。

◽ uvm_reg_defines.svh

◽ uvm_sequence_defines.svh

  uvm sequence相关的宏都再这儿了。记得uvm_sequence里用到的uvm_do、uvm_do_on、uvm_do_with、uvm_send之类的宏不,就在这里,简单列在这里:

  • uvm_create, 在m_sequencer上创建指定的sequence或item
  • uvm_create_on,与uvm_create作用相同,用户可指定sequencer创建sequence或item
  • uvm_do,默认采用m_sequencer发送transaction,优先级默认为-1。如果在sequence上create,这个宏相当于以下几步:
    ① uvm_create(sub_seq)
    ② sub_seq.randomize()
    ③ this.pre_start()
    ④ this.pre_do(0)
    ⑤ this.mid_do(sub_seq)
    ⑥ sub_seq.body()
    ⑦ this.post_do(sub_seq)
    ⑧ sub_seq.post_start()

    如果在sequence item上create,这个宏相当于以下几步:
    ① sequencer.wait_for_grant(prior)
    ② this.pre_do(0)
    ③ item.randomize()
    ④ this.mid_do(item)
    ⑤ sequencer.send_request(item)
    ⑥ sequencer.wait_for_item_done()
    ⑦ this.post_do(item)


































  • uvm_do_pri,与uvm_do作用相同,用户可指定sequence的执行优先级
  • uvm_do_on,与uvm_do作用相同,用户可指定sequencer创建sequence或item
  • uvm_do_on_pri,与uvm_do作用相同,用户可指定sequencer创建sequence及指定sequence的执行优先级
  • uvm_do_with,与uvm_do作用相同,用户可指定约束条件
  • uvm_do_on_with,与uvm_do_on作用相同,用户可指定sequencer创建sequence
  • uvm_do_pri_with,与uvm_do_with作用相同,用户可指定sequence执行的优先级
  • uvm_do_on_pri_with,与uvm_do_pri_with作用相同,用户可指定sequencer创建sequence。其实,所有uvm_do相关的宏都是直接或间接调用了uvm_do_on_pri_with这个宏,只是把一些参数固定死了。
  • uvm_send,发送sequence或item,调用了uvm_sequence_pri,优先级-1
  • uvm_send_pri,发送sequence或item,用户指定优先级;先判断是否为sequence,如果不是,start_item然后finish_item;如果是,则启动sequence。在使用uvm_send*之前,要先uvm_create
  • uvm_rand_send
  • uvm_rand_send_pri
  • uvm_rand_send_with
  • uvm_rand_send_pri_with,所有uvm_rand_send*相关的宏都是直接或间接调用自uvm_rand_send_pri_with。其跟uvm_do*系列宏的区别就在于uvm_send需提前uvm_create。其跟uvm_send*系列宏的区别在于,uvm_rand_send*会对sequence/item进行判断,如果sequence/ietm为空或随机失败,报uvm_warning。
  • uvm_create_seq,跟uvm_create_on作用类似,uvm_create_seq(seq,
    sqr)相当于uvm_create_on(seq,
    sqr.consumer_seqr),consumer_seqr需要用户在自己sequencer中定义。




  • uvm_do_seq,同上
  • uvm_do_seq_with,同上
  • uvm_add_to_seq_lib,静态添加sequence到sequence lib
  • uvm_sequence_library_utils
  • uvm_declare_p_sequencer,声明p_sequencer并强制转换为m_sequencer类型

◽ uvm_tlm_defines.svh

  tlm imp接口声明系列宏:

  • uvm_blocking_put_imp_decl,声明一个blocking_put_img类,从uvm_port_base扩展而来,实现了一个put的task,task put无返回值
  • uvm_nonblocking_put_imp_decl,声明一个nonblocking_put_img类,从uvm_port_base扩展而来,实现了一个try_put和can_put的task,try_put_*成功返回1,失败返回0
  • uvm_put_imp_decl,声明一个put_img类,实现了put、try_put和can_put
  • uvm_blocking_get_imp_decl,声明一个blocking_get_img类,从uvm_port_base扩展而来,实现了一个get的task,task get无返回值
  • uvm_nonblocking_get_imp_decl,声明一个nonblocking_get_img类,从uvm_port_base扩展而来,实现了一个try_get和can_get的task,try_get_*成功返回1,失败返回0
  • uvm_get_imp_decl,声明一个get_img类,实现了get、try_get和can_get
  • uvm_blocking_peek_img_decl,跟get_imp的区别在于,peek是主动获取
  • uvm_nonblocking_peek_img_decl
  • uvm_peek_img_decl
  • uvm_blocking_get_peek_img_decl,get_img+peek_img
  • uvm_nonblocking_get_peek_img_decl
  • uvm_get_peek_img_decl
  • uvm_blocking_master_imp_decl,集合了blocking_put+get+peek_img的功能,master
  • uvm_nonblocking_master_imp_decl,集合了nonblocking_put+get+peek_img的功能
  • uvm_master_imp_decl,集合了uvm_blocking_master_imp_decl和uvm_nonblocking_master_imp_decl的功能
  • uvm_blocking_slave_imp_decl,集合了blocking_put+get+peek_img的功能,slave,与master的区别,一是名字不一样,二是mask不一样,这个mask在UVM_MS_IMP_COMMON宏中赋给了m_if_mask(没错,slave这里也是用的UVM_MS_IMP_COMMON)
  • uvm_nonblocking_slave_imp_decl,集合了nonblocking_put+get+peek_img的功能
  • uvm_slave_imp_decl,集合了uvm_blocking_slave_imp_decl和uvm_nonblocking_slave_imp_decl的功能
  • uvm_blocking_transport_imp_decl,实现了一中transport操作喽,transport相当于put+get,相关参数也是双份的,其他的就不讲了
  • uvm_nonblocking_transport_imp_decl
  • uvm_non_blocking_transport_imp_decl,调用uvm_nonblocking_transport_imp_decl
  • uvm_transport_imp_decl,不介绍也懂是啥了吧
  • uvm_analysis_imp_decl,如果有一个uvm_analysis_imp还好说,有多个的话也不用着急,可以用uvm_analysis_imp_decl来实现
  • 除tlm接口声明系列宏外,还声明了UVM_SEQ_ITEM_PULL_IMP及各种mask的初始值。

◽ uvm_undefineall.svh

◽ uvm_version_defines.svh


◼ base

◽ uvm_globals.svh

uvm_globals 介绍

◽ uvm_object_globals.svh

uvm_object_globals 介绍

◽ uvm_object.svh

uvm_object 介绍

◽ uvm_event.svh

uvm_event 介绍

◽ uvm_event_callback.svh

uvm_event_callback 介绍

◽ uvm_barrier.svh

uvm_barrier 介绍

◽ uvm_coreservice.svh

uvm_coreservice 介绍

◽ uvm_cmdline_processor.svh

uvm_cmdline_processor 介绍

◽ uvm_resource.svh

uvm_resource 介绍

◽ uvm_resource_db.svh

uvm_resource_db 介绍

◽ uvm_resource_specializations.svh

uvm_resource_specializations 介绍

◽ uvm_packer.svh

uvm_packer 介绍

◽ uvm_queue.svh

uvm_queue 介绍

◽ uvm_spell_chkr.svh

uvm_spell_chkr 介绍

◽ uvm_pool.svh

uvm_pool 介绍

◽ uvm_links.svh

uvm_links 介绍

◽ uvm_comparer.svh

uvm_comparer 介绍

◽ uvm_misc.svh

uvm_misc 介绍

◽ uvm_heartbeat.svh

uvm_heartbeat 介绍

◽ uvm_registry.svh

uvm_registry 介绍

◽ uvm_recorder.svh

uvm_recorder 介绍

◽ uvm_report_server .svh

uvm_report_server 介绍


◼ comps

◽ uvm_comps.svh

◽ uvm_env.svh

  uvm_env,uvm environment,由uvm_component扩展而来,是个虚类,所有env都应扩展自uvm_env。uvm_env在uvm_component基础上没有过多扩展,做了两件事:

  1. 创建并初始化uvm_env
  2. 实现get_type_name函数返回type_name



◽ uvm_agent.svh

  1. 创建并初始化uvm_agent,new
  2. 实现get_type_name函数返回type_name
  3. 实现get_is_active函数,返回is_active的值。默认是UVM_ACTIVE的哈,但备不住用户会覆盖掉嘛。
  4. 实现build_phase。这里主要是到uvm_resource_pool中去读uvm_agent的is_active值。这里考虑得比较全面,考虑了用户自定义的is_active类型为string、uvm_bitstream_t、uvm_integral_t、unsigned、int等情况,对这些情况做类型转换。



◽ uvm_driver.svh

  1. seq_item_port是uvm_seq_item_pull_port类型的,有两个参数REQ和RSP,所有派生自uvm_driver的driver都应该用seq_item_port想sequencer请求items; seq_item_port也可以用来反馈响应给sequencer。
  2. seq_item_prod_if是uvm_seq_item_pull_port类型的,充当接口或桥,后边会把seq_item_port赋给seq_item_prod_if;
  3. rsp_port是uvm_analysis_port类型的,只有一个参数RSP,一般用rsp_port来反馈响应给sequencer,而不是上边提到的seq_item_port。driver采用哪种port连接sequencer取决于sequencer采用了哪种export,两者需要匹配。
    uvm_driver做了2件事:

  4. 创建并初始化uvm_driver,new函数值创建seq_item_port和rsp_port,seq_item_port指针给seq_item_prod_if。
  5. 实现get_type_name函数返回type_name



◽ uvm_push_driver.svh

  1. 创建并初始化uvm_push_driver,new函数值创建req_export和rsp_port。
  2. 实现get_type_name函数返回type_name
  3. 实现check_port_connections函数检测port连接,如果req_export的size不为1的话报uvm_fatal
  4. put函数,调用push_driver中push,会报uvm_fatal
  5. end_of_elaboration_phase中自动调用check_port_connections检测port连接,把不符合规则的port连接扼杀在task phase之前



◽ uvm_monitor.svh

  uvm_monitor,由uvm_component扩展而来,是个虚类,所有用户自定义的monitor都应扩展自uvm_monitor。uvm_monitor在uvm_component基础上没有过多扩展,做了两件事:

  1. 创建并初始化uvm_monitor
  2. 实现get_type_name函数返回type_name



◽ uvm_test.svh

  uvm_test,由uvm_component扩展而来,是个虚类,所有testcase都应直接或间接扩展自uvm_test,只有这样,才能实现在命令行指定UVM_TESTNAME执行uvm_root::run_test。uvm_test在uvm_component基础上没有过多扩展,做了两件事:

  1. 创建并初始化uvm_test
  2. 实现get_type_name函数返回type_name



◽ uvm_scoreboard.svh

◽ uvm_random_stimulus.svh

◽ uvm_in_order_comparator.svh

◽ uvm_algorithmic_comparator.svh

◽ uvm_policies.svh

  uvm_policies.svh这文件中有很多class(通用component,非扩展自uvm_component),用以实现内建类型与基类类型不同时的多态操作:


◼seq

◽ uvm_seq.svh

◽ uvm_sequence_item.svh

  uvm_sequenve_item直接从uvm_transaction派生而来,uvm_transaction从uvm_object派生而来。uvm_sequence_item这个类中内容如下所述。

  • 成员变量,
    – m_sequence_id,sequence id,local int类型,默认-1
    – m_use_sequence_info,sequence占用标志位,protected bit类型
    – m_depth,sequence depth信息,protected int类型,默认-1
    – m_sequencer,发送该sequence的sequencer
    – m_parent_sequence,parent sequence
    – print_sequence_info,打印sequence信息标志位
    – issued1,issued2














  • 方法(function/task)
    – new,创建uvm_sequence_item
    – get_type_name,返回字符串“uvm_sequence_item”
    – get_full_name,不解释啦,会与get_name的值(leaf_name)拼接哦
    – get_root_sequence,获取root sequence(没有parent sequence就是root
    sequence啦)
    – get_root_sequence_name,获取root sequence name
    – get_sequence_path,获取sequence path,实现方法与get_root_sequence_name相似,区别在于get_sequence_path把搜索过程中的各个节点记录了下来,拼接成path
    – set_sequence_id,设置m_sequence_id的值
    – get_sequence_id,返回m_sequence_id的值
    – set_id_info,设置item的id,输入参数类型是uvm_sequence_item,item为空报fatal,非空则:①获取item的id并赋值给m_transanction_id(见uvm_transaction.svh)
    ②获取item的sequence id并赋值给m_sequence_id
    – set_depth,设置m_depth的值
    – get_depth,返回m_depth值
    – set_use_sequence_info,设置m_use_sequence_info的值
    – get_use_sequence_info,返回m_use_sequence_info的值
    – set_parent_sequence,设置m_parent_sequence,指定parenr sequence
    – get_parent_sequence,获取m_parent_sequence
    – m_set_p_sequencer,内部方法,返回空
    – set_sequencer,设置m_sequencer,指定发送该sequence的sequencer
    – get_sequencer,获取m_sequencer,获取发送该sequence的sequencer
    – set_item_context,给当前sequence_item指定parent sequence及sequencer,depth值+1,重新分配seed
    – is_item,item返回1,sequence返回0。代码里只有一行return(1),它会把uvm_sequence_base里is_item函数的return 0覆盖掉。
    – uvm_report_info、uvm_ report_warning、uvm_ report_error、uvm_
    report_fatal、do_print及其相关的uvm_get_report_object、uvm_report_enable、uvm_report。sequence或item打印信息时会用到sequencer,如果没有指明sequencer的话,则直接调用全局的reporter。(TODO。后边有时间再详细解释这个,我先往下看代码哇)



















































◽ uvm_sequence_base.svh

  uvm_sequence_base直接从uvm_sequence_item派生而来,该类内容如下所述。

– 成员变量

- m_sequence_state,uvm_sequence_state有9个state详见uvm_object_globals.svh中的uvm_sequence_state枚举变量介绍 - m_next_transaction_id,默认为1 - m_priority, - m_wait_for_grant_semaphore, - m_sqr_seq_ids, - children_array, - response_queue, - response_queue_depth, - response_queue_error_report_disable - do_not_randomize - m_sequence_process,当前sequence进程 - m_use_response_handler, - type_name, - is_rel_default, - wait_rel_default, 

– 方法(function/task)

- new,创建并初始化uvm_sequence_base,m_sequence_state=UVM_CREATE,wait_for_grant_semaphore=0,m_init_phase_daps(1) - is_item,item返回1,sequence返回0,默认返回0(因为当前为sequence) - get_sequence_state,返回sequence state,return m_sequence_state - wait_for_sequence_state,输入参数未state_mask,等待直到sequence state符合state_mask为止 - get_tr_handle,获取transaction handler,每一个recorder都有一个独一无二的id,为0表示该transaction已经被释放,详见uvm_recoreder.svh - start,广为人知的seq.start(seq, sqr)就是在这儿实现的。该task按顺序做了以下事情: - set_item_context - 判断sequence state是否在UVM_CREATE、UVM_STOPPED、UVM_FINISHED中,不在的话报uvm fatal - 如果parent sequence不为空的话,sequence.children_array置一 - 如果sequence优先级小于-1,报fatal,这优先级溢出啦 - 如果sequence优先级小于0(为-1),parent sequence为空优先级默认100,非空则使用parent sequence的优先级作为当前sequence的优先级 - 清空当前sequence的response queue,确保已退出上次运行 - 若sequencer非空,获取stream、handler、m_tr_recoder - 设置sequence id为-1,确保该sequence已终止执行 - 若m_sequencer非空,注册sequence - 提起objection并锁住uvm_get_to_lock_dap,然后pre_start、pre_body、pre_do、mid_do、body、post_do、post_body、post_start一系列操作安排上,最后drop objection - 清理现场,end_tr、m_sequence_exiting、children_array.dekete等 - body,用户需要自己写body来覆盖掉uvm_sequence_base里的body,不然会报uvm_warning - set_starting_phase,不解释 - get_starting_phase,不解释 - set_automatic_phase_objection - get_automatic_phase_objection - m_safe_raise_staring_phase - m_safe_drop_staring_phase - set_priority,设置sequence优先级 - get_priority,获取sequence优先级 - is_relevant,默认is_relevant值为1,用户使用时需重载该函数,该函数用于sequencer仲裁,is_relevant为0时sequencer就不调用这个sequence - wait_for_relevant,当所有sequence都不relevant时,等待relevant出现 - lock,锁住sequencer,具体在sequencer里再讲 - grab,抢占sequencer,直接插队到最先,比lock强势哦 - unlock,解锁 - ungrab,解除抢占 - is_blocked,返回sequencer block状态,如果lock或grab了,返回0,否则返回1 - has_lock,sequencer lock的话返回1,否则返回0 - kill,杀掉sequence,drop objection - do_kill, m_kill,杀掉所有children sequence进程 - create_item, start_item, finish_item,见字如晤 - wait_for_grant,见字如晤,等待放行 - send_request,见字如晤,发送请求,一般在wait_for_gant之后用 - wait_for_item_done,等待item发送完毕 - use_response_handler,见字如晤 - get_use_response_handler,获取m_use_response_handler值 - response_handler,返回空 - set_response_queue_error_report_disable - get_response_queue_error_report_disable - set_response_queue_depth - get_response_queue_depth - clear_response_queue - put_base_response - put_response - get_base_response - constraint pick_sequence - num_sequeces,返回sequence数目 - get_seq_kind,返回suquence类型 - get_sequence,获取指定类型的sequence - do_sequence_kind,启动指定类型的sequence - get_sequence_by_name,获取指定名字的sequence - create_and_start_sequence_by_name,创建并启动指定名字的sequence - m_get_sqr_sequence_id,获取指定sequencer的sequence id,可指定get钱是否update - m_set_sqr_sequence_id,设置指定sequencer的sequence id 






◽ uvm_sequence.svh

  uvm_sequence直接从uvm_sequence_item扩展而来,是个参数化的类,两个参数分别为uvm_sequence_item类型的REQ和RSP。

– 成员变量

- uvm_sequence_item类型的REQ - uvm_sequence_item类型的RSP - uvm_sequencer_param_base类型的param_sequencer 

– 方法(function/task)

- new,创建并初始化uvm_sequence - send_request,给sequencer发送请求,请求sequencer发送item,可以设置rerandomize bit 1,在发送之前随机一下item - get_current_item,返回当前的item,如果m_sequencer到参数化的类param_seqyencer转换失败,会报fatal - get_response,获取指定transaction的response - put_response,给指定RSP设置response - do_print,调用printer的print_object,打印REQ和RSP






◽ uvm_sequence_builtin.svh

◽ uvm_sequence_library.svh

  包含两个类,uvm_sequence_library及其cfg,均从uvm_sequence扩展而来。

◽ uvm_sequencer_base.svh

  uvm_sequencer_base直接派生自uvm_component。

-成员变量

- arb_sequence_q[$]; - arb_completed[int]; - lock_list[$]; - reg_sequences[int]; - m_sequencer_id; - m_lock_arb_size; - m_arb_size; - m_wait_for_item_sequence_id, - m_wait_for_item_transaction_id; - m_wait_relevant_count = 0 ; - m_max_zero_time_wait_relevant_count = 10; - m_last_wait_relevant_time = 0 ; - m_arbitration = UVM_SEQ_ARB_FIFO; - g_request_id; - g_sequence_id = 1; - g_sequencer_id = 1; - m_default_sequences[uvm_phase],sequence进程 

– 方法(function/task)

- new,创建并初始化uvm_sequencer_base - is_child,如果是child sequence,则返回1,否则返回0 - user_priority_arbitration,仅用于sequencer的UVM_SEQ_ARB_USER模式 - execute_item,运行指定的item - start_phase_sequence,在当前phase下启动sequece - stop_phase_sequence,在当前phase下停止sequence - wait_for_grant,sequence等待放行 - wait_for_item_done,等待item传输完成 - is_blocked,返回block状态,block住了则返回1,否则返回0 - has_lock,如果当前sequencer有锁,返回1,否则返回0 - lock,sequence加锁 - unclock,解锁 - grab,sequence抢占 - ungrab,解除抢占 - stop_sequence,停止当前sequence - is_grabed,如果当前sequencer被lock或grab,均返回1,否则返回0 - current_grabber,返回sequencer现在被谁lock/grab住了 - has_do_available,当前sequencer要发送的sequence,如果有ready的就返回1,否则返回0。 - set_arbitration,设置sequencer的仲裁模式,包括以下模式: - UVM_SEQ_ARB_FIFO,默认模式,先入先出,FIFO - UVM_SEQ_ARB_WEIGHTED,根据权重进行仲裁,相同权重随机选择 - UVM_SEQ_ARB_RANDOM,随机选择 - UVM_SEQ_ARB_STRICT_FIFO,最高优先级按照FIFO模式 - UVM_SEQ_ARB_STRICT_RANDOM,最高优先级按照随机模式 - UVM_SEQ_ARB_USER,用户自定义模式 - get_arbitration,获取当前仲裁模式 - wait_for_sequences,sequence等待item ready - send_request,给sequencer发送请求,请求item - 其他内建的function/task,不列举了,敲得手疼 

◽ uvm_sequencer_param_base.svh

– 成员变量

- rsp_export,uvm_analysis_export类型 

– 方法

- get_current_item,获取sequencer当前在执行的sequence item - get_num_reqs_sent,返回sequencer发出的请求数量 - set_num_last_reqs,设置过往请求的保存数量上限,默认1,最大支持1024,超出会报警 - get_num_last_reqs,获取过往请求的保存数量上限 - last_req,返回上一次发出请求的item - get_num_rsps_received,获取当前sequencer已接收的请求数目 - set_num_last_rsps,设置response保存数量上限,默认1,最大可设置为1024 - get_num_last_rsps,获取response保存数量上限 - last_rsp,返回上一次返回的response item - connect_phase,把rsp_export与sqr_rsp_analysis_fifo.analysis_export相连 - build_phase,当前sequencer指针指向sqr_rsp_analysis_fifo.sequencer_ptr - 其他不建议直接使用的内建方法,不列举了 

◽ uvm_sequencer.svh

  uvm_sequencer在uvm_sequencer_param_base的基础上,主要实现了以下方法,也是我们日常中接触比较多的几个方法:

- get_next_item,请求下一个item - try_next_item - item_done - put - get - peek - item_done_trigger - item_done_get_trigger_data 

◽ uvm_push_sequencer.svh

◽ uvm_sequencer_analysis_fifo.svh


◼ direct

  Synopsys自家的东西,非UVM标准。两个文件,其一include uvm_seed.svh,其二uvm_seed.svh这个文件DPI-C调用C实现uvm单向哈希算法及创建随机seed。别无其他。

◽ uvm_direct.svh

◽ uvm_seed.vh


◼ dap

  dap全称是data access policy,即uvm的数据访问策略。除容器文件uvm_dap.svh之外,实现了四个类: ① uvm_set_get_dap_base;② uvm_simple_lock_dap; ③ uvm_get_to_lock_dap; ④ uvm_set_before_get_dap。从名称中容易看出,uvm_set_get_dap_base是基类,其直接从uvm_object扩展得到,是个参数化的类(参数type T=int),另外3个都是从这个基类中扩展出来的。

◽ uvm_dap.svh

  头文件或称容器文件,把另外四个文件include进来。

◽ uvm_set_get_dap_base.svh

  uvm_set_get_dap_base是个参数化的类,从uvm_object直接扩展而来。该类提供了UVM数据访问的四大接口:set、try_set、get和try_get。set/get是在resource(中文咋翻译?池子?)内进行set/get的数据访问操作,操作失败的话会报error;try_set/try_get的意思也很明显了,操作成功返回1,操作失败不会报错,但会返回0。

◽ uvm_simple_lock_dap.svh

◽ uvm_set_before_get_dap.svh

◽ uvm_get_to_lock_dap.svh


◼ include

◽ snps_reg_uints.h

◻ pureC

◽ snps_reg_rw_api.h

  API,纯C实现寄存器读写

◻ uvmC

◽ snps_reg_rw_api.h


◼ dpi

◽ uvm_dpi.cc

  头文件,include了

, uvm_dpi.h, uvm_commen.c, uvm_regex.cc, uvm_hdl.cc, uvm_svcmd_dpi.cc,只有在定义了“__cplusplus”时才有效。编译器可以直接编译该文件,或单独编译该文件include的几个文件,方便用户使用。

◽ uvm_dpi.h

  include UVM中C/C++用到的头文件,包括

,

,

,

, ,

及veriuser.h和svdpi.h。此外还有一些UVM DPI内部实现用到的常量(M_UVM_INFO/WARNING/ERROR/FATAL, M_UVM_NONE/LOW/MEDIUM/HIGH/FULL/DEBUG)及方法(m_uvm_report_dpi & int_str_max),不对外开放。



◽ uvm_dpi.svh

  UVM DPI子程序顶层文件,include了uvm_hdl.svh, uvm_svcmd_dpi.svh,和uvm_regex.svh。如果工具自带DPI,可以加宏UVM_NO_DPI来关掉DPI。

◽ uvm_common.c

  UVM DPI通用方法的实现,包括m__uvm_report_dpi, m_uvm_report_dpi及int_str_max。

◽ uvm_hdl.c

  根据defined的宏,决定include哪家的uvm_hdl.c。对应关系如下:VCS/VCSMX -> uvm_hdl_vcs.c,QUESTA -> uvm_hdl_questa.c,INCA/NCSC -> uvm_hdl_inca.c,没有相关定义的话会报错。

◽ uvm_hdl.svh

◽ uvm_hdl_inca.c

  inca家uvm backdoor访问hdl的C code实现,不具体讲了,有兴趣可以自己看。

◽ uvm_hdl_questa.c

  questa家uvm backdoor访问hdl的C code实现,不具体讲了,有兴趣可以自己看。

◽ uvm_hdl_vcs.c

  vcs家uvm backdoor访问hdl的C code实现,不具体讲了,有兴趣可以自己看。这个讲得最详细。

◽ uvm_regex.svh

  import 3个字符串匹配的DPI-C,分别是uvm_re_match, uvm_dump_re_cache, uvm_glob_to_re。如果定义了UVM_REGEX_NO_DPI的话,采用了sv实现uvm_re_match,但另外两个没有具体实现,是个宏的function。

◽ uvm_regex.cc

◽ uvm_svcmd_dpi.svh

◽ uvm_svcmd_dpi.c

  uvm_dpi_get_next_arc_c, uvm_dpi_get_tool_name_c, uvm_dpi_get_tool_version_c, uvm_dpi_reg_comp, uvm_dpi_regexec, uvm_dpi_regfree的C code实现。

  • uvm_dpi_get_next_arc_c,dpi从命令行读取下一个参数;
  • uvm_dpi_get_tool_name_c,获取工具名称信息;
  • uvm_dpi_get_tool_version_c,获取工具版本信息;
  • uvm_dpi_reg_comp,编译正则表达式;
  • uvm_dpi_regexec,执行正则表达式,开始匹配;
  • uvm_dpi_regfree,释放正则表达式。




◼ deprecated

  顾名思义,不推荐使用的,所有出现在这个文件夹下的file、type、class、function都是不推荐使用的。

◽ readme.important

  解释了为什么不推荐使用。因为本文件夹下的内容是内部实现用,不是uvm标准,没有形成文档,未来的uvm版本中有可能删除这些内容,即便是有修改也可能没有相关notice。

◽ uvm_resource_converter.svh

  本文件内的以下class都不推荐使用:

  1. m_uvm_resource_converter
  2. m_uvm_resource_converters
  3. m_uvm_resource_default_convert
  4. m_uvm_resource_convert2string_converter
  5. m_uvm_resource_sprint_converter




◼ 总结




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203161.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午10:27
下一篇 2026年3月19日 下午10:27


相关推荐

  • oracle创建用户并授权

    一、创建用户登录到system用户以创建其他用户创建的:createuserusernameidentifiedbypassword;二、授权在这里插入代码片

    2022年4月3日
    461
  • ROC及AUC计算方法及原理「建议收藏」

    ROC及AUC计算方法及原理「建议收藏」1.非均衡分类问题在大多数情况下不同类别的分类代价并不相等,即将样本分类为正例或反例的代价是不能相提并论的。例如在垃圾邮件过滤中,我们希望重要的邮件永远不要被误判为垃圾邮件,还有在癌症检测中,宁愿误判也不漏判。在这种情况下,仅仅使用分类错误率来度量是不充分的,这样的度量错误掩盖了样例如何被错分的事实。所以,在分类中,当某个类别的重要性高于其他类别时,可以使用Precison和Recall多个比…

    2022年5月13日
    57
  • XR应用场景骤变,一场波及5亿人的新探索开始了「建议收藏」

    XR应用场景骤变,一场波及5亿人的新探索开始了「建议收藏」鱼羊明敏发自凹非寺量子位|公众号QbitAI如果说有什么事可以最快逼疯一个远程办公人,那“线上开会”肯定会得高票。网络卡顿、沟通低效导致会议变得长长长长长……万一碰上出门在外的紧急情况,更是当场抓瞎。这时候,就让人禁不住幻想,要是有副科幻大片同款高端眼镜,一戴上就能随时办公,那感觉可就起飞了。于是,打从元宇宙这股风起,大到国际科技巨头,小到国内初创企业,就没少…

    2022年6月14日
    37
  • golang2022.1 激活吗(注册激活)

    (golang2022.1 激活吗)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~B…

    2022年3月31日
    970
  • js数组对象去重处理

    js数组对象去重处理js 数组对象去重处理 js 的数组去重 是 js 常谈的问题 网上的解决办法很多例如这里边用的先排序的方式再去重的 还有一些 ES6 的方式这里暂不介绍了 下边还是保持 es5 的语法处理数组对象的去重 就像数据里边有歌曲 歌曲去重一样 可能有更加便捷方案 下放这个方案能解燃煤之急 有不足之处希望能指出 共同进步 lt DOCTYPEhtml gt lt html gt lt head gt

    2026年3月17日
    2
  • 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

    2022年10月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号