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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10787|回复: 16

[求助] uvm中如何传递信号

[复制链接]
发表于 2011-10-10 18:05:26 | 显示全部楼层 |阅读模式

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

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

x
比如我定义的interface 是:mpc_if
在tb_top里写:

mpc_if cpu_if();

uvm_config_db#(virtual mpc_if)::set(uvm_root::get(), "*", "m_mpc_if", cpu_if)

在需要的类里:

在build_phase函数里:

uvm_config_db#(virtual mpc_if)::get(this, "", "m_mpc_if", m_mpc_if);

但是我发现在tb_top定义的信号都传不进去。。。高手看看有什么地方可能有问题?

谢谢!
 楼主| 发表于 2011-10-10 18:14:02 | 显示全部楼层
driver是这样定义的:

`ifndef _MPC_DRIVER_SV_
`define _MPC_DRIVER_SV_

class mpc_driver extends uvm_driver #(mpc_transaction) ;

        `uvm_component_utils(mpc_driver)
       
        protected virtual mpc_if m_mpc_if ;
       
        //new -- constructor
        function new(string name = "mpc_driver_inst", uvm_component parent) ;
                super.new(name, parent) ;
                `uvm_info("dirver", "Called mpc_driver::new", UVM_NONE) ;
        endfunction : new
       
        virtual function void build_phase(uvm_phase phase) ;
                super.build_phase(phase) ;
                if(!uvm_config_db#(virtual mpc_if)::get(this, "", "m_mpc_if", m_mpc_if))
       `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".m_mpc_if"});
        endfunction : build_phase
       
        //run phase
        virtual task run_phase(uvm_phase phase) ;               
                get_and_drive() ;
                `uvm_info("dirver", "Called mpc_driver::run_phase", UVM_NONE) ;
        endtask : run_phase
       
        //get and drive
        virtual protected task get_and_drive() ;
                forever begin
                        @(posedge m_mpc_if.clk);
                        `uvm_info("dirver", "clock is ok!", UVM_NONE) ;
      seq_item_port.get_next_item(req);
      $cast(rsp, req.clone());
      rsp.set_id_info(req);
      drive_transaction(rsp);
      seq_item_port.item_done();
      seq_item_port.put_response(rsp);
                end
        endtask : get_and_drive
       
        //drive transaction
        virtual protected task drive_transaction(mpc_transaction trans) ;
                `uvm_info("dirver", "Called mpc_driver::drive_transaction", UVM_NONE) ;
                case(trans.read_write)
                        NOP   : nop() ;
                        READ  : read_word(trans.addr, trans.data) ;
                        WRITE : write_word(trans.addr, trans.data) ;
                endcase
                @(posedge m_mpc_if.clk) ;
                nop() ;
        endtask : drive_transaction
       
        // bus idle
        virtual protected task nop() ;
                m_mpc_if.csn  <= 'b1 ;
                m_mpc_if.wr   <= 'b0 ;
                m_mpc_if.rd   <= 'b0 ;
                m_mpc_if.addr <= 'bz ;
                m_mpc_if.din  <= 'bz ;
                m_mpc_if.dout <= 'bz ;
        endtask : nop
       
        // read one word
        virtual protected task read_word(bit [31:0] addr, output bit [31:0] data) ;
                m_mpc_if.csn  <= 'b0 ;
                m_mpc_if.wr   <= 'b0 ;
                m_mpc_if.rd   <= 'b1 ;
                m_mpc_if.addr <= addr ;
                @(posedge m_mpc_if.clk iff m_mpc_if.tan === 'b1);
                //data <= m_mpc_if.dout ;
        endtask : read_word
       
        // write one word
        virtual protected task write_word(bit [31:0] addr, bit [31:0] data) ;
                m_mpc_if.csn  <= 'b0 ;
                m_mpc_if.wr   <= 'b1 ;
                m_mpc_if.rd   <= 'b0 ;
                m_mpc_if.addr <= addr ;
                m_mpc_if.din  <= data ;
                @(posedge m_mpc_if.clk iff m_mpc_if.tan === 'b1);
        endtask : write_word
       
endclass : mpc_driver

`endif
发表于 2011-10-10 22:14:18 | 显示全部楼层
仿真报什么错呢?
 楼主| 发表于 2011-10-11 09:36:38 | 显示全部楼层
仿真没报错,但是这句`uvm_info("dirver", "clock is ok!", UVM_NONE) ;
应该有打印信息的,没看到。
发表于 2011-10-11 12:06:03 | 显示全部楼层
检查一下DRIVER的虚接口有没有实体注册,建议采用mentor公司示范代码的方法是用一个专门的uvm_object来管理接口和变量
 楼主| 发表于 2011-10-11 14:34:11 | 显示全部楼层


如何做呢?

现在看来是clk传不进去,在driver里可以改变其他信号的值,不知道为什么clk在driver里无效。。
 楼主| 发表于 2011-10-11 14:55:18 | 显示全部楼层
现在发现时运行时间太短了。很快就运行到run_test的$finish这条语句了,我怎么样才能让它运行时间长一点呢?
发表于 2011-10-11 16:14:41 | 显示全部楼层
应该是传进去了, 你可以通过GUI 窗口看看有没有连好.

还有, 你可以单步执行, 看看怎么跑的.

看看protect类型是不是有问题.
发表于 2011-10-11 19:38:18 | 显示全部楼层


现在发现时运行时间太短了。很快就运行到run_test的$finish这条语句了,我怎么样才能让它运行时间长一点呢? ...
rice973 发表于 2011-10-11 14:55



在你的测试类里的run_test(uvm_phase phase)中添加phase.raise_objection(this);
#1000;
phase.drop_objection(this);
发表于 2011-10-13 16:26:26 | 显示全部楼层
受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-15 12:18 , Processed in 0.023252 second(s), 7 queries , Gzip On, Redis On.

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