-1

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

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

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
打印检查在输入监视器@时间 = 125

捕获被驱动到 DUT 的接口信号的波形

4

1 回答 1

1

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

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

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

于 2018-03-10T17:18:49.723 回答