ET创芯网论坛(EETOP)

找回密码

  登录   注册  

电动/混动汽车、48V系统、汽车功能安全等技术资料合集
查看: 195|回复: 18

[解决] 寄存器模型执行read/write会死循环。

[复制链接]
发表于 2019-8-26 17:38:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 桅杆 于 2019-8-30 14:09 编辑

仿照《UVM实战》,搭建了一个一样的寄存器模型,在执行 read/write 时都会进入到某个死循环中。单步调试发现是死在uvm_reg.svh中的,由于调用递归太多,没法精确定位。不知道哪里的设置会导致这种情况。

不知道都大家有没有遇见类似的问题。希望能指教一下。

导致死循环的代码如下:read,  write
123111.png
发表于 2019-8-26 20:31:00 | 显示全部楼层
卡在这里面,一般是卡在了driver里,可以看看哪里有等待,或者0循环的while
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-26 20:40:48 | 显示全部楼层


   
851018986 发表于 2019-8-26 20:31
卡在这里面,一般是卡在了driver里,可以看看哪里有等待,或者0循环的while
...


这方面做过检查了。别的代码不动,只注释掉read 和 write, 程序是可以正常跑完的。应该不是别的地方的原因吧?
回复 支持 反对

使用道具 举报

发表于 2019-8-27 09:17:18 | 显示全部楼层
单步 write 可以进行不 ? 这
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-27 10:53:45 | 显示全部楼层


   
诸葛小天 发表于 2019-8-27 09:17
单步 write 可以进行不 ? 这


单独write也是会死掉的。单步看的话会跳入头文件里。定位到了是死在了 base/uvm_phase.svh 中, line 128. 代码如下: 111.png
所以应该是死在某个phase中了。怎样的设置会导致在read/write中出现这种情况呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-27 13:36:27 | 显示全部楼层
自己又写个简单的结构,跑出来还是死掉,请大家指点一下。代码如下, vcs下编译可以通过,命名有点没章法,见谅.
//`timescale 1ns/100ps
`include "uvm_macros.svh"
import uvm_pkg::*;

class test extends uvm_reg;
    rand uvm_reg_field data;
    virtual function void build();
        data = uvm_reg_field::type_id::create("data");
        data.configure(this,1,0,"RW",1,0,1,1,0 );
    endfunction
    `uvm_object_utils( test )
    function new( input string name="test" );
        super.new( name,16,UVM_NO_COVERAGE );   
    endfunction
endclass
class reg_model extends uvm_reg_block;
    rand test test_0;
    virtual function void build();
        default_map = create_map("default_map",0,2,UVM_BIG_ENDIAN,0);
        test_0 = test::type_id::create("test_0", , get_full_name());
        test_0.configure( this, null, "test_0" );
        test_0.build();
        default_map.add_reg( test_0, 'h9, "RW" );
    endfunction
    `uvm_object_utils(reg_model)
    function new( input string name="reg_model" );
        super.new( name, UVM_NO_COVERAGE );
    endfunction
endclass

class A extends uvm_sequencer;
    reg_model rm;
    `uvm_component_utils( A )
    function new( string name="A", uvm_component parent );
        super.new( name );//, parent );
    endfunction
    virtual task configure_phase( uvm_phase phase );
        super.configure_phase( phase );
        $display("???????????????????? 11");
    endtask
    virtual task main_phase( uvm_phase phase );
        uvm_status_e  st;
        uvm_reg_data_t value;
        super.main_phase( phase );
        phase.raise_objection( this );
        $display("????????????????????");
        rm.test_0.read( st, value, UVM_FRONTDOOR );
        $display("!!!!!!!!!!!!!!!!!!!!");
        $display("hhhhhhhhhhhhhhhhhhh value is %d", value);
        phase.drop_objection( this );
    endtask
endclass
class sqrrr extends uvm_sequence ;
    `uvm_object_utils( sqrrr )
    function new( string name="sqrrr" );
        super.new( name );
    endfunction
   virtual task body();
        if( starting_phase != null )
            starting_phase.raise_objection( this );
        $display("here ?? ");
        #2000;
        if( starting_phase != null )
            starting_phase.drop_objection( this );
    endtask  
endclass
class adapter extends uvm_reg_adapter;
    function new( string name );
        super.new( name );
    endfunction
    function uvm_sequence_item reg2bus( const ref uvm_reg_bus_op rw );
        uvm_sequence_item tr;
        tr = new("tr");
        return tr;
    endfunction
    function void bus2reg ( uvm_sequence_item bus_item, ref uvm_reg_bus_op rw );
    endfunction
endclass
class case0 extends uvm_test;
    A test;
    reg_model rm;
    adapter adp;
    `uvm_component_utils( case0 );
    function new( string name = "case0", uvm_component parent = null );
        super.new( name, parent );
    endfunction
    function void build_phase( uvm_phase phase );
        adp = new("adper");
        test = A::type_id::create("test",this);
        rm = reg_model::type_id::create("rm",this);
        rm.configure(null,"");
        rm.build();
        rm.lock_model();
        rm.reset();
        rm.default_map.set_sequencer( test , adp );
        rm.default_map.set_auto_predict( 1 );
        test.rm = this.rm;
        super.build_phase( phase );
        //test = A::type_id::create("test",this);
        uvm_config_db #( uvm_object_wrapper )::set( this,
                                                    "test.main_phase",
                                                    "default_sequence",
                                                     sqrrr::type_id::get());
        $display("here ?? ");
    endfunction

endclass

module aaa;

//    test = new("test",null);
    initial begin
       run_test( "case0" );
        #1000;
//        $finish();
    end

endmodule


回复 支持 反对

使用道具 举报

发表于 2019-8-27 15:04:35 | 显示全部楼层
是不是interface 连接的时钟出问题了, drv没有时钟
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-27 15:09:45 | 显示全部楼层


   
诸葛小天 发表于 2019-8-27 15:04
是不是interface 连接的时钟出问题了, drv没有时钟


不是的。在加入reg_model的各个组件之前其它模块都是可以正常跑。
回复 支持 反对

使用道具 举报

发表于 2019-8-28 10:14:53 | 显示全部楼层


   
桅杆 发表于 2019-8-27 13:36
自己又写个简单的结构,跑出来还是死掉,请大家指点一下。代码如下, vcs下编译可以通过,命名有点没章法, ...


adapter需要和ral 连接起来
例如:  ral.default_map.set_sequencer(this.uprx_agt.sci_sqr,adapter);

而且你的平台好奇怪,UVM树的层次需要很清晰,才能通过路径去做一些复杂的操作



回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-28 10:28:06 | 显示全部楼层


   
诸葛小天 发表于 2019-8-28 10:14
adapter需要和ral 连接起来
例如:  ral.default_map.set_sequencer(this.uprx_agt.sci_sqr,adapter);


上面的代码是为了方便debug另外写的,只为了看reg_modle的read/write 操作,组件上只有一个sequencer。
现象跟我的验证环境一样,也是有read/write 就死掉了。没有就可以正常跑完。现在没法断定是不是我环境的原因。
编译指令是:  vcs -full64 -sverilog -ntb_opts uvm-1.1 file_name.sv

你提到的 "default_map.set_sequencer", 上面代码中的有这一步操作的。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|联系我们|ET创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2019-9-16 00:51 , Processed in 0.069378 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表