OpenCores
URL https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk

Subversion Repositories qaz_libs

[/] [qaz_libs/] [trunk/] [BFM/] [src/] [axis_video_frame/] [avf_monitor.svh] - Rev 45

Go to most recent revision | Compare with Previous | Blame | View Log

//////////////////////////////////////////////////////////////////////
////                                                              ////
//// Copyright (C) 2018 Authors and OPENCORES.ORG                 ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// details.                                                     ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
//////////////////////////////////////////////////////////////////////

class avf_monitor #(N, U) extends uvm_component;
  `uvm_component_param_utils(avf_monitor #(N, U));

  virtual axis_if #(.N(N), .U(U)) vif;
  avf_config #(N, U) cfg_h;
  uvm_analysis_port #(avf_sequence_item) ap;
  uvm_analysis_port #(avf_sequence_item) req;

  // --------------------------------------------------------------------
  function new (string name, uvm_component parent);
    super.new(name,parent);
  endfunction

  // --------------------------------------------------------------------
  function void build_phase(uvm_phase phase);
    ap = new("ap", this);
    req = new("req", this);
  endfunction : build_phase

  // --------------------------------------------------------------------
  task run_phase(uvm_phase phase);
    avf_sequence_item req_item;
    avf_sequence_item ap_item;
    bit sof_received = 0;
    int l, p;
    int offset;

    forever @(vif.cb_m iff vif.cb_m.aresetn === 1)
    begin
      if(vif.cb_s.tvalid & ~vif.cb_m.tready)
      begin
        req_item = avf_sequence_item::type_id::create("req_item");
        req_item.kind = AVF_REQUEST;
        req.write(req_item);
      end

      if(vif.cb_s.tvalid & vif.cb_m.tready)
      begin
        if(vif.cb_s.tuser[0]) // SOF
        begin
          ap_item = avf_sequence_item::type_id::create("ap_item");
          ap_item.kind = AVF_TRANSACTION;
          ap_item.f_h = new();
          ap_item.f_h.init( cfg_h.pixels_per_line
                          , cfg_h.lines_per_frame
                          , cfg_h.bits_per_pixel
                          , cfg_h.pixels_per_clk
                          , cfg_h.name
                          );
          sof_received = 1;
          p = 0;
          l = 0;
        end

        if(sof_received)
        begin

          for(int i = 0; i < ap_item.f_h.pixels_per_clk; i++, p++)
          begin
            offset = i * ap_item.f_h.bytes_per_pixel * 8;
            for(int k = 0; k < ap_item.f_h.bytes_per_pixel; k++)
              ap_item.f_h.lines[l].pixel[p][k * 8 +: 8] = vif.cb_s.tdata[offset + (k * 8) +: 8];
          end

          if(p >= ap_item.f_h.pixels_per_line)
          begin
            p = 0;
            l++;
          end

          if(vif.cb_s.tuser[2])  // EOF
          begin
            ap.write(ap_item);
            sof_received = 0;
          end
        end
      end
    end
  endtask : run_phase

// --------------------------------------------------------------------
endclass : avf_monitor

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.