sv2v/test/relong/array.sv

44 lines
1.4 KiB
Systemverilog

`default_nettype none
module ArrayOrReduction #(
parameter SIZE = 16, WIDTH=32) (
input logic [SIZE-1:0][WIDTH-1:0] inputs,
output logic [WIDTH-1:0] result
);
// Recursively generate a pair-wise reduction
generate
if(SIZE <= 0) begin : error_case
DoesNotExit foo();
end else if (SIZE == 1) begin : base_case_1
assign result = inputs[0];
end else if(SIZE == 2) begin : base_case_2
assign result = inputs[0] | inputs[1];
end else begin : recursive_case
logic [1:0][WIDTH-1:0] subResults;
ArrayOrReduction #(.WIDTH(WIDTH), .SIZE(SIZE/2)) top(.inputs(inputs[SIZE-1:SIZE/2]), .result(subResults[1]));
ArrayOrReduction #(.WIDTH(WIDTH), .SIZE(SIZE/2)) bot(.inputs(inputs[SIZE/2-1:0]), .result(subResults[0]));
assign result = subResults[0] | subResults[1];
end
endgenerate
endmodule
module Array #(parameter ELEMENTS=16, WIDTH=32)(
// $clog2 is a built in function that does the natural log of 2
input logic [$clog2(ELEMENTS)-1:0] index,
input logic [WIDTH-1:0] element,
output logic [ELEMENTS-1:0][WIDTH-1:0] array,
input logic clock, clear, enable
);
localparam ZERO_ELEMENT = {WIDTH{1'b0}};
always_ff @(posedge clock)
if(clear)
array <= {ELEMENTS{ZERO_ELEMENT}};
else if(enable)
array[index] <= element;
endmodule