AHB-to-APB Bridge——07single_read32、mst_seqlib、slv_seqlib、single_write32_apb_slv_nrdy

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 &

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值