System verilog SystemVerilog中的分配失败

System verilog SystemVerilog中的分配失败,system-verilog,uvm,System Verilog,Uvm,我编写ldpc_if.sv和ldpc_transaction.sv如下 “ldpc_if.sv” “ldpc_transaction.sv” 我编写ldpc_monitor.sv来监视接口 task ldpc_monitor::collect_one_pkt(ldpc_transaction tr); while(1) begin @(posedge vif.clk); if(vif.en_enq_valid && vif.en_enq_ready) break;

我编写
ldpc_if.sv
ldpc_transaction.sv
如下

“ldpc_if.sv”

“ldpc_transaction.sv”

我编写
ldpc_monitor.sv
来监视接口

task ldpc_monitor::collect_one_pkt(ldpc_transaction tr);
  while(1) begin
  @(posedge vif.clk);
  if(vif.en_enq_valid && vif.en_enq_ready) break;
  end

  tr.encode_data_in <= vif.en_enq_data;

  while(1) begin
    @(posedge vif.clk)
    if(vif.en_deq_valid && vif.en_deq_ready) break;
  end

  tr.encode_data_out <= vif.en_deq_data;

 while(1)begin
   @(posedge vif.clk)
   if(vif.de_deq_valid && vif.de_deq_ready)begin
     break;
   end
 end
 tr.decode_data <= vif.de_deq_data;
 $display("tr.decode_data = %0h", tr.decode_data);
 $display("vif.de_deq_data = %0h", vif.de_deq_data);
endtask
任务ldpc\u监视器::收集一个pkt(ldpc\u事务tr);
而(1)开始
@(posedge vif.clk);
如果(vif.en_enq_有效和&vif.en_enq_就绪)中断;
结束

tr.encode_data_in这是因为用于显示事务的$display被阻塞了。相反,您使用了非阻塞分配来设置tr.decode_数据

因此,$display语句实际上是在赋值之前执行的。得到一个0只是你模拟器的一个假象——可能是内存中分配给该变量的任何随机内容(尽管大多数模拟器只是重置为0)

快速搜索显示了这个有用的示例,它准确地说明了您的问题

class ldpc_transaction#(parameter WIDTH=8192) extends uvm_sequence_item;
  rand bit [WIDTH-1:0] data;

  bit [8191:0]  encode_data_in;
  bit [1023:0]  encode_data_out;

  bit [9215:0]  decode_data;

  `uvm_object_utils(ldpc_transaction)

  function new(string name = "ldpc_transaction");
    super.new();
  endfunction
endclass
task ldpc_monitor::collect_one_pkt(ldpc_transaction tr);
  while(1) begin
  @(posedge vif.clk);
  if(vif.en_enq_valid && vif.en_enq_ready) break;
  end

  tr.encode_data_in <= vif.en_enq_data;

  while(1) begin
    @(posedge vif.clk)
    if(vif.en_deq_valid && vif.en_deq_ready) break;
  end

  tr.encode_data_out <= vif.en_deq_data;

 while(1)begin
   @(posedge vif.clk)
   if(vif.de_deq_valid && vif.de_deq_ready)begin
     break;
   end
 end
 tr.decode_data <= vif.de_deq_data;
 $display("tr.decode_data = %0h", tr.decode_data);
 $display("vif.de_deq_data = %0h", vif.de_deq_data);
endtask