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.

718 lines
27 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'd128)(
  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_lnode)?1'b1:1'b0;
  426. // assign out_valid=(n_state==state_last)?1'b1:1'b0;
  427. // Sequential Logic - FSM State and Data Registers
  428. always_ff@(posedge clk)
  429. begin
  430. if(rst==1)
  431. begin
  432. c_state <= idle;
  433. depth_reg<=0;
  434. node_reg<=0;
  435. // counter_reg<=0;
  436. tmp_L_reg<=0;
  437. tmp_R_reg<=0;
  438. tmp_U_reg<=0;
  439. end
  440. else
  441. begin
  442. c_state <= n_state;
  443. depth_reg<=depth;
  444. node_reg<=node;
  445. // counter_reg<=counter;
  446. tmp_L_reg<=tmp_L;
  447. tmp_R_reg<=tmp_R;
  448. tmp_U_reg<=tmp_U;
  449. end
  450. end
  451. //Combinational Logic - FSM Next State Logic
  452. always_comb
  453. begin
  454. if(in_valid)
  455. case(c_state)
  456. idle: begin
  457. depth=0; node=0;
  458. //counter=0;
  459. tmp_L=0; tmp_R=0; tmp_U=0;
  460. ena_L=0;wea_L=0;enb_L=0;
  461. ena_v=0;wea_v=0; enb_v=0;
  462. if(out_valid)
  463. n_state=idle;
  464. else
  465. n_state=root;
  466. end
  467. root: begin
  468. depth=depth_reg;node=node_reg;
  469. ena_L=1'b1;wea_L=1'b1;enb_L=0;
  470. ena_v=0;wea_v=0; enb_v=0;
  471. for(int k=0; k<N; k++)
  472. L_in[k]=y[k];
  473. n_state=wait_L_logic;
  474. end
  475. wait_L_logic:
  476. begin
  477. depth=depth_reg+1'b1; node=((2*node_reg)+1'b1); tmp_L=0;
  478. ena_L=0;wea_L=0;enb_L=1'b1;
  479. ena_v=0;wea_v=0; enb_v=0;
  480. n_state=wait_L;
  481. end
  482. wait_L: begin
  483. // if(counter==cmax) begin
  484. // counter=counter_reg-cmax;
  485. n_state=state_L;
  486. // end
  487. // else
  488. // counter=counter_reg+1;
  489. end
  490. state_L: begin
  491. ena_L=1'b1;wea_L=1'b1;enb_L=0;
  492. ena_v=0;wea_v=0; enb_v=0;
  493. tmp_L=tmp_L_reg+1'b1;
  494. temp_index_f=((N/(2**(depth+1'b1)))*((2*(node)+1'b1)-((2**(depth+1'b1))-1'b1)));
  495. jL1=(tmp_L_reg)+temp_index_f;
  496. jL2=(tmp_L_reg)+temp_index_f+(N/(2**depth));
  497. fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]);
  498. if(tmp_L< (N/(2**depth)))
  499. n_state=state_L;
  500. else if(depth<d)
  501. n_state=wait_L_logic;
  502. else
  503. n_state=wait_LRU_logic;
  504. end
  505. wait_R_logic: begin
  506. depth=depth_reg-1'b1; node=node_reg+1'b1; tmp_R=0;
  507. n_state=wait_R;
  508. end
  509. wait_R: begin
  510. ena_L=0;wea_L=0;enb_L=1'b1;
  511. ena_v=0;wea_v=0; enb_v=1'b1;
  512. // if(counter==cmax) begin
  513. // counter=counter_reg-cmax;
  514. n_state=state_R;
  515. // end
  516. // else
  517. // counter=counter_reg+1;
  518. end
  519. state_R: begin
  520. ena_L=1'b1;wea_L=1'b1;enb_L=0;
  521. ena_v=0;wea_v=0; enb_v=0;
  522. tmp_R=tmp_R_reg+1'b1;
  523. temp_index_f=((N/(2**(depth+1'b1)))*((2*(node)+1'b1)-((2**(depth+1'b1))-1'b1)));
  524. temp_index_g=((N/(2**(depth+1'b1)))*((2*(node-1'b1)+1'b1)-((2**(depth+1'b1))-1'b1)));
  525. jR1=(tmp_R_reg)+temp_index_g;
  526. jR2=(tmp_R_reg)+temp_index_g+(N/(2**depth));
  527. jR3=(tmp_R_reg)+temp_index_f;
  528. g_calc(L_out[jR1],L_out[jR2],v_out[jR1],L_in[jR3]);
  529. if(tmp_R< (N/(2**depth)))
  530. n_state=state_R;
  531. else if(node==((2**d)-2))
  532. n_state=wait_lnode_logic;
  533. else if(depth==d)
  534. n_state=wait_LRU_logic;
  535. else
  536. n_state = wait_L_logic;
  537. end
  538. wait_U_logic: begin
  539. // depth=depth_reg-1'b1; node=(node_reg-2)/2; tmp_U=0;
  540. depth=depth_reg-1'b1; node=(node_reg-2)>>1; tmp_U=0;
  541. n_state=wait_U;
  542. end
  543. wait_U: begin
  544. ena_L=0;wea_L=0;enb_L=0;
  545. ena_v=0;wea_v=0; enb_v=1'b1;
  546. // if(counter==cmax) begin
  547. // counter=counter_reg-cmax;
  548. n_state=state_U;
  549. // end
  550. // else
  551. // counter=counter_reg+1;
  552. end
  553. state_U: begin
  554. ena_L=0;wea_L=0;enb_L=0;
  555. ena_v=1'b1;wea_v=1'b1; enb_v=0;
  556. tmp_U=tmp_U_reg+1'b1;
  557. temp_index_f=((N/(2**(depth)))*((2*node+1'b1)-((2**(depth))-1'b1)));
  558. jU1=(tmp_U_reg)+temp_index_f;
  559. jU2=(tmp_U_reg)+temp_index_f+(N/(2**(depth)));
  560. v_in[jU1] = v_out[jU1] ^ v_out[jU2];
  561. v_in[jU2] = v_out[jU2];
  562. if(tmp_U<(N/(2**(depth))))
  563. n_state=state_U;
  564. else if(depth>0 && ~node[0])
  565. n_state = wait_U_logic;
  566. else if(depth>0 && node!=0)
  567. n_state=wait_R_logic;
  568. else
  569. n_state=wait_lstate_logic;
  570. end
  571. wait_LRU_logic: begin
  572. // depth=depth_reg; node=(node_reg-1'b1)/2;
  573. depth=depth_reg; node=(node_reg-1'b1)>>1;
  574. n_state=wait_LRU;
  575. end
  576. wait_LRU: begin
  577. ena_L=0;wea_L=0;enb_L=1'b1;
  578. ena_v=0;wea_v=0; enb_v=0;
  579. // if(counter==cmax) begin
  580. // counter=counter_reg-cmax;
  581. n_state=state_LRU;
  582. // end
  583. // else
  584. // counter=counter_reg+1;
  585. end
  586. state_LRU: begin
  587. ena_L=0;wea_L=0;enb_L=0;
  588. ena_v=1'b1;wea_v=1'b1; enb_v=0;
  589. temp_index_f=((N/(2**(depth)))*((2*node+1'b1)-((2**(depth))-1'b1)));
  590. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f+1],LRU[0]);
  591. // u[(2*node)+2-N]=(f[(2*node)+2-N]==1) ? 0 : ((LRU[0][BITS-1] == 1) ? 1 : 0);
  592. u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0);
  593. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  594. //u[(2*node)+3-N]=(f[(2*node)+3-N]==1) ? 0 : ((LRU[1][BITS-1] == 1) ? 1 : 0);
  595. u[(2*node)+3-N]=(f[(2*node)+3-N]) ? 0 : ((LRU[1][BITS-1]) ? 1 : 0);
  596. v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N];
  597. v_in[temp_index_f+1]=u[(2*node)+3-N];
  598. // if(node[0]==1)
  599. if(node[0])
  600. n_state = wait_R_logic;
  601. else
  602. n_state=wait_U_logic;
  603. end
  604. wait_lnode_logic: begin
  605. depth=depth_reg+1'b1; node=node_reg;
  606. n_state=wait_lnode;
  607. end
  608. wait_lnode: begin
  609. ena_L=0;wea_L=0;enb_L=1'b1;
  610. ena_v=0;wea_v=0; enb_v=0;
  611. // if(counter==cmax) begin
  612. // counter=counter_reg-cmax;
  613. n_state=state_lnode;
  614. // end
  615. // else
  616. // counter=counter_reg+1;
  617. end
  618. state_lnode: begin
  619. ena_L=0;wea_L=0;enb_L=0;
  620. ena_v=1'b1;wea_v=1'b1; enb_v=0;
  621. temp_index_f=((N/(2**(depth)))*((2*node+1'b1)-((2**(depth))-1'b1)));
  622. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f+1],LRU[0]);
  623. // u[(2*node)+2-N]=(f[(2*node)+2-N]==1'b1) ? 0 : ((LRU[0][BITS-1] == 1'b1) ? 1'b1 : 0);
  624. u[(2*node)+2-N]=(f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1'b1 : 0);
  625. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  626. // u[(2*node)+3-N]=(f[(2*node)+3-N]==1'b1) ? 0 : ((LRU[1][BITS-1] == 1) ? 1'b1 : 0);
  627. u[(2*node)+3-N]=(f[(2*node)+3-N]) ? 0 : ((LRU[1][BITS-1]) ? 1'b1 : 0);
  628. v_in[temp_index_f]=u[(2*node)+2-N] ^ u[(2*node)+3-N];
  629. v_in[temp_index_f+1]=u[(2*node)+3-N];
  630. n_state = wait_U_logic;
  631. end
  632. wait_lstate_logic: begin
  633. depth=depth_reg; node=node_reg;
  634. n_state=wait_lstate;
  635. end
  636. wait_lstate: begin
  637. ena_L=0;wea_L=0;enb_L=1'b1;
  638. ena_v=0;wea_v=0; enb_v=0;
  639. // if(counter==cmax) begin
  640. // counter=counter_reg-cmax;
  641. n_state=state_last;
  642. // end
  643. // else
  644. // counter=counter_reg+1;
  645. end
  646. state_last: begin
  647. ena_L=0;wea_L=0;enb_L=0;
  648. ena_v=1'b1;wea_v=1'b1; enb_v=0;
  649. v=v_out;
  650. n_state=idle;
  651. end
  652. endcase
  653. else n_state = idle;
  654. end
  655. endmodule