Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

554 linhas
18 KiB

  1. `timescale 1ns/1ps
  2. `define BITS 8
  3. module sc_decoder_fsm #(parameter BITS=8, N=11'd128)(
  4. input clk, rst,
  5. input in_valid,
  6. input signed [N-1:0][BITS-1:0] y,
  7. input [N-1:0] f,
  8. output wire [N-1:0] u_cap,
  9. output wire [N-1:0] v_final,
  10. output wire out_valid
  11. );
  12. //function for fminsum calculation
  13. function void fminsum_calc;
  14. input signed [`BITS-1:0] a;
  15. input signed [`BITS-1:0] b;
  16. output signed [`BITS-1:0] c;
  17. logic [`BITS-2:0] abs_a;
  18. logic [`BITS-2:0] abs_b;
  19. logic [`BITS-2:0] abs_c;
  20. abs_a = (a[`BITS-1]) ? ~a[`BITS-2:0] + 1'b1 : a[`BITS-2:0];
  21. abs_b = (b[`BITS-1]) ? ~b[`BITS-2:0] + 1'b1 : b[`BITS-2:0];
  22. abs_c = (abs_b < abs_a) ? abs_b : abs_a;
  23. c[`BITS-1] = a[`BITS-1] ^ b[`BITS-1];
  24. c[`BITS-2:0] = (c[`BITS-1]) ? ~abs_c + 1'b1 : abs_c;
  25. endfunction
  26. //function for g-value calculation
  27. function void g_calc;
  28. input signed [`BITS-1:0] a;
  29. input signed [`BITS-1:0] b;
  30. input u;
  31. output signed [`BITS:0] c;
  32. c = (u == 0) ? (b + a) : (b + (~a+1'b1));
  33. endfunction
  34. // Parameter
  35. localparam d = $clog2(N);
  36. // Internal Signals
  37. logic [N-1:0][BITS-1:0] L_in = 'b0, L_out;
  38. logic [d :0] temp_index_f,temp_index_g;
  39. logic [N-1:0] v_in, v_out;
  40. logic [11 :0] jL1,jL2,
  41. jU1,jU2,
  42. jR1,jR2,jR3;
  43. logic ena_v,enb_v,wea_v;
  44. logic ena_L,enb_L,wea_L;
  45. logic [N-1:0]u;
  46. reg signed [BITS-1:0] LRU[2];
  47. reg [N-1:0]v;
  48. // State Variables
  49. logic [4:0] c_state, n_state;
  50. //Auxiliary registers declarations
  51. logic [d:0] depth = 'b0,depth_reg;
  52. logic [d:0] node = 'b0,node_reg;
  53. logic [11:0] tmp_L, tmp_L_reg,
  54. tmp_R, tmp_R_reg,
  55. tmp_U, tmp_U_reg;
  56. //FSM States
  57. localparam idle = 5'd0 , root = 5'd1 , wait_L_logic = 5'd2,
  58. wait_L = 5'd3 , state_L = 5'd4 , wait_R_logic = 5'd5,
  59. wait_R = 5'd6 , state_R = 5'd7 , wait_U_logic = 5'd8,
  60. wait_U = 5'd9 , state_U = 5'd10, wait_LRU_logic = 5'd11,
  61. wait_LRU = 5'd12, state_LRU = 5'd13, wait_lnode_logic = 5'd14,
  62. wait_lnode = 5'd15, state_lnode = 5'd16, wait_lstate_logic = 5'd17,
  63. wait_lstate = 5'd18, state_last = 5'd19;
  64. //BlockRAM Instantiations
  65. bram_v #( .ADDR_WIDTH(d-1),
  66. .DATA_WIDTH(N),
  67. .DEPTH(2**(d-1)))
  68. bram_v_i (
  69. .clk(clk),.ena(ena_v),.enb(enb_v),
  70. .addra(depth_reg-1'b1),
  71. .addrb(depth_reg),
  72. .wea(wea_v),
  73. .dia(v_in),
  74. .dob(v_out));
  75. bram_L #( .ADDR_WIDTH(d-1),
  76. .DATA_WIDTH(N*BITS),
  77. .DEPTH(2**(d-1)),
  78. .N(N))
  79. bram_L_i (
  80. .clk(clk),.ena(ena_L),.enb(enb_L),
  81. .addra(depth_reg),
  82. .addrb(depth_reg-1'b1),
  83. .wea(wea_L),
  84. .dia(L_in),
  85. .dob(L_out));
  86. //output assignment
  87. for(genvar i=0; i<N; i++)
  88. assign u_cap[i] = u[i];
  89. assign v_final = v;
  90. assign out_valid = (n_state == state_lnode) ? 1'b1 : 1'b0;
  91. // Sequential Logic - FSM State and Data Registers
  92. always_ff@(posedge clk)
  93. begin
  94. if(rst)
  95. begin
  96. c_state <= idle;
  97. depth_reg <= 0;
  98. node_reg <= 0;
  99. tmp_L_reg <= 0;
  100. tmp_R_reg <= 0;
  101. tmp_U_reg <= 0;
  102. end
  103. else
  104. begin
  105. c_state <= n_state;
  106. depth_reg <= depth;
  107. node_reg <= node;
  108. tmp_L_reg <= tmp_L;
  109. tmp_R_reg <= tmp_R;
  110. tmp_U_reg <= tmp_U;
  111. end
  112. end
  113. //Combinational Logic - FSM Next State Logic
  114. always_comb
  115. begin
  116. u = 0;
  117. v = 0;
  118. tmp_L = 0; tmp_R = 0; tmp_U = 0;
  119. ena_L = 0; enb_L = 0;
  120. wea_L = 0;
  121. node = node_reg;
  122. depth = depth_reg;
  123. L_in = L_in;
  124. if(in_valid)
  125. case(c_state)
  126. idle:
  127. begin
  128. L_in = 0;
  129. depth = 0; node = 0;
  130. tmp_L = 0; tmp_R = 0; tmp_U = 0;
  131. ena_L = 0; wea_L = 0; enb_L = 0;
  132. ena_v = 0; wea_v = 0; enb_v = 0;
  133. u = 0; v = 0;
  134. if(out_valid)
  135. n_state = idle;
  136. else
  137. n_state = root;
  138. end
  139. root:
  140. begin
  141. depth = depth_reg;
  142. node = node_reg;
  143. ena_L = 1'b1; wea_L = 1'b1;
  144. enb_L = 0; ena_v = 0;
  145. wea_v = 0; enb_v = 0;
  146. tmp_L = tmp_L;
  147. tmp_R = tmp_R;
  148. tmp_U = tmp_U;
  149. u = u;
  150. v = v;
  151. for(int k = 0; k < N; k++)
  152. L_in[k] = y[k];
  153. // L_in = y;
  154. n_state = wait_L_logic;
  155. end
  156. wait_L_logic:
  157. begin
  158. L_in = L_in;
  159. depth = depth_reg + 1'b1; node = ((2*node_reg) + 1'b1);
  160. ena_L = 0; wea_L = 0;
  161. tmp_L = 0; enb_L = 1'b1;
  162. ena_v = 0; wea_v = 0;
  163. enb_v = 0;
  164. tmp_R = tmp_R;
  165. tmp_U = tmp_U;
  166. u = u;
  167. v = v;
  168. if(depth < d)
  169. n_state = wait_L;
  170. else
  171. n_state = wait_LRU_logic;
  172. end
  173. wait_L:
  174. begin
  175. u = u;
  176. v = v;
  177. L_in = L_in;
  178. tmp_L = tmp_L;
  179. tmp_R = tmp_R;
  180. tmp_U = tmp_U;
  181. ena_L = ena_L; enb_L = enb_L;
  182. wea_L = wea_L;
  183. // depth = depth_reg;
  184. n_state = state_L;
  185. end
  186. state_L:
  187. begin
  188. u = u;
  189. v = v;
  190. // depth = depth_reg;
  191. ena_L = 1'b1; wea_L = 1'b1; enb_L = 0;
  192. ena_v = 0; wea_v = 0; enb_v = 0;
  193. tmp_L = tmp_L_reg + 1'b1;
  194. tmp_R = tmp_R;
  195. tmp_U = tmp_U;
  196. temp_index_f = ((N/(2**(depth+1'b1))) * ((2*(node) + 1'b1) - ((2**(depth + 1'b1)) - 1'b1)));
  197. jL1 = (tmp_L_reg) + temp_index_f;
  198. jL2 = (tmp_L_reg) + temp_index_f + (N/(2**depth));
  199. fminsum_calc(L_out[jL1],L_out[jL2],L_in[jL1]);
  200. if(tmp_L< (N/(2**depth)))
  201. n_state = state_L;
  202. else if(depth < d)
  203. n_state = wait_L_logic;
  204. else
  205. n_state = wait_LRU_logic;
  206. end
  207. wait_R_logic:
  208. begin
  209. u = u;
  210. v = v;
  211. L_in = L_in;
  212. ena_L = ena_L; enb_L = enb_L;
  213. wea_L = wea_L;
  214. depth = depth_reg - 1'b1;
  215. node = node_reg + 1'b1;
  216. tmp_L = tmp_L;
  217. tmp_U = tmp_U;
  218. tmp_R = 0;
  219. n_state = wait_R;
  220. end
  221. wait_R:
  222. begin
  223. // depth = depth_reg;
  224. L_in = L_in;
  225. ena_L = 0;wea_L = 0; enb_L = 1'b1;
  226. ena_v = 0;wea_v = 0; enb_v = 1'b1;
  227. wea_L = wea_L;
  228. u = u;
  229. v = v;
  230. tmp_L = tmp_L;
  231. tmp_R = tmp_R;
  232. tmp_U = tmp_U;
  233. n_state = state_R;
  234. end
  235. state_R:
  236. begin
  237. // depth = depth_reg;
  238. u = u;
  239. v = v;
  240. ena_L = 1'b1; wea_L = 1'b1; enb_L = 0;
  241. ena_v = 0; wea_v = 0; enb_v = 0;
  242. tmp_L = tmp_L;
  243. tmp_U = tmp_U;
  244. tmp_R = tmp_R_reg + 1'b1;
  245. temp_index_f = ((N/(2**(depth + 1'b1))) * ((2*(node) + 1'b1) -((2**(depth + 1'b1)) - 1'b1)));
  246. temp_index_g = ((N/(2**(depth + 1'b1))) * ((2*(node - 1'b1) + 1'b1)-((2**(depth + 1'b1)) - 1'b1)));
  247. jR1 = (tmp_R_reg) + temp_index_g;
  248. jR2 = (tmp_R_reg) + temp_index_g + (N/(2**depth));
  249. jR3 = (tmp_R_reg) + temp_index_f;
  250. g_calc(L_out[jR1],L_out[jR2],v_out[jR1],L_in[jR3]);
  251. if(tmp_R < (N/(2**depth)))
  252. n_state = state_R;
  253. else if(node == ((2**d) - 2))
  254. n_state = wait_lnode_logic;
  255. else if(depth == d)
  256. n_state = wait_LRU_logic;
  257. else
  258. n_state = wait_L_logic;
  259. end
  260. wait_U_logic:
  261. begin
  262. depth = depth_reg - 1'b1;
  263. node = (node_reg - 2) >> 1;
  264. L_in = L_in;
  265. tmp_U = 0;
  266. wea_L = wea_L;
  267. u = u;
  268. v = v;
  269. ena_L = ena_L; enb_L = enb_L;
  270. tmp_L = tmp_L;
  271. tmp_R = tmp_R;
  272. tmp_U = tmp_U;
  273. n_state = wait_U;
  274. end
  275. wait_U:
  276. begin
  277. // depth = depth_reg;
  278. L_in = L_in;
  279. ena_L = 0; wea_L = 0; enb_L = 0;
  280. ena_v = 0; wea_v = 0; enb_v = 1'b1;
  281. tmp_L = tmp_L;
  282. tmp_R = tmp_R;
  283. tmp_U = tmp_U;
  284. n_state = state_U;
  285. end
  286. state_U:
  287. begin
  288. // depth = depth_reg;
  289. L_in = L_in;
  290. ena_L = 0; ena_v =1'b1; enb_L = 0;
  291. wea_L = 0; wea_v =1'b1; enb_v = 0;
  292. u = u;
  293. v = v;
  294. tmp_L = tmp_L;
  295. tmp_R = tmp_R;
  296. tmp_U = tmp_U_reg+1'b1;
  297. temp_index_f = ((N/(2**(depth))) * ((2*node + 1'b1) - ((2**(depth)) - 1'b1)));
  298. jU1 = (tmp_U_reg) + temp_index_f;
  299. jU2 = (tmp_U_reg) + temp_index_f + (N/(2**(depth)));
  300. v_in[jU1] = v_out[jU1] ^ v_out[jU2];
  301. v_in[jU2] = v_out[jU2];
  302. if(tmp_U < (N/(2**(depth))))
  303. n_state = state_U;
  304. else if(depth > 0 && ~node[0])
  305. n_state = wait_U_logic;
  306. else if(depth > 0 && node!=0)
  307. n_state = wait_R_logic;
  308. else
  309. n_state = wait_lstate_logic;
  310. end
  311. wait_LRU_logic:
  312. begin
  313. u = u;
  314. v = v;
  315. L_in = L_in;
  316. wea_L = wea_L;
  317. // depth = depth_reg;
  318. tmp_L = tmp_L;
  319. tmp_R = tmp_R;
  320. tmp_U = tmp_U;
  321. ena_L = ena_L; enb_L = enb_L;
  322. node = (node_reg - 1'b1) >> 1;
  323. n_state = wait_LRU;
  324. end
  325. wait_LRU:
  326. begin
  327. // depth = depth_reg;
  328. L_in = L_in;
  329. u = u;
  330. v = v;
  331. ena_L = 0; wea_L = 0; enb_L = 1'b1;
  332. ena_v = 0; wea_v = 0; enb_v = 0;
  333. tmp_L = tmp_L;
  334. tmp_R = tmp_R;
  335. tmp_U = tmp_U;
  336. n_state = state_LRU;
  337. end
  338. state_LRU:
  339. begin
  340. // depth = depth_reg;
  341. ena_L = 0; ena_v = 1'b1;
  342. enb_v = 0; wea_v = 1'b1;
  343. wea_L = 0; enb_L = 0;
  344. L_in = L_in;
  345. v = v;
  346. tmp_L = tmp_L;
  347. tmp_R = tmp_R;
  348. tmp_U = tmp_U;
  349. temp_index_f = ((N/(2**(depth))) * ((2*node + 1'b1) - ((2**(depth)) - 1'b1)));
  350. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f + 1],LRU[0]);
  351. u[(2*node)+2-N] = (f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1 : 0);
  352. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  353. u[(2*node)+3-N] = (f[(2*node)+3-N]) ? 0 : ((LRU[1][BITS-1]) ? 1 : 0);
  354. v_in[temp_index_f] = u[(2*node)+2-N] ^ u[(2*node)+3-N];
  355. v_in[temp_index_f+1] = u[(2*node)+3-N];
  356. if(node[0])
  357. n_state = wait_R_logic;
  358. else
  359. n_state = wait_U_logic;
  360. end
  361. wait_lnode_logic:
  362. begin
  363. u = u;
  364. v = v;
  365. L_in = L_in;
  366. tmp_L = tmp_L;
  367. tmp_R = tmp_R;
  368. tmp_U = tmp_U;
  369. depth = depth_reg + 1'b1; node = node_reg;
  370. ena_L = ena_L; enb_L = enb_L;
  371. wea_L = wea_L;
  372. n_state = wait_lnode;
  373. end
  374. wait_lnode:
  375. begin
  376. // depth = depth_reg;
  377. u = u;
  378. v = v;
  379. tmp_L = tmp_L;
  380. tmp_R = tmp_R;
  381. tmp_U = tmp_U;
  382. L_in = L_in;
  383. ena_L = 0; wea_L = 0; enb_L = 1'b1;
  384. ena_v = 0; wea_v = 0; enb_v = 0;
  385. n_state = state_lnode;
  386. end
  387. state_lnode:
  388. begin
  389. // depth = depth_reg;
  390. u = u;
  391. v = v;
  392. L_in = L_in;
  393. ena_L = 0; wea_L = 0; enb_L = 0;
  394. ena_v = 1'b1; wea_v = 1'b1; enb_v = 0;
  395. tmp_L = tmp_L;
  396. tmp_R = tmp_R;
  397. tmp_U = tmp_U;
  398. temp_index_f = ((N/(2**(depth))) * ((2*node + 1'b1) - ((2**(depth)) - 1'b1)));
  399. fminsum_calc(L_out[temp_index_f],L_out[temp_index_f+1],LRU[0]);
  400. u[(2*node)+2-N] = (f[(2*node)+2-N]) ? 0 : ((LRU[0][BITS-1]) ? 1'b1 : 0);
  401. g_calc(L_out[temp_index_f],L_out[temp_index_f+1],u[(2*node)+2-N],LRU[1]);
  402. u[(2*node)+3-N] = (f[(2*node)+3-N]) ? 0 : ((LRU[1][BITS-1]) ? 1'b1 : 0);
  403. v_in[temp_index_f] = u[(2*node)+2-N] ^ u[(2*node)+3-N];
  404. v_in[temp_index_f+1] = u[(2*node)+3-N];
  405. n_state = wait_U_logic;
  406. end
  407. wait_lstate_logic:
  408. begin
  409. u = u;
  410. v = v;
  411. L_in = L_in;
  412. // depth = depth_reg;
  413. node = node_reg;
  414. tmp_L = tmp_L;
  415. tmp_R = tmp_R;
  416. tmp_U = tmp_U;
  417. ena_L = ena_L; enb_L = enb_L;
  418. wea_L = wea_L;
  419. n_state = wait_lstate;
  420. end
  421. wait_lstate:
  422. begin
  423. // depth = depth_reg;
  424. u = u;
  425. v = v;
  426. L_in = L_in;
  427. ena_L = 0; wea_L = 0; enb_L = 1'b1;
  428. ena_v = 0; wea_v = 0; enb_v = 0;
  429. tmp_L = tmp_L;
  430. tmp_R = tmp_R;
  431. tmp_U = tmp_U;
  432. n_state = state_last;
  433. end
  434. state_last:
  435. begin
  436. // depth = depth_reg;
  437. L_in = L_in;
  438. u = u;
  439. ena_L = 0; wea_L = 0; enb_L = 0;
  440. ena_v = 1'b1; wea_v = 1'b1; enb_v = 0;
  441. tmp_L = tmp_L;
  442. tmp_R = tmp_R;
  443. tmp_U = tmp_U;
  444. v = v_out;
  445. n_state = idle;
  446. end
  447. default:
  448. begin
  449. u = 0;
  450. v = 0;
  451. L_in = 0;
  452. depth = 0; node = 0;
  453. tmp_L = 0; tmp_R = 0; tmp_U = 0;
  454. ena_L = 0; enb_L = 0; wea_L = 0;
  455. ena_v = 0; wea_v = 0; enb_v = 0;
  456. n_state = idle;
  457. end
  458. endcase
  459. else
  460. begin
  461. u = 0;
  462. v = 0;
  463. L_in = 0;
  464. depth = 0; node = 0;
  465. tmp_L = 0; tmp_R = 0; tmp_U = 0;
  466. ena_L = 0; wea_L = 0; enb_L = 0;
  467. ena_v = 0; wea_v = 0; enb_v = 0;
  468. n_state = idle;
  469. end
  470. end
  471. endmodule