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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 600|回复: 10

[求助] 关于在agent中例化多个sqr,drv中例化多个seq_item_port,seq传输出错问题的求助

[复制链接]
发表于 2025-5-22 17:38:35 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 spike_1110 于 2025-5-27 17:19 编辑

我的代码如下:
driver中:

                begin
                    @`AXI_DRV_CB;
                    `uvm_info("DEBUG", $sformatf("r_addr(), r_done = %0d", r_done), UVM_DEBUG)
                    if(r_done) begin
                        r_done = 0;
                        seq_item_port2.get_next_item(req);
                        `uvm_info(get_name(), "Read Packet received in master driver", UVM_LOW)
                        if(!$cast(r_trans, req)) begin
                            `uvm_fatal(get_name(), "req type error")
                        end
                        r_trans.print();
                        send_read_address();
                        seq_item_port2.put_response(r_trans);
                        seq_item_port2.item_done();
                        r_done = 1;
                    end
                end
agent中:

                               
登录/注册后可看大图

报错如下:

                               
登录/注册后可看大图

显示在agent中82行处,seq_item_port2被使用过,但我之前并没有使用,求指教怎么解决该问题。


文字长度受限,部分放上代码。
 楼主| 发表于 2025-5-22 17:42:43 | 显示全部楼层
            fork
                begin
                    axi_xaction item;
                    @`AXI_DRV_CB;
                    `uvm_info("DEBUG", $sformatf("w_addr(), w_done = %0d", w_done), UVM_DEBUG)
                    if(w_done && (seq_item_port.has_do_available())) begin
                        w_done = 0;
                        seq_item_port.get_next_item(req);
                        if(!$cast(w_trans, req)) begin
                            `uvm_fatal(get_name(), "req type error")
                        end
                        `uvm_info(get_name(), "Write Packet received in master driver", UVM_LOW)
                        w_trans.print();
                        fork
                            send_write_address();
                            send_write_data();
                        join
                        void'($cast(item, w_trans.clone()));
                        foreach(tx_port_w[i]) begin
                            tx_port_w[i].write(item);
                        end
                        seq_item_port.put_response(w_trans);
                        seq_item_port.item_done();
                        w_done = 1;
                    end
                end
                begin
                    @`AXI_DRV_CB;
                    `uvm_info("DEBUG", $sformatf("r_addr(), r_done = %0d", r_done), UVM_DEBUG)
                    if(r_done) begin
                        r_done = 0;
                        seq_item_port2.get_next_item(req);
                        `uvm_info(get_name(), "Read Packet received in master driver", UVM_LOW)
                        if(!$cast(r_trans, req)) begin
                            `uvm_fatal(get_name(), "req type error")
                        end
                        r_trans.print();
                        send_read_address();
                        seq_item_port2.put_response(r_trans);
                        seq_item_port2.item_done();
                        r_done = 1;
                    end
                end
            //--join_none
            join
 楼主| 发表于 2025-5-23 09:41:16 | 显示全部楼层
为什么不使用virtual sequencer?
答:vritual sequencer使用一般为多agent场景下使用。
该场景为单agent场景,在driver中,通过fork join实现多个seq_item_port并行获取seqence,seq_item_port通过相对应的task实现不同的操作,在这个driver中,目的是实现write和read的并行操作。
发表于 2025-5-23 14:11:10 | 显示全部楼层
你这个是没有实例化吧?
 楼主| 发表于 2025-5-23 15:19:02 | 显示全部楼层


snoow 发表于 2025-5-23 14:11
你这个是没有实例化吧?


seq_item_port2在driver的build_phase中例化了,r_seq在agent的build_phase中例化了。
 楼主| 发表于 2025-5-26 10:02:19 | 显示全部楼层
思路如下:
driver的run_phase中:
fork
    while(1) begin
        @(posedge clk);
        seq_item_port.get_next_item(req);
        task_to_do();
    end
    while(1) begin
        @(posedge clk);
        seq_item_port2.get_next_item(req);
        task_to_do2();
    end
join

agent中,例化两个sqr,分别为sqr和sqr2,分别与driver的seq_item_port和seq_item_port2相连,如下:
connect_phase:
    drv.seq_item_port.connect(sqr.seq_item_export);
    drv.seq_item_port2.connect(sqr2.seq_item_export);


在seq_item_port2连接出报错
发表于 2025-5-26 13:13:39 | 显示全部楼层
例化 seq_item_port2 的代码呢?
 楼主| 发表于 2025-5-26 14:43:51 | 显示全部楼层


veryIC 发表于 2025-5-26 13:13
例化 seq_item_port2 的代码呢?


seq_item_port2的例化代码在build_phase()里面,代码未附上。
发表于 2025-5-26 15:59:13 | 显示全部楼层


spike_1110 发表于 2025-5-26 14:43
seq_item_port2的例化代码在build_phase()里面,代码未附上。


没有完整的代码,别人想帮你也很难
 楼主| 发表于 2025-5-26 16:41:37 | 显示全部楼层


veryIC 发表于 2025-5-26 15:59
没有完整的代码,别人想帮你也很难


driver中:
function void axi_driver::build_phase(uvm_phase phase);
    super.build_phase(phase);
    seq_item_port2 = new("seq_item_port2", this);
endfunction

task axi_driver::drive();
    fork
        while(cfg.vip_en) begin
            if(cfg.drv_en) begin
                axi_xaction item;
                @`AXI_DRV_CB;
                `uvm_info("DEBUG", $sformatf("w_addr(), w_done = %0d", w_done), UVM_DEBUG)
                if(w_done && (seq_item_port.has_do_available())) begin
                    w_done = 0;
                    seq_item_port.get_next_item(req);
                    if(!$cast(w_trans, req)) begin
                        `uvm_fatal(get_name(), "req type error")
                    end
                    `uvm_info(get_name(), "Write Packet received in master driver", UVM_LOW)
                    w_trans.print();
                    fork
                        send_write_address();
                        send_write_data();
                    join
                    void'($cast(item, w_trans.clone()));
                    item.set_sequence_id(item.id);
                    foreach(tx_port_w) begin
                        tx_port_w.write(item);
                    end
                    seq_item_port.put_response(w_trans);
                    seq_item_port.item_done();
                    w_done = 1;
                end
            end else begin
                @`AXI_DRV_CB;
            end
        end
        while(cfg.vip_en) begin
            if(cfg.drv_en) begin
                @`AXI_DRV_CB;
                `uvm_info("DEBUG", $sformatf("r_addr(), r_done = %0d", r_done), UVM_DEBUG)
                if(r_done) begin
                    r_done = 0;
                    seq_item_port2.get_next_item(req);
                    `uvm_info(get_name(), "Read Packet received in master driver", UVM_LOW)
                    if(!$cast(r_trans, req)) begin
                        `uvm_fatal(get_name(), "req type error")
                    end
                    r_trans.print();
                    send_read_address();
                    seq_item_port2.put_response(r_trans);
                    seq_item_port2.item_done();
                    r_done = 1;
                end
            end else begin
                @`AXI_DRV_CB;
            end
        end
    join
endtask

agent中:
function void axi_agent::build_phase(uvm_phase phase);
    super.build_phase(phase);
    //for read sequencer
    r_sqr = uvm_sequencer #(uvm_sequence_item)::type_id::create("r_sqr", this);
endfunction

function void axi_agent::connect_phase(uvm_phase phase);
    super.connect_phase(phase);
    //for read sequencer
    m_drv.seq_item_port2.connect(r_sqr.seq_item_export);
endfunction



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

本版积分规则

关闭

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

X

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

GMT+8, 2025-6-26 07:41 , Processed in 0.036724 second(s), 8 queries , Gzip On, MemCached On.

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