这可能是我忽略的一个愚蠢的错误,但我对 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