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