Line 48... |
Line 48... |
logger_class log;
|
logger_class log;
|
rand int frame_id;
|
rand int frame_id;
|
rand int pixels_per_line;
|
rand int pixels_per_line;
|
rand int lines_per_frame;
|
rand int lines_per_frame;
|
rand int bits_per_pixel;
|
rand int bits_per_pixel;
|
|
int bytes_per_pixel;
|
|
rand int pixels_per_clk;
|
line_s lines[];
|
line_s lines[];
|
string name = "";
|
string name = "";
|
string pattern = "";
|
string pattern = "";
|
|
|
constraint default_pixels_per_line
|
constraint default_pixels_per_line
|
Line 71... |
Line 73... |
constraint default_bits_per_pixel
|
constraint default_bits_per_pixel
|
{
|
{
|
bits_per_pixel >= 1 && bits_per_pixel <= 32;
|
bits_per_pixel >= 1 && bits_per_pixel <= 32;
|
}
|
}
|
|
|
|
|
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
function new;
|
function new;
|
this.log = new;
|
this.log = new;
|
this.frame_id = 0;
|
this.frame_id = 0;
|
endfunction: new
|
endfunction: new
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
|
function void init
|
function void init
|
(
|
(
|
input int pixels_per_line,
|
int pixels_per_line,
|
input int lines_per_frame,
|
int lines_per_frame,
|
input int bits_per_pixel,
|
int bits_per_pixel,
|
|
int pixels_per_clk = 1,
|
string name = ""
|
string name = ""
|
);
|
);
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
this.pixels_per_line = pixels_per_line;
|
this.pixels_per_line = pixels_per_line;
|
this.lines_per_frame = lines_per_frame;
|
this.lines_per_frame = lines_per_frame;
|
this.bits_per_pixel = bits_per_pixel;
|
this.bits_per_pixel = bits_per_pixel;
|
|
this.pixels_per_clk = pixels_per_clk;
|
this.name = name;
|
this.name = name;
|
|
this.bytes_per_pixel = (bits_per_pixel % 8 == 0)
|
|
? (bits_per_pixel / 8)
|
|
: (bits_per_pixel / 8) + 1;
|
|
|
this.make_constant(0);
|
this.make_constant(0);
|
|
|
endfunction: init
|
endfunction: init
|
|
|
|
|
// --------------------------------------------------------------------
|
|
//
|
|
extern virtual task write_pixel
|
|
(
|
|
input frame_coordinate_t coordinate,
|
|
input int pixel
|
|
);
|
|
|
|
extern virtual function int read_pixel
|
|
(
|
|
input frame_coordinate_t coordinate
|
|
);
|
|
|
|
extern function flattened_frame_t flatten_frame();
|
|
|
|
extern virtual function void make_constant
|
|
(
|
|
input int pixel
|
|
);
|
|
|
|
extern virtual function void make_counting
|
|
(
|
|
input int offset = 0
|
|
);
|
|
|
|
extern virtual function void make_horizontal();
|
|
|
|
extern virtual function void make_vertical();
|
|
|
|
extern virtual function void make_random();
|
|
|
|
extern virtual function void shift_right(ref line_s column);
|
|
|
|
extern virtual function void copy
|
|
(
|
|
ref video_frame_class from
|
|
);
|
|
|
|
extern virtual function video_frame_class clone();
|
|
|
|
extern virtual function int compare
|
|
(
|
|
input int max_mismatches,
|
|
ref video_frame_class to
|
|
);
|
|
|
|
extern virtual function video_frame_class catenate_horizontally
|
|
(
|
|
ref video_frame_class tail
|
|
);
|
|
|
|
extern virtual function int compare_line
|
|
(
|
|
input int line,
|
|
input int max_mismatches,
|
|
ref video_frame_class to
|
|
);
|
|
|
|
extern virtual function void print_line
|
|
(
|
|
input int line,
|
|
input int pixel,
|
|
input int count
|
|
);
|
|
|
|
extern virtual function void print_config();
|
|
|
|
endclass: video_frame_class
|
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
task write_pixel(frame_coordinate_t coordinate, int pixel);
|
task
|
|
video_frame_class::write_pixel
|
|
(
|
|
input frame_coordinate_t coordinate,
|
|
input int pixel
|
|
);
|
|
|
|
this.lines[coordinate.y].pixel[coordinate.x] = pixel;
|
this.lines[coordinate.y].pixel[coordinate.x] = pixel;
|
|
|
endtask: write_pixel
|
endtask: write_pixel
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function int read_pixel(frame_coordinate_t coordinate);
|
function int video_frame_class::read_pixel
|
|
(
|
|
input frame_coordinate_t coordinate
|
|
);
|
|
|
|
read_pixel = this.lines[coordinate.y].pixel[coordinate.x];
|
read_pixel = this.lines[coordinate.y].pixel[coordinate.x];
|
|
|
endfunction: read_pixel
|
endfunction: read_pixel
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function flattened_frame_t flatten_frame();
|
function flattened_frame_t video_frame_class::flatten_frame();
|
|
int i = 0;
|
int i = 0;
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
flatten_frame = new[lines_per_frame*pixels_per_line];
|
flatten_frame = new[lines_per_frame*pixels_per_line];
|
|
|
foreach(this.lines[l])
|
foreach(this.lines[l])
|
Line 212... |
Line 126... |
i++;
|
i++;
|
end
|
end
|
endfunction: flatten_frame
|
endfunction: flatten_frame
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void make_constant(int pixel);
|
function void video_frame_class::make_constant
|
|
(
|
|
input int pixel
|
|
);
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
|
|
this.lines = new[lines_per_frame];
|
this.lines = new[lines_per_frame];
|
|
|
foreach(this.lines[l])
|
foreach(this.lines[l])
|
begin
|
begin
|
|
|
this.lines[l].pixel = new[pixels_per_line];
|
this.lines[l].pixel = new[pixels_per_line];
|
|
|
foreach(this.lines[l].pixel[p])
|
foreach(this.lines[l].pixel[p])
|
this.lines[l].pixel[p] = pixel;
|
this.lines[l].pixel[p] = pixel;
|
|
|
end
|
end
|
|
|
pattern = "constant";
|
pattern = "constant";
|
|
|
endfunction: make_constant
|
endfunction: make_constant
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void make_counting(int offset = 0);
|
function void video_frame_class::make_counting
|
|
(
|
|
input int offset = 0
|
|
);
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
this.lines = new[lines_per_frame];
|
this.lines = new[lines_per_frame];
|
|
|
foreach(this.lines[l])
|
foreach(this.lines[l])
|
begin
|
begin
|
|
|
this.lines[l].pixel = new[pixels_per_line];
|
this.lines[l].pixel = new[pixels_per_line];
|
|
|
foreach(this.lines[l].pixel[p])
|
foreach(this.lines[l].pixel[p])
|
this.lines[l].pixel[p] = (pixels_per_line * l) + p + offset;
|
this.lines[l].pixel[p] = (pixels_per_line * l) + p + offset;
|
|
|
end
|
end
|
|
|
pattern = "counting";
|
pattern = "counting";
|
|
|
endfunction: make_counting
|
endfunction: make_counting
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void make_horizontal();
|
function void video_frame_class::make_horizontal();
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
this.lines = new[lines_per_frame];
|
this.lines = new[lines_per_frame];
|
|
|
foreach(this.lines[l])
|
foreach(this.lines[l])
|
begin
|
begin
|
|
|
this.lines[l].pixel = new[pixels_per_line];
|
this.lines[l].pixel = new[pixels_per_line];
|
|
|
foreach(this.lines[l].pixel[p])
|
foreach(this.lines[l].pixel[p])
|
this.lines[l].pixel[p] = p;
|
this.lines[l].pixel[p] = p;
|
|
|
end
|
end
|
|
|
pattern = "horizontal";
|
pattern = "horizontal";
|
|
|
endfunction: make_horizontal
|
endfunction: make_horizontal
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void make_vertical();
|
function void video_frame_class::make_vertical();
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
this.lines = new[lines_per_frame];
|
this.lines = new[lines_per_frame];
|
|
|
foreach(this.lines[l])
|
foreach(this.lines[l])
|
begin
|
begin
|
|
|
this.lines[l].pixel = new[pixels_per_line];
|
this.lines[l].pixel = new[pixels_per_line];
|
|
|
foreach(this.lines[l].pixel[p])
|
foreach(this.lines[l].pixel[p])
|
this.lines[l].pixel[p] = l;
|
this.lines[l].pixel[p] = l;
|
|
|
end
|
end
|
|
|
pattern = "vertical";
|
pattern = "vertical";
|
|
|
endfunction: make_vertical
|
endfunction: make_vertical
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void make_random();
|
function void video_frame_class::make_random();
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
this.lines = new[lines_per_frame];
|
this.lines = new[lines_per_frame];
|
|
|
foreach(this.lines[l])
|
foreach(this.lines[l])
|
begin
|
begin
|
|
|
this.lines[l].pixel = new[pixels_per_line];
|
this.lines[l].pixel = new[pixels_per_line];
|
|
|
foreach(this.lines[l].pixel[p])
|
foreach(this.lines[l].pixel[p])
|
this.lines[l].pixel[p] = $urandom_range(((2 ** bits_per_pixel) - 1), 0);
|
this.lines[l].pixel[p] = $urandom_range(((2 ** bits_per_pixel) - 1), 0);
|
|
|
end
|
end
|
|
|
pattern = "random";
|
pattern = "random";
|
|
|
endfunction: make_random
|
endfunction: make_random
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void copy(video_frame_class from);
|
function void video_frame_class::copy
|
|
(
|
|
ref video_frame_class from
|
|
);
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
this.frame_id = from.frame_id;
|
this.frame_id = from.frame_id;
|
this.pixels_per_line = from.pixels_per_line;
|
this.pixels_per_line = from.pixels_per_line;
|
this.lines_per_frame = from.lines_per_frame;
|
this.lines_per_frame = from.lines_per_frame;
|
this.bits_per_pixel = from.bits_per_pixel;
|
this.bits_per_pixel = from.bits_per_pixel;
|
this.name = from.name;
|
this.name = from.name;
|
Line 358... |
Line 224... |
foreach(this.lines[l].pixel[p])
|
foreach(this.lines[l].pixel[p])
|
this.lines[l].pixel[p] = from.lines[l].pixel[p];
|
this.lines[l].pixel[p] = from.lines[l].pixel[p];
|
end
|
end
|
endfunction: copy
|
endfunction: copy
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
virtual function video_frame_class clone;
|
function video_frame_class video_frame_class::clone();
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
clone = new();
|
clone = new();
|
clone.copy(this);
|
clone.copy(this);
|
|
|
endfunction: clone
|
endfunction: clone
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function video_frame_class catenate_horizontally(video_frame_class tail);
|
function video_frame_class video_frame_class::catenate_horizontally
|
|
(
|
|
ref video_frame_class tail
|
|
);
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
if(this.lines_per_frame != tail.lines_per_frame)
|
if(this.lines_per_frame != tail.lines_per_frame)
|
return(null);
|
return(null);
|
|
|
if(this.bits_per_pixel != tail.bits_per_pixel)
|
if(this.bits_per_pixel != tail.bits_per_pixel)
|
return(null);
|
return(null);
|
|
|
catenate_horizontally = new();
|
catenate_horizontally = new();
|
|
|
catenate_horizontally.pixels_per_line = this.pixels_per_line + tail.pixels_per_line;
|
catenate_horizontally.pixels_per_line = this.pixels_per_line + tail.pixels_per_line;
|
catenate_horizontally.lines_per_frame = this.lines_per_frame;
|
catenate_horizontally.lines_per_frame = this.lines_per_frame;
|
catenate_horizontally.bits_per_pixel = this.bits_per_pixel;
|
catenate_horizontally.bits_per_pixel = this.bits_per_pixel;
|
catenate_horizontally.name = this.name;
|
catenate_horizontally.name = this.name;
|
catenate_horizontally.lines = new[catenate_horizontally.lines_per_frame];
|
catenate_horizontally.lines = new[catenate_horizontally.lines_per_frame];
|
Line 407... |
Line 261... |
catenate_horizontally.lines[l].pixel[p + this.pixels_per_line] = tail.lines[l].pixel[p];
|
catenate_horizontally.lines[l].pixel[p + this.pixels_per_line] = tail.lines[l].pixel[p];
|
end
|
end
|
endfunction: catenate_horizontally
|
endfunction: catenate_horizontally
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void shift_right(ref line_s column);
|
function void video_frame_class::shift_right(ref line_s column);
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
foreach(this.lines[l])
|
foreach(this.lines[l])
|
for(int p = pixels_per_line - 1; p > 0; p--)
|
for(int p = pixels_per_line - 1; p > 0; p--)
|
this.lines[l].pixel[p] = this.lines[l].pixel[p - 1];
|
this.lines[l].pixel[p] = this.lines[l].pixel[p - 1];
|
Line 420... |
Line 273... |
foreach(this.lines[l])
|
foreach(this.lines[l])
|
this.lines[l].pixel[0] = column.pixel[l];
|
this.lines[l].pixel[0] = column.pixel[l];
|
endfunction: shift_right
|
endfunction: shift_right
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function int compare_line
|
function int video_frame_class::compare_line
|
( int line
|
(
|
, int max_mismatches
|
input int line,
|
, video_frame_class to
|
input int max_mismatches,
|
|
ref video_frame_class to
|
|
);
|
);
|
|
|
int mismatch_count = 0;
|
int mismatch_count = 0;
|
|
|
if(to.bits_per_pixel != this.bits_per_pixel)
|
if(to.bits_per_pixel != this.bits_per_pixel)
|
begin
|
begin
|
log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
|
log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
|
Line 448... |
Line 298... |
log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s",
|
log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s",
|
line, p, to.lines[line].pixel[p], this.lines[line].pixel[p], name));
|
line, p, to.lines[line].pixel[p], this.lines[line].pixel[p], name));
|
|
|
if(mismatch_count > max_mismatches)
|
if(mismatch_count > max_mismatches)
|
return(mismatch_count);
|
return(mismatch_count);
|
|
|
end
|
end
|
|
|
return(mismatch_count);
|
return(mismatch_count);
|
|
|
endfunction: compare_line
|
endfunction: compare_line
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function int compare(int max_mismatches, video_frame_class to);
|
function int video_frame_class::compare
|
|
(
|
|
input int max_mismatches,
|
|
ref video_frame_class to
|
|
);
|
|
|
|
int mismatch_count = 0;
|
int mismatch_count = 0;
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
if(to.pixels_per_line != this.pixels_per_line)
|
if(to.pixels_per_line != this.pixels_per_line)
|
begin
|
begin
|
log.error($sformatf("to.pixels_per_line != this.pixels_per_line | %s", name));
|
log.error($sformatf("to.pixels_per_line != this.pixels_per_line | %s", name));
|
Line 491... |
Line 331... |
foreach(this.lines[l])
|
foreach(this.lines[l])
|
begin
|
begin
|
foreach(this.lines[l].pixel[p])
|
foreach(this.lines[l].pixel[p])
|
if(to.lines[l].pixel[p] != this.lines[l].pixel[p])
|
if(to.lines[l].pixel[p] != this.lines[l].pixel[p])
|
begin
|
begin
|
|
|
if(max_mismatches > 0)
|
if(max_mismatches > 0)
|
mismatch_count++;
|
mismatch_count++;
|
|
|
log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s", l, p, to.lines[l].pixel[p], this.lines[l].pixel[p], name));
|
log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h | %s", l, p, to.lines[l].pixel[p], this.lines[l].pixel[p], name));
|
|
|
if(mismatch_count > max_mismatches)
|
if(mismatch_count > max_mismatches)
|
return(mismatch_count);
|
return(mismatch_count);
|
|
|
end
|
end
|
end
|
end
|
|
|
return(mismatch_count);
|
return(mismatch_count);
|
|
|
endfunction: compare
|
endfunction: compare
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void print_line(int line, int pixel, int count);
|
function void video_frame_class::print_line
|
|
(
|
|
input int line,
|
|
input int pixel,
|
|
input int count
|
|
);
|
|
|
|
log.info($sformatf("%m"));
|
log.info($sformatf("%m"));
|
|
|
for(int i = 0; i < count; i++)
|
for(int i = 0; i < count; i++)
|
log.display($sformatf("%4h @ frame[%4h][%4h] | %s", this.lines[line].pixel[(pixel + i)], line, (pixel + i), name));
|
log.display($sformatf("%4h @ frame[%4h][%4h] | %s", this.lines[line].pixel[(pixel + i)], line, (pixel + i), name));
|
|
|
endfunction: print_line
|
endfunction: print_line
|
|
|
|
|
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
//
|
function void print_config();
|
function void video_frame_class::print_config();
|
|
|
|
log.display($sformatf("%m | frame_id = %06d | %s", frame_id, name));
|
log.display($sformatf("%m | frame_id = %06d | %s", frame_id, name));
|
log.display($sformatf("%m | pixels_per_line = %06d | %s", pixels_per_line, name));
|
log.display($sformatf("%m | pixels_per_line = %06d | %s", pixels_per_line, name));
|
log.display($sformatf("%m | lines_per_frame = %06d | %s", lines_per_frame, name));
|
log.display($sformatf("%m | lines_per_frame = %06d | %s", lines_per_frame, name));
|
log.display($sformatf("%m | bits_per_pixel = %06d | %s", bits_per_pixel, name));
|
log.display($sformatf("%m | bits_per_pixel = %06d | %s", bits_per_pixel, name));
|
|
log.display($sformatf("%m | pixels_per_clk = %06d | %s", pixels_per_clk, name));
|
log.display($sformatf("%m | pattern = %s | %s", pattern, name));
|
log.display($sformatf("%m | pattern = %s | %s", pattern, name));
|
|
|
endfunction: print_config
|
endfunction: print_config
|
|
|
|
// --------------------------------------------------------------------
|
|
function string convert2string();
|
|
string s;
|
|
string f ="";
|
|
foreach(this.lines[l])
|
|
begin
|
|
s = $sformatf("[%4.d]", l);
|
|
foreach(this.lines[l].pixel[p])
|
|
s = {s, $sformatf("|%4.h", this.lines[l].pixel[p])};
|
|
f = {f, s, "|\n"};
|
|
end
|
|
return f;
|
|
endfunction: convert2string
|
|
|
|
// --------------------------------------------------------------------
|
|
endclass: video_frame_class
|
|
|
|
// --------------------------------------------------------------------
|
endpackage: video_frame_pkg
|
endpackage: video_frame_pkg
|
|
|