have you tried designating the exact bits at each step forcing the matter?
eg:
warning line:
assign buf_address = idx_n + idx_r + idx_k;
to:
assign buf_address[$clog2(NUM_OF_DATA_ENTRIES)-1:0] = idx_n[IDX_N_WIDTH-1:0] + idx_r[IDX_R_WIDTH-1:0] + idx_k[IDX_K_WIDTH-1:0];
similar on line 51:
else if(index_i[$clog2(N)-1:0] < N[$clog2(N)-1:0]) index_i <= index_i + Tn[0 +: Tn_WIDTH];
Though this one may cause problems as if 'N" has more bits than [$clog2(N)-1:0]. You may also try:
else if(index_i[$clog2(N)-1:0] < N[2:0]) index_i <= index_i + Tn[0 +: Tn_WIDTH];
Assuming N is never greater than 7, however, you compiler seems to be saying that [$clog2(N)-1:0] for index_i is only = to [1:0], ie 2 bits and N being =4 is 3 bits.
When comparing different number of bits together, some compilers want you to be explicit knowing that the < 'LT' will always hold true.
Since I'm not decoding this code, I can tell you some of these warnings are important like the one with the second one I highlighted. There is no way index_i can be > or = 'N' since it is only 2 bits while 'N=4' is 3 bits already...