|
@@ -1,4 +1,4 @@ |
|
|
`timescale 1ns / 1ns |
|
|
|
|
|
|
|
|
/*`timescale 1ns / 1ns |
|
|
////////////////////////////////////////////////////////////////////////////////// |
|
|
////////////////////////////////////////////////////////////////////////////////// |
|
|
// Company: |
|
|
// Company: |
|
|
// Engineer: |
|
|
// Engineer: |
|
@@ -30,37 +30,47 @@ output logic out_valid |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//function for fminsum calculation |
|
|
|
|
|
|
|
|
// Function to calculate f(r1,r2) = sgn(r1) * sgn(r2) * min(|r1|,|r2|) |
|
|
function void fminsum_calc; |
|
|
function void fminsum_calc; |
|
|
input signed [`BITS-1:0] a; |
|
|
|
|
|
input signed [`BITS-1:0] b; |
|
|
|
|
|
output signed [`BITS-1:0] c; |
|
|
|
|
|
|
|
|
input signed [`BITS-1:0] a; |
|
|
|
|
|
input signed [`BITS-1:0] b; |
|
|
|
|
|
output signed [`BITS-1:0] c; |
|
|
|
|
|
|
|
|
logic [`BITS-2:0] abs_a; |
|
|
logic [`BITS-2:0] abs_a; |
|
|
logic [`BITS-2:0] abs_b; |
|
|
logic [`BITS-2:0] abs_b; |
|
|
logic [`BITS-2:0] abs_c; |
|
|
logic [`BITS-2:0] abs_c; |
|
|
|
|
|
|
|
|
abs_a = (a[`BITS-1] == 1) ? ~a[`BITS-2:0] + 1 : a[`BITS-2:0]; |
|
|
|
|
|
abs_b = (b[`BITS-1] == 1) ? ~b[`BITS-2:0] + 1 : b[`BITS-2:0]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Mod value of a and b |
|
|
|
|
|
abs_a = (a[`BITS-1]) ? ~a[`BITS-2:0] + 1'b1 : a[`BITS-2:0]; |
|
|
|
|
|
abs_b = (b[`BITS-1]) ? ~b[`BITS-2:0] + 1'b1 : b[`BITS-2:0]; |
|
|
|
|
|
|
|
|
|
|
|
// Multiplication of sign i.e. XOR |
|
|
c[`BITS-1] = a[`BITS-1] ^ b[`BITS-1]; |
|
|
c[`BITS-1] = a[`BITS-1] ^ b[`BITS-1]; |
|
|
|
|
|
|
|
|
|
|
|
// Minimum value between a and b |
|
|
abs_c = (abs_b < abs_a) ? abs_b : abs_a; |
|
|
abs_c = (abs_b < abs_a) ? abs_b : abs_a; |
|
|
c[`BITS-2:0] = (c[`BITS-1] == 1) ? ~abs_c + 1 : abs_c; |
|
|
|
|
|
|
|
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
// Final Minsum of a and b |
|
|
|
|
|
c[`BITS-2:0] = (c[`BITS-1]) ? ~abs_c + 1'b1 : abs_c; |
|
|
|
|
|
|
|
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
//function for g-value calculation |
|
|
|
|
|
function void g_calc; |
|
|
|
|
|
input signed [`BITS-1:0] a; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Function to Calculate g(r1,r2,u) = r2 + ((1-2u) * r1) |
|
|
|
|
|
function void g_calc; |
|
|
|
|
|
input signed [`BITS-1:0] a; |
|
|
input signed [`BITS-1:0] b; |
|
|
input signed [`BITS-1:0] b; |
|
|
input u; |
|
|
input u; |
|
|
output signed [`BITS:0] c; |
|
|
output signed [`BITS:0] c; |
|
|
c = (u == 0) ? (b + a) : (b + (~a+1)); |
|
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// when u == 0 => c = b - a |
|
|
|
|
|
// When u == 1 => c = b + a |
|
|
|
|
|
c = u ? (b + (~a+1)) : (b + a) ; |
|
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//parameters and signals declarations |
|
|
//parameters and signals declarations |
|
|
localparam d=$clog2(N); //N=4, d=2(0 & 1) |
|
|
localparam d=$clog2(N); //N=4, d=2(0 & 1) |
|
|
localparam n=2*N-1; //(2**d)-1; |
|
|
|
|
|
localparam cmax=0; |
|
|
|
|
|
logic [N-1:0]u; |
|
|
logic [N-1:0]u; |
|
|
logic [d:0]temp_index_f,temp_index_g; |
|
|
logic [d:0]temp_index_f,temp_index_g; |
|
|
reg signed [BITS-1:0] LRU[2]; |
|
|
reg signed [BITS-1:0] LRU[2]; |
|
@@ -76,7 +86,7 @@ logic [4:0] c_state, n_state; |
|
|
|
|
|
|
|
|
wire [N-1:0]u_cap_1; |
|
|
wire [N-1:0]u_cap_1; |
|
|
wire [N-1:0]v_final_1; |
|
|
wire [N-1:0]v_final_1; |
|
|
wire out_valid_1; |
|
|
|
|
|
|
|
|
//wire out_valid_1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Auxiliary registers declarations |
|
|
//Auxiliary registers declarations |
|
@@ -115,8 +125,8 @@ for(genvar i=0; i<N; i++) |
|
|
end |
|
|
end |
|
|
assign v_final_1 = v; |
|
|
assign v_final_1 = v; |
|
|
|
|
|
|
|
|
assign out_valid_1 = (n_state == state_lnode) ? 1'b1 : 1'b0; |
|
|
|
|
|
//assign out_valid=(n_state==state_last)?1'b1:1'b0; |
|
|
|
|
|
|
|
|
// assign out_valid_1 = (n_state == state_lnode) ? 1'b1 : 1'b0; |
|
|
|
|
|
assign out_valid=(n_state==state_last)?1'b1:1'b0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Sequential Logic - FSM State and Data Registers |
|
|
// Sequential Logic - FSM State and Data Registers |
|
@@ -126,7 +136,6 @@ begin |
|
|
begin |
|
|
begin |
|
|
u_cap <= 'b0; |
|
|
u_cap <= 'b0; |
|
|
v_final <= 'b0; |
|
|
v_final <= 'b0; |
|
|
out_valid <= 'b0; |
|
|
|
|
|
|
|
|
|
|
|
c_state <= idle; |
|
|
c_state <= idle; |
|
|
depth_reg<=0; |
|
|
depth_reg<=0; |
|
@@ -138,8 +147,8 @@ begin |
|
|
end |
|
|
end |
|
|
else |
|
|
else |
|
|
begin |
|
|
begin |
|
|
out_valid <= out_valid_1; |
|
|
|
|
|
v_final <= v_final_1; |
|
|
|
|
|
|
|
|
// out_valid <= out_valid_1; |
|
|
|
|
|
// v_final <= v_final_1; |
|
|
if(out_valid) |
|
|
if(out_valid) |
|
|
begin |
|
|
begin |
|
|
u_cap <= u; |
|
|
u_cap <= u; |
|
@@ -193,23 +202,21 @@ begin |
|
|
n_state=wait_L; |
|
|
n_state=wait_L; |
|
|
end |
|
|
end |
|
|
wait_L: begin |
|
|
wait_L: begin |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
n_state=state_L; |
|
|
n_state=state_L; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
end |
|
|
end |
|
|
state_L: begin |
|
|
state_L: begin |
|
|
ena_L=1;wea_L=1;enb_L=0; |
|
|
ena_L=1;wea_L=1;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_reg+1; |
|
|
tmp_L=tmp_L_reg+1; |
|
|
temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
|
|
|
// temp_index_f=((N>>(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
jL1=(tmp_L_reg)+temp_index_f; |
|
|
jL1=(tmp_L_reg)+temp_index_f; |
|
|
jL2=(tmp_L_reg)+temp_index_f+(N/(2**depth)); |
|
|
jL2=(tmp_L_reg)+temp_index_f+(N/(2**depth)); |
|
|
|
|
|
// jL2=(tmp_L_reg)+temp_index_f+(N>>(2**depth)); |
|
|
fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]); |
|
|
fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]); |
|
|
|
|
|
|
|
|
if(tmp_L< (N/(2**depth))) |
|
|
if(tmp_L< (N/(2**depth))) |
|
|
|
|
|
// if(tmp_L< (N>>(2**depth))) |
|
|
n_state=state_L; |
|
|
n_state=state_L; |
|
|
else if(depth<d) |
|
|
else if(depth<d) |
|
|
n_state=wait_L_logic; |
|
|
n_state=wait_L_logic; |
|
@@ -224,12 +231,7 @@ begin |
|
|
wait_R: begin |
|
|
wait_R: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=1; |
|
|
ena_v=0;wea_v=0; enb_v=1; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
n_state=state_R; |
|
|
n_state=state_R; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
state_R: begin |
|
|
state_R: begin |
|
@@ -237,16 +239,13 @@ begin |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
tmp_R=tmp_R_reg+1; |
|
|
tmp_R=tmp_R_reg+1; |
|
|
temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
// temp_index_f=((N>>(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
|
|
|
temp_index_g=((N/(2**(depth+1)))*((2*(node-1)+1)-((2**(depth+1))-1))); |
|
|
temp_index_g=((N/(2**(depth+1)))*((2*(node-1)+1)-((2**(depth+1))-1))); |
|
|
// temp_index_g=((N>>(2**(depth+1)))*((2*(node-1)+1)-((2**(depth+1))-1))); |
|
|
|
|
|
jR1=(tmp_R_reg)+temp_index_g; |
|
|
jR1=(tmp_R_reg)+temp_index_g; |
|
|
jR2=(tmp_R_reg)+temp_index_g+(N/(2**depth)); |
|
|
jR2=(tmp_R_reg)+temp_index_g+(N/(2**depth)); |
|
|
// jR3=(tmp_R_reg)+temp_index_f; |
|
|
|
|
|
|
|
|
jR3=(tmp_R_reg)+temp_index_f; |
|
|
g_calc(L_out[jR1],L_out[jR2],v_out[jR1],L_in[jR3]); |
|
|
g_calc(L_out[jR1],L_out[jR2],v_out[jR1],L_in[jR3]); |
|
|
|
|
|
|
|
|
if(tmp_R< (N/(2**depth))) |
|
|
if(tmp_R< (N/(2**depth))) |
|
|
// if(tmp_R< (N>>(2**depth))) |
|
|
|
|
|
n_state=state_R; |
|
|
n_state=state_R; |
|
|
else if(node==((2**d)-2)) |
|
|
else if(node==((2**d)-2)) |
|
|
n_state=wait_lnode_logic; |
|
|
n_state=wait_lnode_logic; |
|
@@ -258,25 +257,18 @@ begin |
|
|
|
|
|
|
|
|
wait_U_logic: begin |
|
|
wait_U_logic: begin |
|
|
depth=depth_reg-1; node=(node_reg-2)/2; tmp_U=0; |
|
|
depth=depth_reg-1; node=(node_reg-2)/2; tmp_U=0; |
|
|
// depth=depth_reg-1; node=(node_reg-2)>>1; tmp_U=0; |
|
|
|
|
|
n_state=wait_U; |
|
|
n_state=wait_U; |
|
|
end |
|
|
end |
|
|
wait_U: begin |
|
|
wait_U: begin |
|
|
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; |
|
|
ena_v=0;wea_v=0; enb_v=1; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
n_state=state_U; |
|
|
n_state=state_U; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
end |
|
|
end |
|
|
state_U: begin |
|
|
state_U: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
tmp_U=tmp_U_reg+1; |
|
|
tmp_U=tmp_U_reg+1; |
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
// temp_index_f=((N/(2**(depth)))*(((node+1)<< 1)-((2**(depth))-1))); |
|
|
|
|
|
jU1=(tmp_U_reg)+temp_index_f; |
|
|
jU1=(tmp_U_reg)+temp_index_f; |
|
|
jU2=(tmp_U_reg)+temp_index_f+(N/(2**(depth))); |
|
|
jU2=(tmp_U_reg)+temp_index_f+(N/(2**(depth))); |
|
|
v_in[jU1] = v_out[jU1] ^ v_out[jU2]; |
|
|
v_in[jU1] = v_out[jU1] ^ v_out[jU2]; |
|
@@ -293,25 +285,21 @@ begin |
|
|
n_state=wait_lstate_logic; |
|
|
n_state=wait_lstate_logic; |
|
|
end |
|
|
end |
|
|
wait_LRU_logic: begin |
|
|
wait_LRU_logic: begin |
|
|
// depth=depth_reg; node=(node_reg-1)/2; |
|
|
|
|
|
depth=depth_reg; node=(node_reg-1)>>1; |
|
|
|
|
|
|
|
|
depth=depth_reg; node=(node_reg-1)/2; |
|
|
|
|
|
// depth=depth_reg; node=(node_reg-1)>>1; |
|
|
n_state=wait_LRU; |
|
|
n_state=wait_LRU; |
|
|
end |
|
|
end |
|
|
wait_LRU: begin |
|
|
wait_LRU: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
n_state=state_LRU; |
|
|
n_state=state_LRU; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
state_LRU: begin |
|
|
state_LRU: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
|
|
|
// temp_index_f=((N>>(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
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]); |
|
|
// u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0); |
|
|
// u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0); |
|
|
u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0); |
|
|
u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0); |
|
@@ -334,17 +322,13 @@ begin |
|
|
wait_lnode: begin |
|
|
wait_lnode: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
n_state=state_lnode; |
|
|
n_state=state_lnode; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
end |
|
|
end |
|
|
state_lnode: begin |
|
|
state_lnode: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
|
|
|
// temp_index_f=((N>>(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
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]); |
|
|
// u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0); |
|
|
// u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0); |
|
|
u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0); |
|
|
u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0); |
|
@@ -362,12 +346,7 @@ begin |
|
|
wait_lstate: begin |
|
|
wait_lstate: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
n_state=state_last; |
|
|
n_state=state_last; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
end |
|
|
end |
|
|
state_last: begin |
|
|
state_last: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
@@ -379,8 +358,8 @@ begin |
|
|
else n_state = idle; |
|
|
else n_state = idle; |
|
|
end |
|
|
end |
|
|
endmodule |
|
|
endmodule |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
|
|
|
|
|
|
`timescale 1ns / 1ns |
|
|
`timescale 1ns / 1ns |
|
|
////////////////////////////////////////////////////////////////////////////////// |
|
|
////////////////////////////////////////////////////////////////////////////////// |
|
@@ -403,7 +382,7 @@ endmodule |
|
|
// |
|
|
// |
|
|
////////////////////////////////////////////////////////////////////////////////// |
|
|
////////////////////////////////////////////////////////////////////////////////// |
|
|
`define BITS 8 |
|
|
`define BITS 8 |
|
|
module sc_decoder_fsm #(parameter BITS=8, N=11'd16)( |
|
|
|
|
|
|
|
|
module sc_decoder_fsm #(parameter BITS=8, N=11'd32)( |
|
|
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, |
|
@@ -424,11 +403,11 @@ function void fminsum_calc; |
|
|
logic [`BITS-2:0] abs_b; |
|
|
logic [`BITS-2:0] abs_b; |
|
|
logic [`BITS-2:0] abs_c; |
|
|
logic [`BITS-2:0] abs_c; |
|
|
|
|
|
|
|
|
abs_a = (a[`BITS-1] == 1) ? ~a[`BITS-2:0] + 1 : a[`BITS-2:0]; |
|
|
|
|
|
abs_b = (b[`BITS-1] == 1) ? ~b[`BITS-2:0] + 1 : b[`BITS-2:0]; |
|
|
|
|
|
|
|
|
abs_a = (a[`BITS-1]) ? ~a[`BITS-2:0] + 1'b1 : a[`BITS-2:0]; |
|
|
|
|
|
abs_b = (b[`BITS-1]) ? ~b[`BITS-2:0] + 1'b1 : b[`BITS-2:0]; |
|
|
c[`BITS-1] = a[`BITS-1] ^ b[`BITS-1]; |
|
|
c[`BITS-1] = a[`BITS-1] ^ b[`BITS-1]; |
|
|
abs_c = (abs_b < abs_a) ? abs_b : abs_a; |
|
|
abs_c = (abs_b < abs_a) ? abs_b : abs_a; |
|
|
c[`BITS-2:0] = (c[`BITS-1] == 1) ? ~abs_c + 1 : abs_c; |
|
|
|
|
|
|
|
|
c[`BITS-2:0] = (c[`BITS-1]) ? ~abs_c + 1'b1 : abs_c; |
|
|
|
|
|
|
|
|
endfunction |
|
|
endfunction |
|
|
|
|
|
|
|
@@ -438,13 +417,13 @@ function void fminsum_calc; |
|
|
input signed [`BITS-1:0] b; |
|
|
input signed [`BITS-1:0] b; |
|
|
input u; |
|
|
input u; |
|
|
output signed [`BITS:0] c; |
|
|
output signed [`BITS:0] c; |
|
|
c = (u == 0) ? (b + a) : (b + (~a+1)); |
|
|
|
|
|
|
|
|
c = (u == 0) ? (b + a) : (b + (~a+1'b1)); |
|
|
endfunction |
|
|
endfunction |
|
|
|
|
|
|
|
|
//parameters and signals declarations |
|
|
//parameters and signals declarations |
|
|
localparam d=$clog2(N); //N=4, d=2(0 & 1) |
|
|
localparam d=$clog2(N); //N=4, d=2(0 & 1) |
|
|
localparam n=2*N-1; //(2**d)-1; |
|
|
|
|
|
localparam cmax=0; |
|
|
|
|
|
|
|
|
//localparam n=2*N-1; //(2**d)-1; |
|
|
|
|
|
//localparam cmax=0; |
|
|
logic u[N]; |
|
|
logic u[N]; |
|
|
logic [d:0]temp_index_f,temp_index_g; |
|
|
logic [d:0]temp_index_f,temp_index_g; |
|
|
reg signed [BITS-1:0] LRU[2]; |
|
|
reg signed [BITS-1:0] LRU[2]; |
|
@@ -453,7 +432,7 @@ logic [N-1:0][BITS-1:0]L_in, L_out; |
|
|
logic [N-1:0]v_in, v_out; |
|
|
logic [N-1:0]v_in, v_out; |
|
|
logic ena_v,enb_v,wea_v; |
|
|
logic ena_v,enb_v,wea_v; |
|
|
logic ena_L,enb_L,wea_L; |
|
|
logic ena_L,enb_L,wea_L; |
|
|
logic [1:0]counter,counter_reg; |
|
|
|
|
|
|
|
|
//logic [1:0]counter,counter_reg; |
|
|
logic [11:0]jL1,jL2,jR1,jR2,jR3,jU1,jU2; |
|
|
logic [11:0]jL1,jL2,jR1,jR2,jR3,jU1,jU2; |
|
|
logic [4:0] c_state, n_state; |
|
|
logic [4:0] c_state, n_state; |
|
|
|
|
|
|
|
@@ -503,7 +482,7 @@ begin |
|
|
c_state <= idle; |
|
|
c_state <= idle; |
|
|
depth_reg<=0; |
|
|
depth_reg<=0; |
|
|
node_reg<=0; |
|
|
node_reg<=0; |
|
|
counter_reg<=0; |
|
|
|
|
|
|
|
|
// counter_reg<=0; |
|
|
tmp_L_reg<=0; |
|
|
tmp_L_reg<=0; |
|
|
tmp_R_reg<=0; |
|
|
tmp_R_reg<=0; |
|
|
tmp_U_reg<=0; |
|
|
tmp_U_reg<=0; |
|
@@ -513,7 +492,7 @@ begin |
|
|
c_state <= n_state; |
|
|
c_state <= n_state; |
|
|
depth_reg<=depth; |
|
|
depth_reg<=depth; |
|
|
node_reg<=node; |
|
|
node_reg<=node; |
|
|
counter_reg<=counter; |
|
|
|
|
|
|
|
|
// counter_reg<=counter; |
|
|
tmp_L_reg<=tmp_L; |
|
|
tmp_L_reg<=tmp_L; |
|
|
tmp_R_reg<=tmp_R; |
|
|
tmp_R_reg<=tmp_R; |
|
|
tmp_U_reg<=tmp_U; |
|
|
tmp_U_reg<=tmp_U; |
|
@@ -523,13 +502,15 @@ end |
|
|
//Combinational Logic - FSM Next State Logic |
|
|
//Combinational Logic - FSM Next State Logic |
|
|
always_comb |
|
|
always_comb |
|
|
begin |
|
|
begin |
|
|
if(in_valid==1) |
|
|
|
|
|
|
|
|
if(in_valid) |
|
|
case(c_state) |
|
|
case(c_state) |
|
|
idle: begin |
|
|
idle: begin |
|
|
depth=0; node=0; counter=0; tmp_L=0; tmp_R=0; tmp_U=0; |
|
|
|
|
|
|
|
|
depth=0; node=0; |
|
|
|
|
|
//counter=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; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
if(out_valid==1) |
|
|
|
|
|
|
|
|
if(out_valid) |
|
|
n_state=idle; |
|
|
n_state=idle; |
|
|
else |
|
|
else |
|
|
n_state=root; |
|
|
n_state=root; |
|
@@ -537,7 +518,7 @@ begin |
|
|
|
|
|
|
|
|
root: begin |
|
|
root: begin |
|
|
depth=depth_reg;node=node_reg; |
|
|
depth=depth_reg;node=node_reg; |
|
|
ena_L=1;wea_L=1;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; |
|
|
for(int k=0; k<N; k++) |
|
|
for(int k=0; k<N; k++) |
|
|
L_in[k]=y[k]; |
|
|
L_in[k]=y[k]; |
|
@@ -545,24 +526,24 @@ begin |
|
|
end |
|
|
end |
|
|
wait_L_logic: |
|
|
wait_L_logic: |
|
|
begin |
|
|
begin |
|
|
depth=depth_reg+1; node=((2*node_reg)+1); tmp_L=0; |
|
|
|
|
|
|
|
|
depth=depth_reg+1'b1; node=((2*node_reg)+1'b1); tmp_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
n_state=wait_L; |
|
|
n_state=wait_L; |
|
|
end |
|
|
end |
|
|
wait_L: begin |
|
|
wait_L: begin |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
|
|
|
// if(counter==cmax) begin |
|
|
|
|
|
// counter=counter_reg-cmax; |
|
|
n_state=state_L; |
|
|
n_state=state_L; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
|
|
|
// end |
|
|
|
|
|
// else |
|
|
|
|
|
// counter=counter_reg+1; |
|
|
end |
|
|
end |
|
|
state_L: begin |
|
|
state_L: begin |
|
|
ena_L=1;wea_L=1;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_reg+1; |
|
|
|
|
|
temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
|
|
|
|
|
|
tmp_L=tmp_L_reg+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; |
|
|
jL2=(tmp_L_reg)+temp_index_f+(N/(2**depth)); |
|
|
jL2=(tmp_L_reg)+temp_index_f+(N/(2**depth)); |
|
|
fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]); |
|
|
fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]); |
|
@@ -576,26 +557,26 @@ begin |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
wait_R_logic: begin |
|
|
wait_R_logic: begin |
|
|
depth=depth_reg-1; node=node_reg+1; tmp_R=0; |
|
|
|
|
|
|
|
|
depth=depth_reg-1'b1; node=node_reg+1'b1; tmp_R=0; |
|
|
n_state=wait_R; |
|
|
n_state=wait_R; |
|
|
end |
|
|
end |
|
|
wait_R: begin |
|
|
wait_R: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=1; |
|
|
ena_v=0;wea_v=0; enb_v=1; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
|
|
|
// if(counter==cmax) begin |
|
|
|
|
|
// counter=counter_reg-cmax; |
|
|
n_state=state_R; |
|
|
n_state=state_R; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
|
|
|
// end |
|
|
|
|
|
// else |
|
|
|
|
|
// counter=counter_reg+1; |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
state_R: begin |
|
|
state_R: begin |
|
|
ena_L=1;wea_L=1;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_R=tmp_R_reg+1; |
|
|
tmp_R=tmp_R_reg+1; |
|
|
temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1))); |
|
|
|
|
|
temp_index_g=((N/(2**(depth+1)))*((2*(node-1)+1)-((2**(depth+1))-1))); |
|
|
|
|
|
|
|
|
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))); |
|
|
jR1=(tmp_R_reg)+temp_index_g; |
|
|
jR1=(tmp_R_reg)+temp_index_g; |
|
|
jR2=(tmp_R_reg)+temp_index_g+(N/(2**depth)); |
|
|
jR2=(tmp_R_reg)+temp_index_g+(N/(2**depth)); |
|
|
jR3=(tmp_R_reg)+temp_index_f; |
|
|
jR3=(tmp_R_reg)+temp_index_f; |
|
@@ -612,24 +593,24 @@ begin |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
wait_U_logic: begin |
|
|
wait_U_logic: begin |
|
|
depth=depth_reg-1; node=(node_reg-2)/2; tmp_U=0; |
|
|
|
|
|
|
|
|
depth=depth_reg-1'b1; node=(node_reg-2)/2; tmp_U=0; |
|
|
n_state=wait_U; |
|
|
n_state=wait_U; |
|
|
end |
|
|
end |
|
|
wait_U: begin |
|
|
wait_U: begin |
|
|
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; |
|
|
ena_v=0;wea_v=0; enb_v=1; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
|
|
|
// if(counter==cmax) begin |
|
|
|
|
|
// counter=counter_reg-cmax; |
|
|
n_state=state_U; |
|
|
n_state=state_U; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
|
|
|
// end |
|
|
|
|
|
// else |
|
|
|
|
|
// counter=counter_reg+1; |
|
|
end |
|
|
end |
|
|
state_U: begin |
|
|
state_U: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
|
|
|
tmp_U=tmp_U_reg+1; |
|
|
|
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
|
|
|
|
|
|
ena_v=1'b1;wea_v=1'b1; enb_v=0; |
|
|
|
|
|
tmp_U=tmp_U_reg+1'b1; |
|
|
|
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1'b1)-((2**(depth))-1'b1))); |
|
|
jU1=(tmp_U_reg)+temp_index_f; |
|
|
jU1=(tmp_U_reg)+temp_index_f; |
|
|
jU2=(tmp_U_reg)+temp_index_f+(N/(2**(depth))); |
|
|
jU2=(tmp_U_reg)+temp_index_f+(N/(2**(depth))); |
|
|
v_in[jU1] = v_out[jU1] ^ v_out[jU2]; |
|
|
v_in[jU1] = v_out[jU1] ^ v_out[jU2]; |
|
@@ -637,7 +618,7 @@ begin |
|
|
|
|
|
|
|
|
if(tmp_U<(N/(2**(depth)))) |
|
|
if(tmp_U<(N/(2**(depth)))) |
|
|
n_state=state_U; |
|
|
n_state=state_U; |
|
|
else if(depth>0 && node%2==0) |
|
|
|
|
|
|
|
|
else if(depth>0 && ~node[0]) |
|
|
n_state = wait_U_logic; |
|
|
n_state = wait_U_logic; |
|
|
else if(depth>0 && node!=0) |
|
|
else if(depth>0 && node!=0) |
|
|
n_state=wait_R_logic; |
|
|
n_state=wait_R_logic; |
|
@@ -645,24 +626,24 @@ begin |
|
|
n_state=wait_lstate_logic; |
|
|
n_state=wait_lstate_logic; |
|
|
end |
|
|
end |
|
|
wait_LRU_logic: begin |
|
|
wait_LRU_logic: begin |
|
|
depth=depth_reg; node=(node_reg-1)/2; |
|
|
|
|
|
|
|
|
depth=depth_reg; node=(node_reg-1'b1)/2; |
|
|
n_state=wait_LRU; |
|
|
n_state=wait_LRU; |
|
|
end |
|
|
end |
|
|
wait_LRU: begin |
|
|
wait_LRU: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
|
|
|
|
|
|
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; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
|
|
|
// if(counter==cmax) begin |
|
|
|
|
|
// counter=counter_reg-cmax; |
|
|
n_state=state_LRU; |
|
|
n_state=state_LRU; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
|
|
|
// end |
|
|
|
|
|
// else |
|
|
|
|
|
// counter=counter_reg+1; |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
state_LRU: begin |
|
|
state_LRU: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_v=1;wea_v=1; enb_v=0; |
|
|
|
|
|
temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1))); |
|
|
|
|
|
|
|
|
ena_v=1'b1;wea_v=1'b1; enb_v=0; |
|
|
|
|
|
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]); |
|
|
u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0); |
|
|
u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0); |
|
|
g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]); |
|
|
g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]); |
|
@@ -670,7 +651,7 @@ begin |
|
|
v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N]; |
|
|
v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N]; |
|
|
v_in[temp_index_f+1]=u[(2*node)+3-N]; |
|
|
v_in[temp_index_f+1]=u[(2*node)+3-N]; |
|
|
|
|
|
|
|
|
if(node%2==1) |
|
|
|
|
|
|
|
|
if(node[0]==1) |
|
|
n_state = wait_R_logic; |
|
|
n_state = wait_R_logic; |
|
|
else |
|
|
else |
|
|
n_state=wait_U_logic; |
|
|
n_state=wait_U_logic; |
|
@@ -682,12 +663,12 @@ begin |
|
|
wait_lnode: begin |
|
|
wait_lnode: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
|
|
|
// if(counter==cmax) begin |
|
|
|
|
|
// counter=counter_reg-cmax; |
|
|
n_state=state_lnode; |
|
|
n_state=state_lnode; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
|
|
|
// end |
|
|
|
|
|
// else |
|
|
|
|
|
// counter=counter_reg+1; |
|
|
end |
|
|
end |
|
|
state_lnode: begin |
|
|
state_lnode: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
@@ -708,12 +689,12 @@ begin |
|
|
wait_lstate: begin |
|
|
wait_lstate: begin |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_L=0;wea_L=0;enb_L=1; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
ena_v=0;wea_v=0; enb_v=0; |
|
|
if(counter==cmax) begin |
|
|
|
|
|
counter=counter_reg-cmax; |
|
|
|
|
|
|
|
|
// if(counter==cmax) begin |
|
|
|
|
|
// counter=counter_reg-cmax; |
|
|
n_state=state_last; |
|
|
n_state=state_last; |
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
counter=counter_reg+1; |
|
|
|
|
|
|
|
|
// end |
|
|
|
|
|
// else |
|
|
|
|
|
// counter=counter_reg+1; |
|
|
end |
|
|
end |
|
|
state_last: begin |
|
|
state_last: begin |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
|
ena_L=0;wea_L=0;enb_L=0; |
|
@@ -725,4 +706,3 @@ begin |
|
|
else n_state = idle; |
|
|
else n_state = idle; |
|
|
end |
|
|
end |
|
|
endmodule |
|
|
endmodule |
|
|
*/ |
|
|
|