single_read32:
例化seq;ahb侧发送读请求,apb不进行pready翻转的testcase;
seq.start挂在seq到agt的sqr;
class ahbl_mst_single_read32 extends ahb2apb_base_test;
//ahb侧发送读请求,apb不进行pready的翻转;
ahbl_mst_single_read32_seq ahbl_mst_seq_i;
apb_slv_rdy_seq apb_slv_seq_i;
`uvm_component_utils(ahbl_mst_single_read32)
function new(string name,uvm_component parent=null);
super.new(name,parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
ahbl_mst_seq_i = ahbl_mst_single_read32_seq::type_id::create("ahbl_mst_seq_i",this);
apb_slv_seq_i = apb_slv_rdy_seq::type_id::create("apb_slv_seq_i",this);
endfunction
virtual task run_phase(uvm_phase phase);
phase.raise_objection(this);
super.run_phase(phase);
//seq挂载到sqr
#100us;
ahbl_mst_seq_i.start(env_i.ahbl_mst_agt_i.sqr_i);
apb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);
phase.drop_objection(this);
endtask
endclass
ahbl_mst_seqlib:
把所有mst_seq放在了一个文件seqlib里;
mst_single_read32_seq中uvm_do_with中约束hsel=1、htrans=NSEQ、hsize=WORD、hburst=SINGLE、hwrite=0;
class ahbl_mst_basic_seq extends uvm_sequence#(ahbl_tran);
`uvm_object_utils(ahbl_mst_basic_seq)
function new(string name = "ahbl_mst_basic_seq");
super.new(name);
endfunction
virtual task pre_body();
if(starting_phase != null)begin
starting_phase.raise_objection(this);
end
endtask
virtual task post_body();
if(starting_phase != null)begin
starting_phase.drop_objection(this);
end
endtask
endclass
class ahbl_mst_burst_seq extends ahbl_mst_basic_seq;
function new(string name="ahbl_mst_burst_seq");
super.new(name);
endfunction
`uvm_object_utils(ahbl_mst_burst_seq)
virtual task body();
`uvm_do_with(req,{hsel == 1'b1;
//htrans == ahbl_mst_pkg::NSEQ;
// hsize == ahbl_mst_pkg::WORD;
//hburst == ahbl_mst_pkg::SINGLE;
//hwrite == 1'b1;
})
endtask
endclass
class ahbl_mst_single_write32_seq extends ahbl_mst_basic_seq;
function new(string name = "ahbl_mst_single_write32_seq");
super.new(name);
endfunction
`uvm_object_utils(ahbl_mst_single_write32_seq)
virtual task body();
`uvm_do_with(req,{hsel == 1'b1;
htrans == ahbl_mst_pkg::NSEQ;
hsize == ahbl_mst_pkg::WORD;
hburst == ahbl_mst_pkg::SINGLE;
hwrite == 1'b1;})
endtask
endclass
class ahbl_mst_single_read32_seq extends ahbl_mst_basic_seq;
function new(string name="ahbl_mst_single_read32_seq");
super.new(name);
endfunction
`uvm_object_utils(ahbl_mst_single_read32_seq)
virtual task body();
`uvm_do_with(req,{hsel == 1'b1;
htrans == ahbl_mst_pkg::NSEQ;
hsize == ahbl_mst_pkg::WORD;
hburst == ahbl_mst_pkg::SINGLE;
hwrite == 1'b0;})
endtask
endclass
apb_slv_seqlib:
把所有slv_seq放在了一个文件seqlib里;
在apb_slv_rdy_seq中uvm_do_with中约束slverr=0(无错)、nready_num=0(一直准备);
class apb_slv_basic_seq extends uvm_sequence#(apb_tran);
`uvm_object_utils(apb_slv_basic_seq)
function new(string name = "apb_slv_basic_seq");
super.new(name);
endfunction
virtual task pre_body();
if(starting_phase != null)begin
starting_phase.raise_objection(this);
end
endtask
virtual task post_body();
if(starting_phase != null)begin
starting_phase.drop_objection(this);
end
endtask
endclass
class apb_slv_rdy_seq extends apb_slv_basic_seq;
function new(string name = "apb_slv_rdy_seq");
super.new(name);
endfunction
`uvm_object_utils(apb_slv_rdy_seq)
virtual task body();
`uvm_do_with(req,{slverr == 1'b0;
nready_num == 0;})
endtask
endclass
class apb_slv_nrdy_seq extends apb_slv_basic_seq;
function new(string name="apb_slv_nrdy_seq");
super.new(name);
endfunction
`uvm_object_utils(apb_slv_nrdy_seq)
virtual task body();
`uvm_do_with(req,{slverr == 1'b0;
nready_num inside {[1:5]};})
endtask
endclass
class apb_slv_slverr_seq extends apb_slv_basic_seq;
function new(string name = "apb_slv_slverr_seq");
super.new(name);
endfunction
`uvm_object_utils(apb_slv_slverr_seq)
virtual task body();
`uvm_do_with(req,{slverr == 1'b1;
nready_num inside {[1:5]};})
endtask
endclass
single_write32_apb_slv_nrdy:
例化并创建两个seq;ahb侧发送写请求,apb具有pready为0的testcase;
seq.start挂在seq到agt的sqr;
ahbl_mst_seqlib.ahbl_mst_single_write32_seq中uvm_do_with:约束hsel=1、htrans=NSEQ、hsize=WORD、hburst=SINGLE、hwrite=1;
apb_slv_seqlib.apb_slv_nrdy_seq中uvm_do_with:约束slverr=0(无错)、nready_num在1:5之间随机;
class ahbl_mst_single_write32_apb_slv_nrdy extends ahb2apb_base_test;
ahbl_mst_single_write32_seq ahbl_mst_seq_i;
apb_slv_nrdy_seq apb_slv_seq_i;
`uvm_component_utils(ahbl_mst_single_write32_apb_slv_nrdy)
function new(string name,uvm_component parent=null);
super.new(name,parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
ahbl_mst_seq_i = ahbl_mst_single_write32_seq::type_id::create("ahbl_mst_seq_i",this);
apb_slv_seq_i = apb_slv_nrdy_seq::type_id::create("apb_slv_seq_i",this);
endfunction
virtual task run_phase(uvm_phase phase);
phase.raise_objection(this);
super.run_phase(phase);
#100us;
ahbl_mst_seq_i.start(env_i.ahbl_mst_agt_i.sqr_i);
apb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);
phase.drop_objection(this);
endtask
endclass
AHB端第一个周期给地址 、位宽等控制信号,第二个周期给要写入的数据并拉低HRDATAOUT等待;第二个周期APB收到控制信号和要写入的数据,随机将PREADY拉低了PCLK的4个周期后,写入数据;下一个周期HREADYOUT拉高,传输结束;
看波形simvision &