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 47
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;
video_frame_config c_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( c_h.pixels_per_line
, c_h.lines_per_frame
, c_h.bits_per_pixel
, c_h.pixels_per_clk
, c_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