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