在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1354|回复: 9

[求助] uvm的重载能否找到成员变量

[复制链接]
发表于 2023-2-5 21:29:30 | 显示全部楼层 |阅读模式

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

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

x
如下的代码是报错的,找不到成员变量在$display("value a is %0d", this.env.a);。但是确实是重载了,因为去掉这个display可以打印base1_test。但是如果需要引用这个变量,该怎么办啊


module aaa ();
    import uvm_pkg::*;
    class base_env extends uvm_env;
        `uvm_component_utils(base_env)

        function new(string name="base_env", uvm_component parent);
            super.new(name, parent);
        endfunction: new

        function void build_phase(uvm_phase phase);
            super.build_phase(phase);
            $display("base_env");
        endfunction: build_phase

        function void connect_phase(uvm_phase phase); endfunction: connect_phase
    endclass: base_env

    class base1_env extends base_env;
        `uvm_component_utils(base1_env)
        int a=10;

        function new(string name="base1_env", uvm_component parent);
            super.new(name, parent);
        endfunction: new

        function void build_phase(uvm_phase phase);
            super.build_phase(phase);
            $display("base1_env");
            $display("a is %0d",a);
        endfunction: build_phase

        function void connect_phase(uvm_phase phase);
        endfunction: connect_phase
    endclass: base1_env
    class base_test extends uvm_test;
        `uvm_component_utils(base_test)
        base_env env;

        function new(string name="base_test", uvm_component parent);
            super.new(name, parent);
        endfunction: new

        function void build_phase(uvm_phase phase);
            super.build_phase(phase);
            env = base_env::type_id::create("env", this);
        endfunction: build_phase

    endclass: base_test

    class base1_test extends base_test;
        `uvm_component_utils(base1_test)

        function new(string name="base1_test", uvm_component parent);
            super.new(name, parent);
        endfunction: new

        function void build_phase(uvm_phase phase);
            // set_inst_override_by_type("env", base_env::get_type(), base1_env::get_type());
            set_type_override_by_type(base_env::get_type(), base1_env::get_type());
            super.build_phase(phase);
        endfunction: build_phase

        function void connect_phase(uvm_phase phase);
            $display("value a is %0d", this.env.a);
        endfunction: connect_phase
    endclass: base1_test

    initial begin
        run_test("base1_test");
    end
endmodule


发表于 2023-2-5 22:11:47 | 显示全部楼层
UVM的重载在仿真阶段生效,在编译阶段工具并不知道,只会去base_env找变量a
 楼主| 发表于 2023-2-6 09:08:58 | 显示全部楼层


miccjiang 发表于 2023-2-5 22:11
UVM的重载在仿真阶段生效,在编译阶段工具并不知道,只会去base_env找变量a


base1_env已经继承了base_env,按道理base1_env里就有这个变量吧,要怎样才能避免这样的问题啊

发表于 2023-2-6 13:54:43 | 显示全部楼层
你把a放到父类base_env里就不报错了
发表于 2023-2-6 19:34:59 | 显示全部楼层
声明env的句柄依然是父类的,你在base1_test里面用base1_env声明一个句柄env1,在打印a之前  加上env1=env   在用env1去找a就能找到了
 楼主| 发表于 2023-2-6 21:38:42 | 显示全部楼层


fengzhiyong123 发表于 2023-2-6 19:34
声明env的句柄依然是父类的,你在base1_test里面用base1_env声明一个句柄env1,在打印a之前  加上env1=env  ...


应该不是这样用,试了一下父类到子类的赋值编译没通过。应该是在base1_env里,定义env1,然后引用base1_env的变量用this.env1、base_env的变量用this.env,这样就可以了。一个case多个环境。
 楼主| 发表于 2023-2-6 21:46:58 | 显示全部楼层


miccjiang 发表于 2023-2-5 22:11
UVM的重载在仿真阶段生效,在编译阶段工具并不知道,只会去base_env找变量a


嗯,应该是路径this.env限制的。在base1_test创建env1,create的名字是env1,其实可以找到env1的变量,也可找到env的变量。
发表于 2023-2-7 09:35:31 | 显示全部楼层


a1872040489 发表于 2023-2-6 21:38
应该不是这样用,试了一下父类到子类的赋值编译没通过。应该是在base1_env里,定义env1,然后引用base1_e ...


我之前说错了,你用$case就可以了
 楼主| 发表于 2023-2-7 21:42:00 | 显示全部楼层


fengzhiyong123 发表于 2023-2-7 09:35
我之前说错了,你用$case就可以了


还是语法错误,找不到base_test里的变量a。感觉是和type_id::create里的字符串绑定了
 楼主| 发表于 2023-9-3 18:10:59 | 显示全部楼层


a1872040489 发表于 2023-2-7 21:42
还是语法错误,找不到base_test里的变量a。感觉是和type_id::create里的字符串绑定了
...


父类转子类之所以不成功,因为一开始就声明和实例化的是父类,那么是不能转换为子类的。因为转换的原则,只有本体(实例化的时候已经是子类)确实可以转化(转换为父类以后再次变成子类),才能转换成功,否则就容易导致兄弟节点相互转化。参阅:https://blog.csdn.net/weixin_42245733/article/details/120205539,似乎只是一个语法上的规定,实现上可以但没必要这么复杂,而且违背了OOP的一些概念。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-23 19:16 , Processed in 0.024790 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表