Files
OpenExSys_NoC/rtl/util/one_counter.sv
2023-11-26 14:59:34 +01:00

50 lines
1.1 KiB
Systemverilog
Executable File

`ifndef __ONE_COUNTER_SV__
`define __ONE_COUNTER_SV__
module one_counter
#(
parameter int unsigned DATA_WIDTH = 8,
localparam int unsigned CNT_WIDTH = $clog2(DATA_WIDTH) + 1
)
(
input logic[DATA_WIDTH-1:0] data_i,
output logic[CNT_WIDTH-1:0] cnt_o
);
localparam int unsigned PADDED_DATA_WIDTH = 1 << $clog2(DATA_WIDTH);
logic [PADDED_DATA_WIDTH-1:0] padded_data;
always_comb begin
padded_data = {PADDED_DATA_WIDTH{1'b0}};
padded_data[DATA_WIDTH-1:0] = data_i;
end
if(DATA_WIDTH == 1) begin
assign cnt_o = data_i;
end else begin
logic [CNT_WIDTH-2:0] res_left,res_right;
assign cnt_o = res_left + res_right;
one_counter #(
.DATA_WIDTH(PADDED_DATA_WIDTH/2)
) one_counter_left_u (
.data_i(padded_data[PADDED_DATA_WIDTH-1:PADDED_DATA_WIDTH/2]),
.cnt_o(res_left)
);
one_counter #(
.DATA_WIDTH(PADDED_DATA_WIDTH/2)
) one_counter_right_u (
.data_i(padded_data[PADDED_DATA_WIDTH/2-1:0]),
.cnt_o(res_right)
);
end
endmodule : one_counter
`endif