1
0
mirror of https://github.com/pConst/basic_verilog.git synced 2025-01-14 06:42:54 +08:00
basic_verilog/slicer_2d.sv
2023-10-20 01:04:13 +03:00

65 lines
1.4 KiB
Systemverilog

//------------------------------------------------------------------------------
// slicer_2d.sv
// Konstantin Pavlov, pavlovconst@gmail.com
//------------------------------------------------------------------------------
// INFO -------------------------------------------------------------------------
// Arbitrary slicer for 2D packed SystemVerilog arrays
// Slices along any array edge, all array sides simultaneously
//
// You can also generalize this aproach to support as many dimentions as needed
//
// This module does NOT consume any FPGA resources though it is absolutely
// synthesizable
//
/* --- INSTANTIATION TEMPLATE BEGIN ---
slicer_2d #(
.I2_HI( 3 ), .I2_LO( 0 ),
.I1_HI( 7 ), .I1_LO( 0 ),
.O2_HI( 2 ), .O2_LO( 1 ),
.O1_HI( 2 ), .O1_LO( 1 )
) S1 (
.in ( a[3:0][7:0] ),
.out( b[2:1][2:1] )
);
--- INSTANTIATION TEMPLATE END ---*/
module slicer_2d #( parameter
// input array shape
I2_HI = 3, // most significant size
I2_LO = 0,
I1_HI = 7, // least significant size
I1_LO = 0,
// sliced array shape
O2_HI = 2, // most significant size
O2_LO = 1,
O1_HI = 2, // least significant size
O1_LO = 1
)(
input [I2_HI:I2_LO][I1_HI:I1_LO] in,
output logic [O2_HI:O2_LO][O1_HI:O1_LO] out
);
integer i;
always_comb begin
for ( i=O2_LO; i<=O2_HI; i++ ) begin
out[i][O1_HI:O1_LO] = in[i][O1_HI:O1_LO];
end
end
endmodule