IC验证学习笔记(AHB-RAM)03更新ahb_driver

更新driver的run_phase以及get_and_drive任务:

task run_phase(uvm_phase phase);
    super.run_phase(phase);
    fork
     get_and_drive();
     reset_listener();
    join_none
  endtask

  virtual task get_and_drive();
    forever begin
      seq_item_port.get_next_item(req);
      `uvm_info(get_type_name(), "sequencer got next item", UVM_HIGH)
      drive_transfer(req);
      void'($cast(rsp, req.clone()));
      rsp.set_sequence_id(req.get_sequence_id());
      rsp.set_transaction_id(req.get_transaction_id());
      seq_item_port.item_done(rsp);
      `uvm_info(get_type_name(), "sequencer item_done_triggered", UVM_HIGH)
    end
  endtask : get_and_drive

  virtual task drive_transfer(REQ t);
    // TODO implementation in child class 在子类实现
  endtask

  virtual task reset_listener();
    // TODO implementation in child class
  endtask

 在ahb_if中定义一些enum的debug方便我们后续观察:

  response_type_enum                      debug_hresp;
  trans_type_enum                         debug_htrans;
  burst_size_enum                         debug_hsize;
  burst_type_enum                         debug_hburst;
  xact_type_enum                          debug_xact;
  status_enum                             debug_status;

  // debug signals assignment
  assign debug_hresp    = response_type_enum'(hresp);
  assign debug_htrans   = trans_type_enum'(htrans);
  assign debug_hsize    = burst_size_enum'(hsize);
  assign debug_hburst   = burst_type_enum'(hburst);
  // the below signals to be assigned by monitor
  // debug_xact ..
  // debug_status ..

以及ahb_if 中的时钟块:

  clocking cb_mst @(posedge hclk);
    // USER: Add clocking block detail
    default input #1ps output #1ps;
    output haddr, hburst, hbusreq, hlock, hprot, hsize, htrans, hwdata, hwrite; 
    input hready, hgrant, hrdata;
  endclocking : cb_mst

  clocking cb_slv @(posedge hclk);
   // USER: Add clocking block detail
    default input #1ps output #1ps;
    input haddr, hburst, hbusreq, hlock, hprot, hsize, htrans, hwdata, hwrite; 
    output hready, hgrant, hrdata;
  endclocking : cb_slv

  clocking cb_mon @(posedge hclk);
   // USER: Add clocking block detail
    default input #1ps output #1ps;
    input haddr, hburst, hbusreq, hlock, hprot, hsize, htrans, hwdata, hwrite; 
    input hready, hgrant, hrdata;
  endclocking : cb_mon

子类master_driver:

父类get and drive的drive_transfer在master_driver中实现

先判断传输类型(只有SINGLE),再判断read或write实现对应读写任务

`ifndef LVC_AHB_MASTER_DRIVER_SV
`define LVC_AHB_MASTER_DRIVER_SV

class lvc_ahb_master_driver extends lvc_ahb_driver;
  lvc_ahb_agent_configuration cfg;
  virtual lvc_ahb_if vif;
  `uvm_component_utils(lvc_ahb_master_driver)

  function new(string name = "lvc_ahb_master_driver", uvm_component parent = null);
    super.new(name, parent);
  endfunction

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
  endfunction

  function void connect_phase(uvm_phase phase);
    super.connect_phase(phase);
  endfunction

  task run_phase(uvm_phase phase);
    super.run_phase(phase);
  endtask

  virtual task drive_transfer(REQ t);
    // TODO implementation in child class
    case(t.burst_type)
      SINGLE: begin do_atomic_trans(t); end
      INCR  : begin `uvm_error("TYPEERR", "burst type not supported yet") end
      WRAP4 : begin `uvm_error("TYPEERR", "burst type not supported yet") end
      INCR4 : begin `uvm_error("TYPEERR", "burst type not supported yet") end
      WRAP8 : begin `uvm_error("TYPEERR", "burst type not supported yet") end
      INCR8 : begin `uvm_error("TYPEERR", "burst type not supported yet") end
      WRAP16: begin `uvm_error("TYPEERR", "burst type not supported yet") end
      INCR16: begin `uvm_error("TYPEERR", "burst type not supported yet") end
      default: begin `uvm_error("TYPEERR", "burst type not defined") end
    endcase
  endtask

  virtual task do_atomic_trans(REQ t);
    case(t.trans_type)							//??
      READ      : do_read(t);
      WRITE     : do_write(t);
      IDLE_XACT : begin `uvm_error("TYPEERR", "trans type not supported yet") end
      default: begin `uvm_error("TYPEERR", "trans type not defined") end
    endcase
  endtask

  virtual task wait_for_bus_grant();
    @(vif.cb_mst iff vif.cb_mst.hgrant === 1'b1);
  endtask

  virtual task do_write(REQ t);
    do_init_write(t);
    do_proc_write(t);
  endtask

  virtual task do_read(REQ t);
    do_init_read(t);
    do_proc_read(t);
  endtask

  virtual task do_init_write(REQ t);
    wait_for_bus_grant();//等待grant信号
    @(vif.cb_mst);
    vif.cb_mst.htrans <= NSEQ;//trans_type_enum 类型为NSEQ 代表第一个数据
    vif.cb_mst.haddr  <= t.addr;
    vif.cb_mst.hburst <= t.burst_type;
    vif.cb_mst.hsize  <= t.burst_size;//固定hsize
    vif.cb_mst.hwrite <= 1'b1;//驱动write
    @(vif.cb_mst);				//传入数据,等待第二拍ready信号为高,
    vif.cb_mst.hwdata <= t.data[0];
    // check ready with delay in current cycle
    forever begin
      @(negedge vif.hclk);//需要检测第二拍时的ready,检测下降沿最准确
      if(vif.hready === 1'b1) begin
        break;
      end
      else
        @(vif.cb_mst);//如果为低则需要再等一拍
    end

    // update current trans status
    t.trans_type = NSEQ;
    t.current_data_beat_num = 0; // start beat from 0 to make consistence with data array index
    t.all_beat_response[t.current_data_beat_num] = response_type_enum'(vif.hresp);
	//记录下每一位的response OKAY、ERROR、RETRY、SPLIT 
  endtask

  virtual task do_init_read(REQ t);
    wait_for_bus_grant();
    @(vif.cb_mst);
    vif.cb_mst.htrans <= NSEQ;
    vif.cb_mst.haddr  <= t.addr;
    vif.cb_mst.hburst <= t.burst_type;
    vif.cb_mst.hsize  <= t.burst_size;
    vif.cb_mst.hwrite <= 1'b0;	//读操作
    @(vif.cb_mst);
    // check ready with delay in current cycle
    forever begin
      @(negedge vif.hclk);
      if(vif.hready === 1'b1) begin	//同样在negedge时检查ready是否为高
        break;
      end
      else
        @(vif.cb_mst);
    end
    t.data = new[t.current_data_beat_num+1](t.data);//重置一下data,new一位并加上之前的data
    t.data[0] = vif.hrdata;//等待第二拍ready信号为高,读进数据,
    
    // update current trans status
    t.trans_type = NSEQ;
    t.current_data_beat_num = 0; // start beat from 0 to make consistence with data array index
    t.all_beat_response[t.current_data_beat_num] = response_type_enum'(vif.hresp);
  endtask

  virtual task do_proc_write(REQ t);
    // TODO implement for SEQ operations of other BURST types
    do_init_idle(t);
  endtask

  virtual task do_proc_read(REQ t);
    // TODO implement for SEQ operations of other BURST types
    do_init_idle(t);
  endtask

  virtual protected task do_init_idle(REQ t);//写了以后不再写了需要置为IDLE状态
    @(vif.cb_mst);
    _do_drive_idle();
  endtask

  virtual protected task _do_drive_idle();
    vif.cb_mst.haddr     <= 0;
    vif.cb_mst.hburst    <= 0;
    vif.cb_mst.hbusreq   <= 0;
    vif.cb_mst.hlock     <= 0;
    vif.cb_mst.hprot     <= 0;
    vif.cb_mst.hsize     <= 0;
    vif.cb_mst.htrans    <= 0;
    vif.cb_mst.hwdata    <= 0;
    vif.cb_mst.hwrite    <= 0;
  endtask

  virtual protected task reset_listener();
    `uvm_info(get_type_name(), "reset_listener ...", UVM_HIGH)
    fork
      forever begin
        @(negedge vif.hresetn); // ASYNC reset
        _do_drive_idle();
      end
    join_none
  endtask

endclass


`endif // LVC_AHB_MASTER_DRIVER_SV

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ahb-sram指的是高级外围总线(AHB)和静态随机存储器(SRAM)之间的接口设计和验证AHB-SRAM设计验证主要关注于确保AHB总线和SRAM之间的通信正常和可靠。设计验证的过程包括以下几个关键步骤: 1. 规划设计验证策略:在开始验证之前,需要明确定义验证目标和计划。确定验证所需资源、验证方法和验证环境等。 2. 静态验证:进行静态验证以评估设计的一致性和正确性。这可以通过使用模拟和仿真工具来完成,以验证设计的逻辑功能是否符合规格要求。 3. 动态验证:通过建立高级仿真模型或使用硬件描述语言(HDL)编写测试程序,进行动态验证。这些测试程序模拟了实际使用AHB-SRAM接口的情况,验证了设计和实现是否能够正确地处理各种读写操作和异常情况。 4. 性能验证:通过使用性能评估工具和技术,测试和验证设计在处理大量数据时的吞吐量、延迟和带宽等性能指标。这有助于确保AHB-SRAM设计能够满足系统需求。 5. 集成验证:将AHB-SRAM设计与其他子系统和外设集成,验证设计在整个系统中的功能和性能。这涉及到集成测试和系统级仿真,以确保整个系统的一致性和稳定性。 6. 错误排查和调试:在设计验证过程中,可能会发现各种问题和错误。需要进行适当的排查和调试,以找出问题的原因,并修复设计中的错误。 通过上述步骤的设计验证过程,可以最大程度地确保AHB-SRAM设计在实际应用中的正确性和可靠性。这样可以提高系统的稳定性和性能,并降低后续开发和维护的风险和成本。 ### 回答2: AHB(SRAM)设计验证是对AHB(SRAM)的硬件设计进行验证的过程。AHB指的是高级外设总线(Advanced High-performance Bus),是一种用于处理器与外设之间的通信的总线协议。SRAM指的是静态随机存取存储器(Static Random-access Memory),是一种常见的计算机内存存储单元。 AHB-SRAM的设计验证旨在确保这个硬件设计符合AHB协议,并能够正确地存储和读取数据。验证过程一般包括以下几个步骤: 1. 设计规划:确定设计验证的目标和范围,编写验证计划和验证测试案例。 2. 功能验证:通过对设计电路进行功能仿真,验证设计的各项功能是否满足需求。通过使用一些特定的设计验证工具,对设计电路进行输入和输出的模拟,以验证逻辑电路的正确性。 3. 性能验证:通过对设计电路进行性能仿真,验证设计的时序和时钟频率是否满足要求。通过模拟各种情况下的数据存储和读取操作,检测潜在的性能瓶颈。 4. 物理验证:通过对设计电路进行物理验证验证设计的布局和连线是否符合物理设计规范和约束条件。通过使用专业的物理验证工具,检查电路中是否存在物理故障,如电气连接问题、时序冲突等。 5. 集成验证:将设计电路与其他相关组件进行集成,验证整个系统的功能和性能。 AHB-SRAM设计验证是一个非常关键的步骤,它能够检测和纠正设计中的错误和问题,确保最终设计的可靠性和稳定性。只有通过了验证的设计才能进行后续的制造和生产。同时,设计验证还能够提供设计改进和优化的反馈,以便进一步提高设计的性能和效果。 ### 回答3: AHB(SRAM)是一种特定类型的静态随机存取存储器设计,用于在系统总线上进行数据传输和存储。设计验证是确保设计的功能和性能符合规范和需求的过程。 AHB-SRAM设计验证的目标是验证AHB-SRAM的功能正确性、数据的一致性和性能方面的指标。验证过程通常包括以下几个步骤: 1. 功能验证:通过编写测试用例,验证AHB-SRAM在不同的读写操作下是否能够正确地读写数据。测试用例需要覆盖各种读写情况,包括随机读写、顺序读写等。同时还需要测试错误情况下的处理机制,比如写入冲突、读取无效地址等。通过功能验证可以确保AHB-SRAM能够按照规定的操作进行数据的读写。 2. 数据一致性验证:在多核系统中,多个处理器可能同时访问AHB-SRAM。数据一致性验证的目标是验证在多个处理器同时读写AHB-SRAM时,数据的一致性是否能够保持。验证过程中需要考虑读写操作的时序和数据同步机制,确保在多个处理器之间进行数据交换时不会出现数据冲突或数据丢失的情况。 3. 性能验证AHB-SRAM的性能指标包括读写延迟和带宽。性能验证的目标是通过测试用例和性能评估工具来验证AHB-SRAM能够在规定的时钟周期内完成读写操作,并能够满足带宽需求。性能验证可以帮助确定系统中AHB-SRAM的使用限制和资源分配。 通过上述验证步骤,可以确保AHB-SRAM设计的正确性和性能符合预期。验证过程需要仔细设计测试用例和评估工具,同时需要对设计进行仿真和调试,以确保设计的稳定性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值