Cesium快速入门31: 追踪飞机航班动画
2025/12/24 4:54:32
classapb_rwextends uvm_sequence_item;typedefenum{READ,WRITE}kind_e;rand bit[31:0]addr;rand logic[31:0]data;rand kind_e kind;`uvm_object_utils_begin(apb_rw)`uvm_field_int(addr,UVM_ALL_ON|UVM_NOPACK);`uvm_field_int(data,UVM_ALL_ON|UVM_NOPACK);`uvm_field_enum(kind_e,kind,UVM_ALL_ON|UVM_NOPACK);`uvm_object_utils_end functionnew(string name="apb_rw");super.new(name);endfunction function stringconvert2string();return$sformatf("kind=%s addr=%0h data=%0h",kind,addr,data);endfunction endclass:apb_rwclassinitiatorextends uvm_component;uvm_tlm_b_initiator_socket#(apb_rw)sock;`uvm_component_utils(initiator)functionnew(string name="initiator",uvm_component parent=null);super.new(name,parent);sock=new("sock",this);endfunction//// Execute a simple read-modify-write//virtualtaskrun_phase(uvm_phase phase);apb_rw rw;uvm_tlm_time delay=new;phase.raise_objection(this);rw=apb_rw::type_id::create("rw",,get_full_name());rw.kind=apb_rw::READ;rw.addr=32'h0000_FF00;sock.b_transport(rw,delay);// Ok to reuse the same RW instancerw.kind=apb_rw::WRITE;rw.data=~rw.data;sock.b_transport(rw,delay);phase.drop_objection(this);endtask endclassclasstargetextends uvm_component;local bit[31:0]m_data;uvm_tlm_b_target_socket #(target,apb_rw)sock;`uvm_component_utils(target)functionnew(string name="target",uvm_component parent=null);super.new(name,parent);sock=new("sock",this);m_data=32'hDEADBEEF;endfunction taskb_transport(apb_rw rw,uvm_tlm_time delay);case(rw.addr)32'h0000_FF00:beginif(rw.kind==apb_rw::READ)rw.data=m_data;elsem_data=rw.data;end endcase #5;endtask functionvoidstart_of_simulation_phase(uvm_phase phase);`uvm_info("TRGT/RPT/START",$sformatf("m_data: 'h%h",m_data),UVM_NONE)endfunction functionvoidreport_phase(uvm_phase phase);`uvm_info("TRGT/RPT/FINAL",$sformatf("m_data: 'h%h",m_data),UVM_NONE)endfunction endclassclasstb_envextends uvm_component;`uvm_component_utils(tb_env)initiator master;target slave;functionnew(string name="tb_env",uvm_component parent=null);super.new(name,parent);endfunction functionvoidbuild_phase(uvm_phase phase);master=initiator::type_id::create("master",this);slave=target::type_id::create("slave",this);endfunction functionvoidconnect_phase(uvm_phase phase);master.sock.connect(slave.sock);endfunction endclass import uvm_pkg::*;`include"uvm_macros.svh"`include"apb_rw.sv"`include"initiator.sv"`include"target.sv"`include"tb_env.sv"program tb_run;initial beginstatictb_env env=new("env");run_test();end endprogram----------------------------------------------------------------**