| @@ -1,7 +1,7 @@ | |||
| `timescale 1ns/1ps | |||
| `define BITS 8 | |||
| module sc_decoder_fsm #(parameter BITS=8, N=11'd32)( | |||
| module sc_decoder_fsm #(parameter BITS=8, N=11'd128)( | |||
| input clk, rst, | |||
| input in_valid, | |||
| input signed [N-1:0][BITS-1:0] y, | |||
| @@ -47,7 +47,7 @@ endfunction | |||
| localparam d = $clog2(N); | |||
| // Internal Signals | |||
| logic [N-1:0][BITS-1:0] L_in, L_out; | |||
| logic [N-1:0][BITS-1:0] L_in = 'b0, L_out; | |||
| logic [d :0] temp_index_f,temp_index_g; | |||
| logic [N-1:0] v_in, v_out; | |||
| logic [11 :0] jL1,jL2, | |||
| @@ -63,8 +63,8 @@ reg [N-1:0]v; | |||
| logic [4:0] c_state, n_state; | |||
| //Auxiliary registers declarations | |||
| logic [d:0] depth,depth_reg; | |||
| logic [d:0] node,node_reg; | |||
| logic [d:0] depth = 'b0,depth_reg; | |||
| logic [d:0] node = 'b0,node_reg; | |||
| logic [11:0] tmp_L, tmp_L_reg, | |||
| tmp_R, tmp_R_reg, | |||
| tmp_U, tmp_U_reg; | |||
| @@ -139,11 +139,17 @@ always_comb | |||
| begin | |||
| u = 0; | |||
| v = 0; | |||
| // depth = 0; | |||
| tmp_L = 0; tmp_R = 0; tmp_U = 0; | |||
| ena_L = 0; enb_L = 0; | |||
| wea_L = 0; | |||
| node = node_reg; | |||
| depth = depth_reg; | |||
| L_in = L_in; | |||
| if(in_valid) | |||
| case(c_state) | |||
| idle: | |||
| begin | |||
| L_in = 0; | |||
| depth = 0; node = 0; | |||
| tmp_L = 0; tmp_R = 0; tmp_U = 0; | |||
| ena_L = 0; wea_L = 0; enb_L = 0; | |||
| @@ -162,23 +168,30 @@ always_comb | |||
| ena_L = 1'b1; wea_L = 1'b1; | |||
| enb_L = 0; ena_v = 0; | |||
| wea_v = 0; enb_v = 0; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| u = u; | |||
| v = v; | |||
| for(int k = 0; k < N; k++) | |||
| L_in[k] = y[k]; | |||
| // L_in = y; | |||
| n_state = wait_L_logic; | |||
| end | |||
| wait_L_logic: | |||
| begin | |||
| L_in = L_in; | |||
| depth = depth_reg + 1'b1; node = ((2*node_reg) + 1'b1); | |||
| ena_L = 0; wea_L = 0; | |||
| tmp_L = 0; enb_L = 1'b1; | |||
| ena_v = 0; wea_v = 0; | |||
| enb_v = 0; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| u = u; | |||
| v = v; | |||
| if(depth < d) | |||
| @@ -190,7 +203,14 @@ always_comb | |||
| wait_L: | |||
| begin | |||
| u = u; | |||
| // depth = depth_reg; | |||
| v = v; | |||
| L_in = L_in; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| ena_L = ena_L; enb_L = enb_L; | |||
| wea_L = wea_L; | |||
| // depth = depth_reg; | |||
| n_state = state_L; | |||
| end | |||
| @@ -203,7 +223,9 @@ always_comb | |||
| ena_v = 0; wea_v = 0; enb_v = 0; | |||
| tmp_L = tmp_L_reg + 1'b1; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| temp_index_f = ((N/(2**(depth+1'b1))) * ((2*(node) + 1'b1) - ((2**(depth + 1'b1)) - 1'b1))); | |||
| jL1 = (tmp_L_reg) + temp_index_f; | |||
| @@ -223,8 +245,13 @@ always_comb | |||
| begin | |||
| u = u; | |||
| v = v; | |||
| L_in = L_in; | |||
| ena_L = ena_L; enb_L = enb_L; | |||
| wea_L = wea_L; | |||
| depth = depth_reg - 1'b1; | |||
| node = node_reg + 1'b1; | |||
| tmp_L = tmp_L; | |||
| tmp_U = tmp_U; | |||
| tmp_R = 0; | |||
| n_state = wait_R; | |||
| end | |||
| @@ -232,10 +259,15 @@ always_comb | |||
| wait_R: | |||
| begin | |||
| // depth = depth_reg; | |||
| L_in = L_in; | |||
| ena_L = 0;wea_L = 0; enb_L = 1'b1; | |||
| ena_v = 0;wea_v = 0; enb_v = 1'b1; | |||
| wea_L = wea_L; | |||
| u = u; | |||
| v = v; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| n_state = state_R; | |||
| end | |||
| @@ -247,6 +279,8 @@ always_comb | |||
| ena_L = 1'b1; wea_L = 1'b1; enb_L = 0; | |||
| ena_v = 0; wea_v = 0; enb_v = 0; | |||
| tmp_L = tmp_L; | |||
| tmp_U = tmp_U; | |||
| tmp_R = tmp_R_reg + 1'b1; | |||
| temp_index_f = ((N/(2**(depth + 1'b1))) * ((2*(node) + 1'b1) -((2**(depth + 1'b1)) - 1'b1))); | |||
| temp_index_g = ((N/(2**(depth + 1'b1))) * ((2*(node - 1'b1) + 1'b1)-((2**(depth + 1'b1)) - 1'b1))); | |||
| @@ -271,28 +305,41 @@ always_comb | |||
| begin | |||
| depth = depth_reg - 1'b1; | |||
| node = (node_reg - 2) >> 1; | |||
| L_in = L_in; | |||
| tmp_U = 0; | |||
| wea_L = wea_L; | |||
| u = u; | |||
| v = v; | |||
| ena_L = ena_L; enb_L = enb_L; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| n_state = wait_U; | |||
| end | |||
| wait_U: | |||
| begin | |||
| // depth = depth_reg; | |||
| L_in = L_in; | |||
| ena_L = 0; wea_L = 0; enb_L = 0; | |||
| ena_v = 0; wea_v = 0; enb_v = 1'b1; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| n_state = state_U; | |||
| end | |||
| state_U: | |||
| begin | |||
| // depth = depth_reg; | |||
| L_in = L_in; | |||
| ena_L = 0; ena_v =1'b1; enb_L = 0; | |||
| wea_L = 0; wea_v =1'b1; enb_v = 0; | |||
| u = u; | |||
| v = v; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U_reg+1'b1; | |||
| temp_index_f = ((N/(2**(depth))) * ((2*node + 1'b1) - ((2**(depth)) - 1'b1))); | |||
| @@ -316,7 +363,14 @@ always_comb | |||
| begin | |||
| u = u; | |||
| v = v; | |||
| // depth = depth_reg; | |||
| L_in = L_in; | |||
| wea_L = wea_L; | |||
| // depth = depth_reg; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| ena_L = ena_L; enb_L = enb_L; | |||
| node = (node_reg - 1'b1) >> 1; | |||
| n_state = wait_LRU; | |||
| @@ -325,10 +379,14 @@ always_comb | |||
| wait_LRU: | |||
| begin | |||
| // depth = depth_reg; | |||
| L_in = L_in; | |||
| u = u; | |||
| v = v; | |||
| ena_L = 0; wea_L = 0; enb_L = 1'b1; | |||
| ena_v = 0; wea_v = 0; enb_v = 0; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| n_state = state_LRU; | |||
| end | |||
| @@ -339,7 +397,11 @@ always_comb | |||
| ena_L = 0; ena_v = 1'b1; | |||
| enb_v = 0; wea_v = 1'b1; | |||
| wea_L = 0; enb_L = 0; | |||
| L_in = L_in; | |||
| v = v; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| temp_index_f = ((N/(2**(depth))) * ((2*node + 1'b1) - ((2**(depth)) - 1'b1))); | |||
| fminsum_calc(L_out[temp_index_f],L_out[temp_index_f + 1],LRU[0]); | |||
| @@ -363,8 +425,14 @@ always_comb | |||
| begin | |||
| u = u; | |||
| v = v; | |||
| L_in = L_in; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| depth = depth_reg + 1'b1; node = node_reg; | |||
| ena_L = ena_L; enb_L = enb_L; | |||
| wea_L = wea_L; | |||
| n_state = wait_lnode; | |||
| end | |||
| @@ -373,6 +441,10 @@ always_comb | |||
| // depth = depth_reg; | |||
| u = u; | |||
| v = v; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| L_in = L_in; | |||
| ena_L = 0; wea_L = 0; enb_L = 1'b1; | |||
| ena_v = 0; wea_v = 0; enb_v = 0; | |||
| @@ -384,8 +456,12 @@ always_comb | |||
| // depth = depth_reg; | |||
| u = u; | |||
| v = v; | |||
| L_in = L_in; | |||
| ena_L = 0; wea_L = 0; enb_L = 0; | |||
| ena_v = 1'b1; wea_v = 1'b1; enb_v = 0; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| temp_index_f = ((N/(2**(depth))) * ((2*node + 1'b1) - ((2**(depth)) - 1'b1))); | |||
| @@ -407,9 +483,15 @@ always_comb | |||
| begin | |||
| u = u; | |||
| v = v; | |||
| L_in = L_in; | |||
| // depth = depth_reg; | |||
| node = node_reg; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| ena_L = ena_L; enb_L = enb_L; | |||
| wea_L = wea_L; | |||
| n_state = wait_lstate; | |||
| end | |||
| @@ -418,18 +500,26 @@ always_comb | |||
| // depth = depth_reg; | |||
| u = u; | |||
| v = v; | |||
| L_in = L_in; | |||
| ena_L = 0; wea_L = 0; enb_L = 1'b1; | |||
| ena_v = 0; wea_v = 0; enb_v = 0; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| n_state = state_last; | |||
| end | |||
| state_last: | |||
| begin | |||
| // depth = depth_reg; | |||
| L_in = L_in; | |||
| u = u; | |||
| ena_L = 0; wea_L = 0; enb_L = 0; | |||
| ena_v = 1'b1; wea_v = 1'b1; enb_v = 0; | |||
| tmp_L = tmp_L; | |||
| tmp_R = tmp_R; | |||
| tmp_U = tmp_U; | |||
| v = v_out; | |||
| @@ -439,11 +529,12 @@ always_comb | |||
| begin | |||
| u = 0; | |||
| v = 0; | |||
| L_in = 0; | |||
| depth = 0; node = 0; | |||
| tmp_L = 0; tmp_R = 0; tmp_U = 0; | |||
| ena_L = 0; wea_L = 0; enb_L = 0; | |||
| ena_L = 0; enb_L = 0; wea_L = 0; | |||
| ena_v = 0; wea_v = 0; enb_v = 0; | |||
| n_state = idle; | |||
| end | |||
| endcase | |||
| @@ -451,6 +542,7 @@ always_comb | |||
| begin | |||
| u = 0; | |||
| v = 0; | |||
| L_in = 0; | |||
| depth = 0; node = 0; | |||
| tmp_L = 0; tmp_R = 0; tmp_U = 0; | |||
| ena_L = 0; wea_L = 0; enb_L = 0; | |||