ISP/rtl/Common/vector.svh

88 lines
2.1 KiB
Systemverilog

`ifndef __VECTOR_SVH__
`define __VECTOR_SVH__
`include "common"
`define Typedef_Vector(Name, DataType, DataDeepth, SizeDeepth) \
`define `STRING(Name) Vector#(Name, DataType, DataDeepth, SizeDeepth) \
`ifdef DEBUG \
typedef struct { \
`STRING(DataType) data[DataDeepth]; \
bit [SizeDeepth - 1 : 0] size; \
} \
`else \
typedef struct packed { \
`STRING(DataType) [DataDeepth:0] data; \
bit [SizeDeepth - 1 : 0] size; \
} \
`endif
class Vector #(
type ARRAY_TYPE,
type BASIC_TYPE,
int DATA_DEEPTH = 8,
int SIZE_DEEPTH = 8
);
// `ifdef DEBUG
// typedef struct {
// T data[DATA_DEEPTH];
// bit [SIZE_DEEPTH - 1 : 0] size;
// } ARRAY_TYPE;
// `else
// typedef struct packed {
// T [DATA_DEEPTH:0] data;
// bit [SIZE_DEEPTH - 1 : 0] size;
// } ARRAY_TYPE;
// `endif
// Get the size of Vector
static function automatic bit [SIZE_DEEPTH - 1 : 0] f_getSize(ARRAY_TYPE _vector);
return _vector.size;
endfunction //automatic
static function automatic ARRAY_TYPE f_fill(BASIC_TYPE data);
`ifdef DEBUG
ARRAY_TYPE _vector;
for (int i = 0; i < DATA_DEEPTH; ++i) _vector.data[i] = data;
_vector.size = DATA_DEEPTH;
return _vector;
`else
return {{DATA_DEEPTH{data}}, DATA_DEEPTH};
`endif
endfunction //automatic
static function automatic ARRAY_TYPE f_clearWith(BASIC_TYPE data);
`ifdef DEBUG
ARRAY_TYPE _vector;
for (int i = 0; i < DATA_DEEPTH; ++i) _vector.data[i] = data;
_vector.size = 0;
return _vector;
`else
return {{DATA_DEEPTH{data}}, {SIZE_DEEPTH{1'b0}}};
`endif
endfunction
// Push data into front Vector
static function automatic ARRAY_TYPE f_pushFront(BASIC_TYPE data, ARRAY_TYPE _vector);
`ifdef DEBUG
for (int i = 1; i < DATA_DEEPTH; ++i) _vector.data[i] = _vector.data[i-1];
`else
_vector.data = _vector.data >> DATA_DEEPTH;
`endif
_vector.data[0] = data;
_vector.size = _vector.size + 1;
return _vector;
endfunction //automatic
// Get the last data of the Vector
static function automatic BASIC_TYPE f_getBack(ARRAY_TYPE _vector);
return _vector.data[DATA_DEEPTH-1];
endfunction //automatic
endclass
`endif