uvm1.1从test设置uvm_config_db sequence到main_phase default_sequence时报告错误

本文分析了UVM环境中driver和sequencer连接问题,指出即使内部包含seq_item_port和seq_item_export,也需要手动连接。修改后的代码解决了这个问题。另外,探讨了在start_of_simulation_phase中检查资源配置可能导致的CFGNRD现象,解释了默认_sequence未启动时的影响,并提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象1描述:

UVM_INFO @ 0: reporter [UVMTOP] UVM testbench topology:

Name                   Type                    Size  Value
uvm_test_top           sw_case0                -     @463 
sw_env                 switch_env              -     @471   
agt_i                  sw_agent                -     @479 
  drv                  sw_driver               -     @622 
    rsp_port           uvm_analysis_port       -     @639 
    seq_item_port      uvm_seq_item_pull_port  -     @630 
  mon                  sw_monitor              -     @648 
    mon_ap             uvm_analysis_port       -     @658 
  sqr                  sw_sequencer            -     @499 
    rsp_export         uvm_analysis_export     -     @507 
    seq_item_export    uvm_seq_item_pull_imp   -     @613 
    arbitration_queue  array                   0     -    
    lock_queue         array                   0     -    
    num_last_reqs      integral                32    'd1  
    num_last_rsps      integral                32    'd1  
agt_o                  sw_agent                -     @487 
  mon                  sw_monitor              -     @799 
    mon_ap             uvm_analysis_port       -     @808 
  sqr                  sw_sequencer            -     @676 
    rsp_export         uvm_analysis_export     -     @684 
    seq_item_export    uvm_seq_item_pull_imp   -     @790 
    arbitration_queue  array                   0     -    
    lock_queue         array                   0     -    
    num_last_reqs      integral                32    'd1  
    num_last_rsps      integral                32    'd1  

UVM_ERROR …/tc/sw_sequence0.sv(15) @ 0: uvm_test_top.sw_env.agt_i.sqr@@seq0 [SW_SEQ0] starting phase is null
Total errors:1

问题1分析:

sw_agent原始代码

function void sw_agent::connect_phase(uvm_phase phase);
super.connect_phase(phase);
mon_ap = mon.mon_ap;
endfunction

修改后代码

function void sw_agent::connect_phase(uvm_phase phase);
super.connect_phase(phase);
if (is_active==UVM_ACTIVE) begin
    drv.seq_item_port.connect(sqr.seq_item_export);
end
mon_ap = mon.mon_ap;
endfunction

原因

driver和 squencer虽然内置了seq_item_port和seq_item_export,但不会自动连接,影响到了sqr下面的seq0.

现象2描述:

UVM_INFO @ 0: uvm_test_top.sw_env [CFGNRD] ::: The following resources have at least one write and no reads :::
default_sequence [/^uvm_test_top.sw_env.agt_i.sqr.main_phase$/] : (class uvm_pkg::uvm_object_wrapper) ?
但是 seq里面的transaction还是传到了drv。

问题2分析:

这个时候default_sequence还没有启动,所以写了一次,还没被读,如果加上了延时,或者在run_phase之后调用,那么就不会产生任何信息。
跟在start_of_simulation_phase中进行检查有关,如下

function void switch_env::start_of_simulation_phase(uvm_phase phase);
super.start_of_simulation_phase(phase);
uvm_top.print_topology();
check_config_usage();
endfunction

放在 base_test的main_phase/report_phase中进行检查,则没有 CFGNRD。

<think>好的,我现在需要解决用户关于UVM配置数据库中default_sequence用法的问题。首先,用户可能想知道如何在UVM中正确设置default_sequence,以及相关的示例代码。我需要回忆UVM的相关知识,并结合提供的引用内容来组织答案。 根据引用[2],UVMtestbench由uvm_component派生类构成,这些组件在仿真期间一直存在。而sequence属于动态创建的对象,所以使用配置数据库来设置default_sequence是常见做法。引用[4]提到宏的使用,可能涉及到`uvm_do宏或者`uvm_config_db的相关宏,比如`uvm_config_db::set`。 首先,应该解释default_sequence的基本概念,它是如何通过配置数据库在testbench层次结构中传递的。然后给出具体的示例代码,说明如何在test设置default_sequence,可能包括使用`uvm_config_db::set`方法,并指定sequencer的路径。 接着,需要注意设置default_sequence机,通常在build_phase中进行配置。然后,可能需要提到常见的错误,比如路径不正确或phase错误,导致sequence没有被正确启动。 另外,引用[3]讨论了接口和类的多重继承,虽然与default_sequence直接关联不大,但可能侧面说明UVM组件的灵活性和配置的重要性。而引用[1]提供的示例项目可能包含实际代码,可以用来参考具体用法。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何动态替换sequence、配置数据库的优先级问题,或者如何处理多sequencer的情况。需要确保问题覆盖常见的使用场景和潜在问题。</think>### UVM配置数据库中default_sequence的用法详解 在UVM框架中,`default_sequence`用于通过配置数据库(Configuration Database)动态指定某个sequencer在仿真期间运行的默认sequence。以下是具体用法和示例: --- #### 1. **基本语法与配置方法** 通过`uvm_config_db`设置`default_sequence`需指定以下参数: - **路径**:目标sequencer的层次路径(通常为`uvm_root::get().find("*.env.agent.sequencer")`或相对路径) - **字段名**:`"default_sequence"` - **值**:要启动的sequence类型(通过`::type_id::create()`创建) **示例代码**: ```systemverilog // 在测试用例(uvm_test)的build_phase中配置 virtual function void build_phase(uvm_phase phase); super.build_phase(phase); uvm_config_db#(uvm_object_wrapper)::set( this, // 当前上下文 "env.agent.sequencer.main_phase", // 目标路径 "default_sequence", // 字段名 my_sequence::get_type() // 要启动的sequence类型 ); endfunction ``` --- #### 2. **关键注意事项** - **作用域与路径** 路径需准确指向目标sequencer的`<phase>`(如`main_phase`)。若路径错误sequence将无法启动[^2]。 - **Phase绑定** `default_sequence`通常在`build_phase`或`connect_phase`中设置,确保在仿真开始前完成配置[^2]。 - **动态替换** 可通过不同测试用例覆盖配置,实现不同场景的sequence动态切换。 --- #### 3. **常见问题与调试** - **问题1Sequence未启动** **原因**:路径错误phase不匹配。 **解决**:使用`uvm_root::get().print_topology()`打印层次结构,验证路径[^1]。 - **问题2:配置冲突** **原因**:多个配置项优先级冲突。 **解决**:UVM配置数据库遵循“最后写入优先”规则,需检查配置顺序[^4]。 --- #### 4. **完整示例** **Step 1** 定义Sequence: ```systemverilog class my_sequence extends uvm_sequence#(my_transaction); `uvm_object_utils(my_sequence) task body(); // 生成并发送transaction `uvm_do(req) endtask endclass ``` **Step 2** 在Test中配置: ```systemverilog class my_test extends uvm_test; `uvm_component_utils(my_test) virtual function void build_phase(uvm_phase phase); super.build_phase(phase); uvm_config_db#(uvm_object_wrapper)::set( this, "env.agent.sequencer.main_phase", "default_sequence", my_sequence::get_type() ); endfunction endclass ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值