【问题标题】:Unable to exit while loop in UVM monitor在 UVM 监视器中无法退出 while 循环
【发布时间】:2018-03-10 00:53:26
【问题描述】:

这可能是我忽略的一个愚蠢的错误,但我对 UVM 还很陌生,在此之前我曾尝试修改我的代码一段时间。我正在尝试使用数据有效停止协议从我的 UVM 驱动程序向 DUT 发送数据包中的 8 位数据流。我遇到了一个问题,我的输入监视器无法接收这些被驱动的事务。

我有一个 while 循环,其条件是有效位必须为高,而停顿位应为低。只要这个条件成立,监视器就需要拾取数据字节并推入队列。我知道在我使用$display 语句的过程中,数据正在被提取并推送到队列中。一旦接收到所有数据字节并且有效位变低,就会出现问题。理想情况下,这应该会导致退出 while 循环,但不会这样做。这里的任何帮助将不胜感激。我附上了下面代码的sn-p。提前致谢。

virtual task main_phase (uvm_phase phase);

   $display("Run phase of input monitor");

    collect_transfer();

endtask: main_phase


virtual task collect_transfer();

    fork

        forever begin

            wait_for_valid_transaction_cycle();

            create_and_populate_pkt();

            broadcast_pkt();

            @(iP0_vif.cb_iP0_MON);

        end

    join_none

endtask: collect_transfer


virtual task wait_for_valid_transaction_cycle();

    wait(iP0_vif.cb_iP0_MON.ip_valid && ~iP0_vif.cb_iP0_MON.ip_stall);

endtask: wait_for_valid_transaction_cycle


virtual task create_and_populate_pkt();

    pkt = Router_seq_item :: type_id :: create("pkt");

    pkt.valid = iP0_vif.cb_iP0_MON.ip_valid;

    pkt.sop = iP0_vif.cb_iP0_MON.ip_sop;

    $display("before data collection");

    while(iP0_vif.cb_iP0_MON.ip_valid === `HIGH && iP0_vif.cb_iP0_MON.ip_stall === `LOW) begin

            $display("After checking for stall");

            pkt.data = iP0_vif.cb_iP0_MON.ip_data;

            $display(pkt.data);

            pkt.data_q.push_front(pkt.data);

            pkt.eop = iP0_vif.cb_iP0_MON.ip_eop;

            $display("print check in input monitor @ time = %0t", $time);

            @(iP0_vif.cb_iP0_MON);

    end

    $display("before printing input packet from monitor");

    Check_for_port_route_and_populate_packet_field(pkt);

    print_packet(pkt);

 endtask: create_and_populate_pkt

$display 语句“在从监视器打印输入数据包之前”未显示。

HIGH定义为二进制1,LOW定义为二进制0。

显示语句方面的代码输出如下。

数据收集前
在检查失速之前
检查摊位后
2
在输入监视器中打印检查 @ time = 105
在检查失速之前
检查摊位后
1
在输入监视器中打印检查 @ time = 115
在检查失速之前
检查摊位后
3
在输入监视器中打印检查@ time = 125

【问题讨论】:

  • 是否仍然使用valid && !stall 锁定而不是使用HIGH 和LOW?
  • 嗨@TudorTimi。我让它再次工作!这是一个反对意见没有被记入记分牌的问题。感谢您的帮助。

标签: while-loop system-verilog uvm test-bench


【解决方案1】:

您的环境中的其他地方可能会删除主要阶段的反对意见。 UVM 将在其结束时自动终止在某个阶段产生的任何线程。

要解决此问题,请不要反对显示器中的主要阶段。反对该阶段是创建刺激的线程的责任。相反,您应该在 run_phase 期间启动此监视器,这将确保您的循环在模拟结束之前不会被终止。

此外,在关机阶段,您会希望监视器在当前看到数据包时进行反对。这将确保模拟不会在发送刺激后立即结束,从而让您的其他监视器有时间从 DUT 收集响应。

【讨论】:

  • 嗨@Brian,你是对的!这是因为反对意见没有被记入记分牌。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多