You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

709 line
26 KiB

  1. /*`timescale 1ns / 1ns
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 02/24/2021 08:03:07 PM
  7. // Design Name:
  8. // Module Name: sc_decoder_fsm
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. `define BITS 8
  22. module sc_decoder_fsm #(parameter BITS=8, N=11'd16)(
  23. input clk, rst,
  24. input in_valid,
  25. input signed [N-1:0][BITS-1:0]y,
  26. input [N-1:0]f,
  27. output logic [N-1:0]u_cap,
  28. output logic [N-1:0]v_final,
  29. output logic out_valid
  30. );
  31. // Function to calculate f(r1,r2) = sgn(r1) * sgn(r2) * min(|r1|,|r2|)
  32. function void fminsum_calc;
  33. input signed [`BITS-1:0] a;
  34. input signed [`BITS-1:0] b;
  35. output signed [`BITS-1:0] c;
  36. logic [`BITS-2:0] abs_a;
  37. logic [`BITS-2:0] abs_b;
  38. logic [`BITS-2:0] abs_c;
  39. // Mod value of a and b
  40. abs_a = (a[`BITS-1]) ? ~a[`BITS-2:0] + 1'b1 : a[`BITS-2:0];
  41. abs_b = (b[`BITS-1]) ? ~b[`BITS-2:0] + 1'b1 : b[`BITS-2:0];
  42. // Multiplication of sign i.e. XOR
  43. c[`BITS-1] = a[`BITS-1] ^ b[`BITS-1];
  44. // Minimum value between a and b
  45. abs_c = (abs_b < abs_a) ? abs_b : abs_a;
  46. // Final Minsum of a and b
  47. c[`BITS-2:0] = (c[`BITS-1]) ? ~abs_c + 1'b1 : abs_c;
  48. endfunction
  49. // Function to Calculate g(r1,r2,u) = r2 + ((1-2u) * r1)
  50. function void g_calc;
  51. input signed [`BITS-1:0] a;
  52. input signed [`BITS-1:0] b;
  53. input u;
  54. output signed [`BITS:0] c;
  55. // when u == 0 => c = b - a
  56. // When u == 1 => c = b + a
  57. c = u ? (b + (~a+1)) : (b + a) ;
  58. endfunction
  59. //parameters and signals declarations
  60. localparam d=$clog2(N); //N=4, d=2(0 & 1)
  61. logic [N-1:0]u;
  62. logic [d:0]temp_index_f,temp_index_g;
  63. reg signed [BITS-1:0] LRU[2];
  64. reg [N-1:0]v;
  65. logic [N-1:0][BITS-1:0]L_in, L_out;
  66. logic [N-1:0]v_in, v_out;
  67. logic ena_v,enb_v,wea_v;
  68. logic ena_L,enb_L,wea_L;
  69. logic [1:0]counter,counter_reg;
  70. logic [11:0]jL1,jL2,jR1,jR2,jR3,jU1,jU2;
  71. logic [4:0] c_state, n_state;
  72. wire [N-1:0]u_cap_1;
  73. wire [N-1:0]v_final_1;
  74. //wire out_valid_1;
  75. //Auxiliary registers declarations
  76. logic [d:0] depth,depth_reg;
  77. logic [d:0] node,node_reg;
  78. logic [11:0]tmp_L,tmp_L_reg, tmp_R,tmp_R_reg,tmp_U, tmp_U_reg;
  79. //FSM States
  80. localparam idle=5'd0, root=5'd1, wait_L_logic=5'd2, wait_L=5'd3, state_L=5'd4, wait_R_logic=5'd5, wait_R=5'd6, state_R=5'd7;
  81. localparam wait_U_logic=5'd8, wait_U=5'd9, state_U=5'd10,wait_LRU_logic=5'd11, wait_LRU=5'd12, state_LRU=5'd13;
  82. localparam wait_lnode_logic=5'd14, wait_lnode=5'd15, state_lnode=5'd16,wait_lstate_logic=5'd17, wait_lstate=5'd18, state_last=5'd19;
  83. //BlockRAM Instantiations
  84. bram_v #(.ADDR_WIDTH(d-1),.DATA_WIDTH(N),.DEPTH(2**(d-1))) bram_v_i (
  85. .clk(clk),.ena(ena_v),.enb(enb_v),
  86. .addra(depth_reg-1'b1),
  87. .addrb(depth_reg),
  88. .wea(wea_v),
  89. .dia(v_in),
  90. .dob(v_out)
  91. );
  92. bram_L #(.ADDR_WIDTH(d-1),.DATA_WIDTH(N*BITS),.DEPTH(2**(d-1)),.N(N)) bram_L_i (
  93. .clk(clk),.ena(ena_L),.enb(enb_L),
  94. .addra(depth_reg),
  95. .addrb(depth_reg-1'b1),
  96. .wea(wea_L),
  97. .dia(L_in),
  98. .dob(L_out)
  99. );
  100. //output assignment
  101. for(genvar i=0; i<N; i++)
  102. begin
  103. assign u_cap_1[i] = u[i];
  104. end
  105. assign v_final_1 = v;
  106. // assign out_valid_1 = (n_state == state_lnode) ? 1'b1 : 1'b0;
  107. assign out_valid=(n_state==state_last)?1'b1:1'b0;
  108. // Sequential Logic - FSM State and Data Registers
  109. always_ff@(posedge clk)
  110. begin
  111. if(rst==1)
  112. begin
  113. u_cap <= 'b0;
  114. v_final <= 'b0;
  115. c_state <= idle;
  116. depth_reg<=0;
  117. node_reg<=0;
  118. counter_reg<=0;
  119. tmp_L_reg<=0;
  120. tmp_R_reg<=0;
  121. tmp_U_reg<=0;
  122. end
  123. else
  124. begin
  125. // out_valid <= out_valid_1;
  126. // v_final <= v_final_1;
  127. if(out_valid)
  128. begin
  129. u_cap <= u;
  130. end
  131. else
  132. begin
  133. u_cap <= u_cap;
  134. end
  135. c_state <= n_state;
  136. depth_reg<=depth;
  137. node_reg<=node;
  138. counter_reg<=counter;
  139. tmp_L_reg<=tmp_L;
  140. tmp_R_reg<=tmp_R;
  141. tmp_U_reg<=tmp_U;
  142. end
  143. end
  144. //Combinational Logic - FSM Next State Logic
  145. always_comb
  146. begin
  147. // depth=0; node=0;
  148. // ena_L=0;wea_L=0;enb_L=0;
  149. tmp_L=0; tmp_R=0; tmp_U=0;
  150. counter=0; ena_v=0;wea_v=0; enb_v=0; n_state = 0;
  151. if(in_valid==1)
  152. case(c_state)
  153. idle: begin
  154. depth=0; node=0; counter=0; tmp_L=0; tmp_R=0; tmp_U=0;
  155. ena_L=0;wea_L=0;enb_L=0;
  156. ena_v=0;wea_v=0; enb_v=0;
  157. if(out_valid==1)
  158. n_state=idle;
  159. else
  160. n_state=root;
  161. end
  162. root: begin
  163. depth=depth_reg;node=node_reg;
  164. ena_L=1;wea_L=1;enb_L=0;
  165. ena_v=0;wea_v=0; enb_v=0;
  166. for(int k=0; k<N; k++)
  167. L_in[k]=y[k];
  168. n_state=wait_L_logic;
  169. end
  170. wait_L_logic:
  171. begin
  172. depth=depth_reg+1; node=((2*node_reg)+1); tmp_L=0;
  173. ena_L=0;wea_L=0;enb_L=1;
  174. ena_v=0;wea_v=0; enb_v=0;
  175. n_state=wait_L;
  176. end
  177. wait_L: begin
  178. n_state=state_L;
  179. end
  180. state_L: begin
  181. ena_L=1;wea_L=1;enb_L=0;
  182. ena_v=0;wea_v=0; enb_v=0;
  183. tmp_L=tmp_L_reg+1;
  184. temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1)));
  185. // temp_index_f=((N>>(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1)));
  186. jL1=(tmp_L_reg)+temp_index_f;
  187. jL2=(tmp_L_reg)+temp_index_f+(N/(2**depth));
  188. // jL2=(tmp_L_reg)+temp_index_f+(N>>(2**depth));
  189. fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]);
  190. if(tmp_L< (N/(2**depth)))
  191. // if(tmp_L< (N>>(2**depth)))
  192. n_state=state_L;
  193. else if(depth<d)
  194. n_state=wait_L_logic;
  195. else
  196. n_state=wait_LRU_logic;
  197. end
  198. wait_R_logic: begin
  199. depth=depth_reg-1; node=node_reg+1; tmp_R=0;
  200. n_state=wait_R;
  201. end
  202. wait_R: begin
  203. ena_L=0;wea_L=0;enb_L=1;
  204. ena_v=0;wea_v=0; enb_v=1;
  205. n_state=state_R;
  206. end
  207. state_R: begin
  208. ena_L=1;wea_L=1;enb_L=0;
  209. ena_v=0;wea_v=0; enb_v=0;
  210. tmp_R=tmp_R_reg+1;
  211. temp_index_f=((N/(2**(depth+1)))*((2*(node)+1)-((2**(depth+1))-1)));
  212. temp_index_g=((N/(2**(depth+1)))*((2*(node-1)+1)-((2**(depth+1))-1)));
  213. jR1=(tmp_R_reg)+temp_index_g;
  214. jR2=(tmp_R_reg)+temp_index_g+(N/(2**depth));
  215. jR3=(tmp_R_reg)+temp_index_f;
  216. g_calc(L_out[jR1],L_out[jR2],v_out[jR1],L_in[jR3]);
  217. if(tmp_R< (N/(2**depth)))
  218. n_state=state_R;
  219. else if(node==((2**d)-2))
  220. n_state=wait_lnode_logic;
  221. else if(depth==d)
  222. n_state=wait_LRU_logic;
  223. else
  224. n_state = wait_L_logic;
  225. end
  226. wait_U_logic: begin
  227. depth=depth_reg-1; node=(node_reg-2)/2; tmp_U=0;
  228. n_state=wait_U;
  229. end
  230. wait_U: begin
  231. ena_L=0;wea_L=0;enb_L=0;
  232. ena_v=0;wea_v=0; enb_v=1;
  233. n_state=state_U;
  234. end
  235. state_U: begin
  236. ena_L=0;wea_L=0;enb_L=0;
  237. ena_v=1;wea_v=1; enb_v=0;
  238. tmp_U=tmp_U_reg+1;
  239. temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1)));
  240. jU1=(tmp_U_reg)+temp_index_f;
  241. jU2=(tmp_U_reg)+temp_index_f+(N/(2**(depth)));
  242. v_in[jU1] = v_out[jU1] ^ v_out[jU2];
  243. v_in[jU2] = v_out[jU2];
  244. if(tmp_U<(N/(2**(depth))))
  245. n_state=state_U;
  246. // else if(depth>0 && node%2==0)
  247. else if(depth>0 && node[0]==0)
  248. n_state = wait_U_logic;
  249. else if(depth>0 && node!=0)
  250. n_state=wait_R_logic;
  251. else
  252. n_state=wait_lstate_logic;
  253. end
  254. wait_LRU_logic: begin
  255. depth=depth_reg; node=(node_reg-1)/2;
  256. // depth=depth_reg; node=(node_reg-1)>>1;
  257. n_state=wait_LRU;
  258. end
  259. wait_LRU: begin
  260. ena_L=0;wea_L=0;enb_L=1;
  261. ena_v=0;wea_v=0; enb_v=0;
  262. n_state=state_LRU;
  263. end
  264. state_LRU: begin
  265. ena_L=0;wea_L=0;enb_L=0;
  266. ena_v=1;wea_v=1; enb_v=0;
  267. temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1)));
  268. // temp_index_f=((N>>(2**(depth)))*((2*node+1)-((2**(depth))-1)));
  269. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f+1],LRU[0]);
  270. // u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0);
  271. u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0);
  272. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  273. // u[(2*node)+3-N]=(f[(2*node)+3-N]==1) ? 0 : ((LRU[1][BITS-1] == 1) ? 1 : 0);
  274. u[(2*node)+3-N]=(f[(2*node)+3-N]) ? 0 : ((LRU[1][BITS-1]) ? 1 : 0);
  275. v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N];
  276. v_in[temp_index_f+1]=u[(2*node)+3-N];
  277. // if(node%2==1)
  278. if(node[0])
  279. n_state = wait_R_logic;
  280. else
  281. n_state=wait_U_logic;
  282. end
  283. wait_lnode_logic: begin
  284. depth=depth_reg+1; node=node_reg;
  285. n_state=wait_lnode;
  286. end
  287. wait_lnode: begin
  288. ena_L=0;wea_L=0;enb_L=1;
  289. ena_v=0;wea_v=0; enb_v=0;
  290. n_state=state_lnode;
  291. end
  292. state_lnode: begin
  293. ena_L=0;wea_L=0;enb_L=0;
  294. ena_v=1;wea_v=1; enb_v=0;
  295. temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1)));
  296. // temp_index_f=((N>>(2**(depth)))*((2*node+1)-((2**(depth))-1)));
  297. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f+1],LRU[0]);
  298. // u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0);
  299. u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0);
  300. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  301. // u[(2*node)+3-N]=(f[(2*node)+3-N]==1) ? 0 : ((LRU[1][BITS-1] == 1) ? 1 : 0);
  302. u[(2*node)+3-N]=(f[(2*node)+3-N]) ? 0 : ((LRU[1][BITS-1]) ? 1 : 0);
  303. v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N];
  304. v_in[temp_index_f+1]=u[(2*node)+3-N];
  305. n_state = wait_U_logic;
  306. end
  307. wait_lstate_logic: begin
  308. depth=depth_reg; node=node_reg;
  309. n_state=wait_lstate;
  310. end
  311. wait_lstate: begin
  312. ena_L=0;wea_L=0;enb_L=1;
  313. ena_v=0;wea_v=0; enb_v=0;
  314. n_state=state_last;
  315. end
  316. state_last: begin
  317. ena_L=0;wea_L=0;enb_L=0;
  318. ena_v=1;wea_v=1; enb_v=0;
  319. v=v_out;
  320. n_state=idle;
  321. end
  322. endcase
  323. else n_state = idle;
  324. end
  325. endmodule
  326. */
  327. `timescale 1ns / 1ns
  328. //////////////////////////////////////////////////////////////////////////////////
  329. // Company:
  330. // Engineer:
  331. //
  332. // Create Date: 02/24/2021 08:03:07 PM
  333. // Design Name:
  334. // Module Name: sc_decoder_fsm
  335. // Project Name:
  336. // Target Devices:
  337. // Tool Versions:
  338. // Description:
  339. //
  340. // Dependencies:
  341. //
  342. // Revision:
  343. // Revision 0.01 - File Created
  344. // Additional Comments:
  345. //
  346. //////////////////////////////////////////////////////////////////////////////////
  347. `define BITS 8
  348. module sc_decoder_fsm #(parameter BITS=8, N=11'd32)(
  349. input clk, rst,
  350. input in_valid,
  351. input signed [N-1:0][BITS-1:0] y,
  352. input [N-1:0]f,
  353. output wire [N-1:0]u_cap,
  354. output wire [N-1:0]v_final,
  355. output wire out_valid
  356. );
  357. //function for fminsum calculation
  358. function void fminsum_calc;
  359. input signed [`BITS-1:0] a;
  360. input signed [`BITS-1:0] b;
  361. output signed [`BITS-1:0] c;
  362. logic [`BITS-2:0] abs_a;
  363. logic [`BITS-2:0] abs_b;
  364. logic [`BITS-2:0] abs_c;
  365. abs_a = (a[`BITS-1]) ? ~a[`BITS-2:0] + 1'b1 : a[`BITS-2:0];
  366. abs_b = (b[`BITS-1]) ? ~b[`BITS-2:0] + 1'b1 : b[`BITS-2:0];
  367. c[`BITS-1] = a[`BITS-1] ^ b[`BITS-1];
  368. abs_c = (abs_b < abs_a) ? abs_b : abs_a;
  369. c[`BITS-2:0] = (c[`BITS-1]) ? ~abs_c + 1'b1 : abs_c;
  370. endfunction
  371. //function for g-value calculation
  372. function void g_calc;
  373. input signed [`BITS-1:0] a;
  374. input signed [`BITS-1:0] b;
  375. input u;
  376. output signed [`BITS:0] c;
  377. c = (u == 0) ? (b + a) : (b + (~a+1'b1));
  378. endfunction
  379. //parameters and signals declarations
  380. localparam d=$clog2(N); //N=4, d=2(0 & 1)
  381. //localparam n=2*N-1; //(2**d)-1;
  382. //localparam cmax=0;
  383. logic u[N];
  384. logic [d:0]temp_index_f,temp_index_g;
  385. reg signed [BITS-1:0] LRU[2];
  386. reg [N-1:0]v;
  387. logic [N-1:0][BITS-1:0]L_in, L_out;
  388. logic [N-1:0]v_in, v_out;
  389. logic ena_v,enb_v,wea_v;
  390. logic ena_L,enb_L,wea_L;
  391. //logic [1:0]counter,counter_reg;
  392. logic [11:0]jL1,jL2,jR1,jR2,jR3,jU1,jU2;
  393. logic [4:0] c_state, n_state;
  394. //Auxiliary registers declarations
  395. logic [d:0] depth,depth_reg;
  396. logic [d:0] node,node_reg;
  397. logic [11:0]tmp_L,tmp_L_reg, tmp_R,tmp_R_reg,tmp_U, tmp_U_reg;
  398. //FSM States
  399. localparam idle=5'd0, root=5'd1, wait_L_logic=5'd2, wait_L=5'd3, state_L=5'd4, wait_R_logic=5'd5, wait_R=5'd6, state_R=5'd7;
  400. localparam wait_U_logic=5'd8, wait_U=5'd9, state_U=5'd10,wait_LRU_logic=5'd11, wait_LRU=5'd12, state_LRU=5'd13;
  401. localparam wait_lnode_logic=5'd14, wait_lnode=5'd15, state_lnode=5'd16,wait_lstate_logic=5'd17, wait_lstate=5'd18, state_last=5'd19;
  402. //BlockRAM Instantiations
  403. bram_v #(.ADDR_WIDTH(d-1),.DATA_WIDTH(N),.DEPTH(2**(d-1))) bram_v_i (
  404. .clk(clk),.ena(ena_v),.enb(enb_v),
  405. .addra(depth_reg-1),
  406. .addrb(depth_reg),
  407. .wea(wea_v),
  408. .dia(v_in),
  409. .dob(v_out)
  410. );
  411. bram_L #(.ADDR_WIDTH(d-1),.DATA_WIDTH(N*BITS),.DEPTH(2**(d-1)),.N(N)) bram_L_i (
  412. .clk(clk),.ena(ena_L),.enb(enb_L),
  413. .addra(depth_reg),
  414. .addrb(depth_reg-1),
  415. .wea(wea_L),
  416. .dia(L_in),
  417. .dob(L_out)
  418. );
  419. //output assignment
  420. for(genvar i=0; i<N; i++)
  421. begin
  422. assign u_cap[i] = u[i];
  423. end
  424. assign v_final=v;
  425. assign out_valid=(n_state==state_last)?1'b1:1'b0;
  426. // Sequential Logic - FSM State and Data Registers
  427. always_ff@(posedge clk)
  428. begin
  429. if(rst==1)
  430. begin
  431. c_state <= idle;
  432. depth_reg<=0;
  433. node_reg<=0;
  434. // counter_reg<=0;
  435. tmp_L_reg<=0;
  436. tmp_R_reg<=0;
  437. tmp_U_reg<=0;
  438. end
  439. else
  440. begin
  441. c_state <= n_state;
  442. depth_reg<=depth;
  443. node_reg<=node;
  444. // counter_reg<=counter;
  445. tmp_L_reg<=tmp_L;
  446. tmp_R_reg<=tmp_R;
  447. tmp_U_reg<=tmp_U;
  448. end
  449. end
  450. //Combinational Logic - FSM Next State Logic
  451. always_comb
  452. begin
  453. if(in_valid)
  454. case(c_state)
  455. idle: begin
  456. depth=0; node=0;
  457. //counter=0;
  458. tmp_L=0; tmp_R=0; tmp_U=0;
  459. ena_L=0;wea_L=0;enb_L=0;
  460. ena_v=0;wea_v=0; enb_v=0;
  461. if(out_valid)
  462. n_state=idle;
  463. else
  464. n_state=root;
  465. end
  466. root: begin
  467. depth=depth_reg;node=node_reg;
  468. ena_L=1'b1;wea_L=1'b1;enb_L=0;
  469. ena_v=0;wea_v=0; enb_v=0;
  470. for(int k=0; k<N; k++)
  471. L_in[k]=y[k];
  472. n_state=wait_L_logic;
  473. end
  474. wait_L_logic:
  475. begin
  476. depth=depth_reg+1'b1; node=((2*node_reg)+1'b1); tmp_L=0;
  477. ena_L=0;wea_L=0;enb_L=1;
  478. ena_v=0;wea_v=0; enb_v=0;
  479. n_state=wait_L;
  480. end
  481. wait_L: begin
  482. // if(counter==cmax) begin
  483. // counter=counter_reg-cmax;
  484. n_state=state_L;
  485. // end
  486. // else
  487. // counter=counter_reg+1;
  488. end
  489. state_L: begin
  490. ena_L=1'b1;wea_L=1'b1;enb_L=0;
  491. ena_v=0;wea_v=0; enb_v=0;
  492. tmp_L=tmp_L_reg+1'b1;
  493. temp_index_f=((N/(2**(depth+1'b1)))*((2*(node)+1'b1)-((2**(depth+1'b1))-1'b1)));
  494. jL1=(tmp_L_reg)+temp_index_f;
  495. jL2=(tmp_L_reg)+temp_index_f+(N/(2**depth));
  496. fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]);
  497. if(tmp_L< (N/(2**depth)))
  498. n_state=state_L;
  499. else if(depth<d)
  500. n_state=wait_L_logic;
  501. else
  502. n_state=wait_LRU_logic;
  503. end
  504. wait_R_logic: begin
  505. depth=depth_reg-1'b1; node=node_reg+1'b1; tmp_R=0;
  506. n_state=wait_R;
  507. end
  508. wait_R: begin
  509. ena_L=0;wea_L=0;enb_L=1;
  510. ena_v=0;wea_v=0; enb_v=1;
  511. // if(counter==cmax) begin
  512. // counter=counter_reg-cmax;
  513. n_state=state_R;
  514. // end
  515. // else
  516. // counter=counter_reg+1;
  517. end
  518. state_R: begin
  519. ena_L=1'b1;wea_L=1'b1;enb_L=0;
  520. ena_v=0;wea_v=0; enb_v=0;
  521. tmp_R=tmp_R_reg+1;
  522. temp_index_f=((N/(2**(depth+1'b1)))*((2*(node)+1'b1)-((2**(depth+1'b1))-1'b1)));
  523. temp_index_g=((N/(2**(depth+1'b1)))*((2*(node-1'b1)+1'b1)-((2**(depth+1'b1))-1'b1)));
  524. jR1=(tmp_R_reg)+temp_index_g;
  525. jR2=(tmp_R_reg)+temp_index_g+(N/(2**depth));
  526. jR3=(tmp_R_reg)+temp_index_f;
  527. g_calc(L_out[jR1],L_out[jR2],v_out[jR1],L_in[jR3]);
  528. if(tmp_R< (N/(2**depth)))
  529. n_state=state_R;
  530. else if(node==((2**d)-2))
  531. n_state=wait_lnode_logic;
  532. else if(depth==d)
  533. n_state=wait_LRU_logic;
  534. else
  535. n_state = wait_L_logic;
  536. end
  537. wait_U_logic: begin
  538. depth=depth_reg-1'b1; node=(node_reg-2)/2; tmp_U=0;
  539. n_state=wait_U;
  540. end
  541. wait_U: begin
  542. ena_L=0;wea_L=0;enb_L=0;
  543. ena_v=0;wea_v=0; enb_v=1;
  544. // if(counter==cmax) begin
  545. // counter=counter_reg-cmax;
  546. n_state=state_U;
  547. // end
  548. // else
  549. // counter=counter_reg+1;
  550. end
  551. state_U: begin
  552. ena_L=0;wea_L=0;enb_L=0;
  553. ena_v=1'b1;wea_v=1'b1; enb_v=0;
  554. tmp_U=tmp_U_reg+1'b1;
  555. temp_index_f=((N/(2**(depth)))*((2*node+1'b1)-((2**(depth))-1'b1)));
  556. jU1=(tmp_U_reg)+temp_index_f;
  557. jU2=(tmp_U_reg)+temp_index_f+(N/(2**(depth)));
  558. v_in[jU1] = v_out[jU1] ^ v_out[jU2];
  559. v_in[jU2] = v_out[jU2];
  560. if(tmp_U<(N/(2**(depth))))
  561. n_state=state_U;
  562. else if(depth>0 && ~node[0])
  563. n_state = wait_U_logic;
  564. else if(depth>0 && node!=0)
  565. n_state=wait_R_logic;
  566. else
  567. n_state=wait_lstate_logic;
  568. end
  569. wait_LRU_logic: begin
  570. depth=depth_reg; node=(node_reg-1'b1)/2;
  571. n_state=wait_LRU;
  572. end
  573. wait_LRU: begin
  574. ena_L=0;wea_L=0;enb_L=1'b1;
  575. ena_v=0;wea_v=0; enb_v=0;
  576. // if(counter==cmax) begin
  577. // counter=counter_reg-cmax;
  578. n_state=state_LRU;
  579. // end
  580. // else
  581. // counter=counter_reg+1;
  582. end
  583. state_LRU: begin
  584. ena_L=0;wea_L=0;enb_L=0;
  585. ena_v=1'b1;wea_v=1'b1; enb_v=0;
  586. temp_index_f=((N/(2**(depth)))*((2*node+1'b1)-((2**(depth))-1'b1)));
  587. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f+1],LRU[0]);
  588. u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0);
  589. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  590. u[(2*node)+3-N]=(f[(2*node)+3-N]==1) ? 0 : ((LRU[1][BITS-1] == 1) ? 1 : 0);
  591. v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N];
  592. v_in[temp_index_f+1]=u[(2*node)+3-N];
  593. if(node[0]==1)
  594. n_state = wait_R_logic;
  595. else
  596. n_state=wait_U_logic;
  597. end
  598. wait_lnode_logic: begin
  599. depth=depth_reg+1; node=node_reg;
  600. n_state=wait_lnode;
  601. end
  602. wait_lnode: begin
  603. ena_L=0;wea_L=0;enb_L=1;
  604. ena_v=0;wea_v=0; enb_v=0;
  605. // if(counter==cmax) begin
  606. // counter=counter_reg-cmax;
  607. n_state=state_lnode;
  608. // end
  609. // else
  610. // counter=counter_reg+1;
  611. end
  612. state_lnode: begin
  613. ena_L=0;wea_L=0;enb_L=0;
  614. ena_v=1;wea_v=1; enb_v=0;
  615. temp_index_f=((N/(2**(depth)))*((2*node+1)-((2**(depth))-1)));
  616. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f+1],LRU[0]);
  617. u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0);
  618. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  619. u[(2*node)+3-N]=(f[(2*node)+3-N]==1) ? 0 : ((LRU[1][BITS-1] == 1) ? 1 : 0);
  620. v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N];
  621. v_in[temp_index_f+1]=u[(2*node)+3-N];
  622. n_state = wait_U_logic;
  623. end
  624. wait_lstate_logic: begin
  625. depth=depth_reg; node=node_reg;
  626. n_state=wait_lstate;
  627. end
  628. wait_lstate: begin
  629. ena_L=0;wea_L=0;enb_L=1;
  630. ena_v=0;wea_v=0; enb_v=0;
  631. // if(counter==cmax) begin
  632. // counter=counter_reg-cmax;
  633. n_state=state_last;
  634. // end
  635. // else
  636. // counter=counter_reg+1;
  637. end
  638. state_last: begin
  639. ena_L=0;wea_L=0;enb_L=0;
  640. ena_v=1;wea_v=1; enb_v=0;
  641. v=v_out;
  642. n_state=idle;
  643. end
  644. endcase
  645. else n_state = idle;
  646. end
  647. endmodule