我有下面的接口和uvm_monitor (run_phase如下所示)。
DUT信号有一段时间是"x“。当我在显示器上打印信号时,它们被捕获为"x“。太棒了。
接下来,DUT信号显示一个有效值(第一次)。当我在显示器上打印信号时,它们会被捕获为有效值。太棒了。
接下来,DUT将所有三个信号更新为下一个值,在时间戳134时,mirror_byte_wr_en 仍为0,但预期为0 0xffff.。
知道吗,为什么?感谢你的想法和投入。
日志的示例输出:
uvm_test_top.m_snp_decomp_env.snpd_egress.m_monitor UVM_INFO snp_decomp_snpd_egress_monitor.sv(65) @ 122: snp_decomp_snpd_egress_monitor mirror_data = 0x00006c61776e694720616669617a7548 uvm_test_top.m_snp_decomp_env.snpd_egress.m_monitor UVM_INFO snp_decomp_snpd_egress_monitor.sv(71) @ 122: snp_decomp_snpd_egress_monitor mirror_byte_wr_en = 0xffff uvm_test_top.m_snp_decomp_env.snpd_egress.m_monitor UVM_INFO snp_decomp_snpd_egress_monitor.sv(76) @ 122: snp_decomp_snpd_egress_monitor mirror_wr_addr = 0x00000 uvm_test_top.m_snp_decomp_env.snpd_egress.m_monitor UVM_INFO snp_decomp_snpd_egress_monitor.sv(65) @ 134: snp_decomp_snpd_egress_monitor mirror_data =0x3c10xxxxxxxxxxxx616c00000000 uvm_test_top.m_snp_decomp_env.snpd_egress.m_monitor UVM_INFO snp_decomp_snpd_egress_monitor.sv(71) @ 134: snp_decomp_snpd_egress_monitor mirror_byte_wr_en = 0x0000 uvm_test_top.m_snp_decomp_env.snpd_egress.m_monitor snp_decomp_snpd_egress_monitor.sv(76) @ 134: UVM_INFO snp_decomp_snpd_egress_monitor mirror_wr_addr = 0x00010
enter code here
task run_phase(uvm_phase phase);
snp_decomp_snpd_egress_transaction tr;
tr = snp_decomp_snpd_egress_transaction ::type_id::create("tr");
forever begin
@(vif.egress.egress_cb);
fork
begin
// @ (vif.egress.egress_cb);
tr.mirror_data = vif.egress.egress_cb.mirror_wr_data;
`uvm_info(get_type_name(),$sformatf("mirror_data = 0x%x\n", vif.egress.egress_cb.mirror_wr_data),UVM_LOW);
end
begin
// @ (vif.egress.egress_cb);
tr.mirror_wr_byte_en = vif.egress.egress_cb.mirror_byte_wr_en;
`uvm_info(get_type_name(),$sformatf("mirror_byte_wr_en = 0x%x\n", vif.egress.egress_cb.mirror_byte_wr_en),UVM_LOW);
end
begin
// @ (vif.egress.egress_cb);
tr.mirror_wr_addr = vif.egress.egress_cb.mirror_wr_addr;
`uvm_info(get_type_name(),$sformatf("mirror_wr_addr = 0x%x\n", vif.egress.egress_cb.mirror_wr_addr),UVM_LOW);
end
join
end
endtask : run_phase
interface snp_decomp_snpd_egress_intf(input logic clock, input logic reset);
logic [127:0] mirror_wr_data;
logic [15:0] mirror_byte_wr_en;
logic [18:0] mirror_wr_addr;
modport DUT (
input clock,
input reset,
output mirror_wr_data,
output mirror_byte_wr_en,
output mirror_wr_addr
); // modport DUT
clocking egress_cb @(posedge clock);
input mirror_wr_data;
input mirror_byte_wr_en;
input mirror_wr_addr;
endclocking: egress_cb
modport egress(clocking egress_cb);
endinterface : snp_decomp_snpd_egress_intf发布于 2018-12-21 11:38:15
这是正确的行为,因为时钟块中的样本值是从前一个时钟周期中提取的。它依赖于SystemVerilog的时间步长语义。
begin
@(vif.egress.egress_cb);
`uvm_info(get_type_name(), $sformatf("mirror_byte_wr_en: value from previous cycle - 'h%0h, value from current cycle - 'h%0h",
vif.egress.egress_cb.mirror_byte_wr_en, vif.egress.mirror_byte_wr_en), UVM_LOW)
end为了充分理解- LRM 14.13。向你问好马克西姆。
https://stackoverflow.com/questions/52921811
复制相似问题