accel_rectangle_fill32.v 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961
  1. /*
  2. Copyright (c) 2023 Victor Suarez Rovere <suarezvictor@gmail.com>
  3. SPDX-License-Identifier: AGPL-3.0-only
  4. This program is free software: you can redistribute it and/or modify it under the terms of the
  5. GNU Affero General Public License as published by the Free Software Foundation, version 3.
  6. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  7. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. See the GNU Affero General Public License for more details.
  9. You should have received a copy of the GNU Affero General Public License along with this program.
  10. If not, see <https://www.gnu.org/licenses/>.
  11. This file uses portions from LiteX and MiSoC projects under BSD 2-Clause license
  12. Unless otherwise noted, LiteX is copyright (C) 2012-2022 Enjoy-Digital & LiteX developers.
  13. Unless otherwise noted, MiSoC is copyright (C) 2012-2015 Enjoy-Digital.
  14. Unless otherwise noted, MiSoC is copyright (C) 2007-2015 M-Labs Ltd.
  15. See LITEX-CONTRIBUTORS file for additional authors that may have written code used in this file
  16. */
  17. `timescale 1ns / 1ps
  18. module accel_rectangle_fill32 (
  19. input wire clk,
  20. input wire rst,
  21. input wire [29:0] mmap_s_adr,
  22. input wire [31:0] mmap_s_dat_w,
  23. output wire [31:0] mmap_s_dat_r,
  24. input wire [3:0] mmap_s_sel,
  25. input wire mmap_s_cyc,
  26. input wire mmap_s_stb,
  27. output wire mmap_s_ack,
  28. input wire mmap_s_we,
  29. input wire [2:0] mmap_s_cti,
  30. input wire [1:0] mmap_s_bte,
  31. output wire mmap_s_err,
  32. output wire mmap_m_cmd_valid,
  33. input wire mmap_m_cmd_ready,
  34. output wire mmap_m_cmd_we,
  35. output wire [29:0] mmap_m_cmd_addr,
  36. output wire mmap_m_wdata_valid,
  37. input wire mmap_m_wdata_ready,
  38. output wire [15:0] mmap_m_wdata_we,
  39. output wire [127:0] mmap_m_wdata_data,
  40. input wire mmap_m_rdata_valid,
  41. output wire mmap_m_rdata_ready,
  42. input wire [127:0] mmap_m_rdata_data
  43. );
  44. wire sys_clk;
  45. wire sys_rst;
  46. wire por_clk;
  47. reg soc_int_rst = 1'd1;
  48. wire [29:0] soc_adr;
  49. wire [31:0] soc_dat_w;
  50. wire [31:0] soc_dat_r;
  51. wire [3:0] soc_sel;
  52. wire soc_cyc;
  53. wire soc_stb;
  54. wire soc_ack;
  55. wire soc_we;
  56. wire [2:0] soc_cti;
  57. wire [1:0] soc_bte;
  58. wire soc_err;
  59. wire extcore_args_valid;
  60. wire extcore_args_ready;
  61. wire [15:0] extcore_args_payload_x0;
  62. wire [15:0] extcore_args_payload_y0;
  63. wire [15:0] extcore_args_payload_x1;
  64. wire [15:0] extcore_args_payload_y1;
  65. wire [31:0] extcore_args_payload_rgba;
  66. wire [31:0] extcore_args_payload_base;
  67. wire [15:0] extcore_args_payload_xstride;
  68. wire [15:0] extcore_args_payload_ystride;
  69. reg extcore_run_storage = 1'd0;
  70. reg extcore_run_re = 1'd0;
  71. wire extcore_done_status;
  72. wire extcore_done_we;
  73. reg extcore_done_re = 1'd0;
  74. reg [15:0] extcore_csrstorage0_storage = 16'd0;
  75. reg extcore_csrstorage0_re = 1'd0;
  76. reg [15:0] extcore_csrstorage1_storage = 16'd0;
  77. reg extcore_csrstorage1_re = 1'd0;
  78. reg [15:0] extcore_csrstorage2_storage = 16'd0;
  79. reg extcore_csrstorage2_re = 1'd0;
  80. reg [15:0] extcore_csrstorage3_storage = 16'd0;
  81. reg extcore_csrstorage3_re = 1'd0;
  82. reg [31:0] extcore_csrstorage4_storage = 32'd0;
  83. reg extcore_csrstorage4_re = 1'd0;
  84. reg [31:0] extcore_csrstorage5_storage = 32'd0;
  85. reg extcore_csrstorage5_re = 1'd0;
  86. reg [15:0] extcore_csrstorage6_storage = 16'd0;
  87. reg extcore_csrstorage6_re = 1'd0;
  88. reg [15:0] extcore_csrstorage7_storage = 16'd0;
  89. reg extcore_csrstorage7_re = 1'd0;
  90. wire [29:0] extcore_dma_bus_adr;
  91. wire [31:0] extcore_dma_bus_dat_w;
  92. reg [31:0] extcore_dma_bus_dat_r = 32'd0;
  93. wire [3:0] extcore_dma_bus_sel;
  94. wire extcore_dma_bus_cyc;
  95. wire extcore_dma_bus_stb;
  96. wire extcore_dma_bus_ack;
  97. wire extcore_dma_bus_we;
  98. reg [2:0] extcore_dma_bus_cti = 3'd0;
  99. reg [1:0] extcore_dma_bus_bte = 2'd0;
  100. wire extcore_dma_bus_err;
  101. wire [31:0] extcore_adr;
  102. wire cmd_valid;
  103. wire cmd_ready;
  104. wire cmd_payload_we;
  105. wire [29:0] cmd_payload_addr;
  106. wire wdata_valid;
  107. wire wdata_ready;
  108. wire [127:0] wdata_payload_data;
  109. wire [15:0] wdata_payload_we;
  110. wire rdata_valid;
  111. reg rdata_ready = 1'd0;
  112. wire [127:0] rdata_payload_data;
  113. wire [29:0] bus_adr;
  114. wire [127:0] bus_dat_w;
  115. wire [127:0] bus_dat_r;
  116. wire [15:0] bus_sel;
  117. wire bus_cyc;
  118. wire bus_stb;
  119. wire bus_ack;
  120. wire bus_we;
  121. wire [2:0] bus_cti;
  122. wire [1:0] bus_bte;
  123. reg bus_err = 1'd0;
  124. reg [29:0] busx_adr = 30'd0;
  125. reg [127:0] busx_dat_w = 128'd0;
  126. wire [127:0] busx_dat_r;
  127. reg [15:0] busx_sel = 16'd0;
  128. wire busx_cyc;
  129. wire busx_stb;
  130. reg busx_ack = 1'd0;
  131. wire busx_we;
  132. wire [2:0] busx_cti;
  133. wire [1:0] busx_bte;
  134. reg busx_err = 1'd0;
  135. wire [29:0] slave_tmp_adr;
  136. wire [127:0] slave_tmp_dat_w;
  137. wire [127:0] slave_tmp_dat_r;
  138. wire [15:0] slave_tmp_sel;
  139. reg slave_tmp_cyc = 1'd0;
  140. reg slave_tmp_stb = 1'd0;
  141. wire slave_tmp_ack;
  142. reg slave_tmp_we = 1'd0;
  143. reg [2:0] slave_tmp_cti = 3'd0;
  144. reg [1:0] slave_tmp_bte = 2'd0;
  145. wire slave_tmp_err;
  146. reg [2:0] data_port_adr = 3'd0;
  147. wire [127:0] data_port_dat_r;
  148. reg [15:0] data_port_we = 16'd0;
  149. reg [127:0] data_port_dat_w = 128'd0;
  150. reg [2:0] sel_port_adr = 3'd0;
  151. wire [15:0] sel_port_dat_r;
  152. reg sel_port_we = 1'd0;
  153. reg [15:0] sel_port_dat_w = 16'd0;
  154. reg write_from_slave = 1'd0;
  155. reg [2:0] tag_port_adr = 3'd0;
  156. wire [27:0] tag_port_dat_r;
  157. reg tag_port_we = 1'd0;
  158. wire [27:0] tag_port_dat_w;
  159. wire [26:0] tag_do_tag;
  160. wire tag_do_dirty;
  161. reg [26:0] tag_di_tag = 27'd0;
  162. reg tag_di_dirty = 1'd0;
  163. reg word_clr = 1'd0;
  164. reg word_inc = 1'd0;
  165. reg [2:0] autoevict_counter = 3'd0;
  166. reg auto_evict = 1'd0;
  167. wire sink_sink_valid;
  168. wire sink_sink_ready;
  169. wire [29:0] sink_sink_payload_address;
  170. wire [127:0] sink_sink_payload_data;
  171. wire [15:0] sink_sink_payload_sel;
  172. wire fifo_sink_valid;
  173. wire fifo_sink_ready;
  174. reg fifo_sink_first = 1'd0;
  175. reg fifo_sink_last = 1'd0;
  176. wire [127:0] fifo_sink_payload_data;
  177. wire [15:0] fifo_sink_payload_sel;
  178. wire fifo_source_valid;
  179. wire fifo_source_ready;
  180. wire fifo_source_first;
  181. wire fifo_source_last;
  182. wire [127:0] fifo_source_payload_data;
  183. wire [15:0] fifo_source_payload_sel;
  184. wire fifo_re;
  185. reg fifo_readable = 1'd0;
  186. wire fifo_syncfifo_we;
  187. wire fifo_syncfifo_writable;
  188. wire fifo_syncfifo_re;
  189. wire fifo_syncfifo_readable;
  190. wire [145:0] fifo_syncfifo_din;
  191. wire [145:0] fifo_syncfifo_dout;
  192. reg [4:0] fifo_level0 = 5'd0;
  193. reg fifo_replace = 1'd0;
  194. reg [3:0] fifo_produce = 4'd0;
  195. reg [3:0] fifo_consume = 4'd0;
  196. reg [3:0] fifo_wrport_adr = 4'd0;
  197. wire [145:0] fifo_wrport_dat_r;
  198. wire fifo_wrport_we;
  199. wire [145:0] fifo_wrport_dat_w;
  200. wire fifo_do_read;
  201. wire [3:0] fifo_rdport_adr;
  202. wire [145:0] fifo_rdport_dat_r;
  203. wire fifo_rdport_re;
  204. wire [4:0] fifo_level1;
  205. wire [127:0] fifo_fifo_in_payload_data;
  206. wire [15:0] fifo_fifo_in_payload_sel;
  207. wire fifo_fifo_in_first;
  208. wire fifo_fifo_in_last;
  209. wire [127:0] fifo_fifo_out_payload_data;
  210. wire [15:0] fifo_fifo_out_payload_sel;
  211. wire fifo_fifo_out_first;
  212. wire fifo_fifo_out_last;
  213. reg [13:0] accelgluesoc_adr = 14'd0;
  214. reg accelgluesoc_we = 1'd0;
  215. reg [31:0] accelgluesoc_dat_w = 32'd0;
  216. wire [31:0] accelgluesoc_dat_r;
  217. wire [29:0] accelgluesoc_wishbone_adr;
  218. wire [31:0] accelgluesoc_wishbone_dat_w;
  219. reg [31:0] accelgluesoc_wishbone_dat_r = 32'd0;
  220. wire [3:0] accelgluesoc_wishbone_sel;
  221. wire accelgluesoc_wishbone_cyc;
  222. wire accelgluesoc_wishbone_stb;
  223. reg accelgluesoc_wishbone_ack = 1'd0;
  224. wire accelgluesoc_wishbone_we;
  225. wire [2:0] accelgluesoc_wishbone_cti;
  226. wire [1:0] accelgluesoc_wishbone_bte;
  227. reg accelgluesoc_wishbone_err = 1'd0;
  228. wire [13:0] bank_bus_adr;
  229. wire bank_bus_we;
  230. wire [31:0] bank_bus_dat_w;
  231. reg [31:0] bank_bus_dat_r = 32'd0;
  232. reg run0_re = 1'd0;
  233. wire run0_r;
  234. reg run0_we = 1'd0;
  235. wire run0_w;
  236. reg done_re = 1'd0;
  237. wire done_r;
  238. reg done_we = 1'd0;
  239. wire done_w;
  240. reg x00_re = 1'd0;
  241. wire [15:0] x00_r;
  242. reg x00_we = 1'd0;
  243. wire [15:0] x00_w;
  244. reg y00_re = 1'd0;
  245. wire [15:0] y00_r;
  246. reg y00_we = 1'd0;
  247. wire [15:0] y00_w;
  248. reg x10_re = 1'd0;
  249. wire [15:0] x10_r;
  250. reg x10_we = 1'd0;
  251. wire [15:0] x10_w;
  252. reg y10_re = 1'd0;
  253. wire [15:0] y10_r;
  254. reg y10_we = 1'd0;
  255. wire [15:0] y10_w;
  256. reg rgba0_re = 1'd0;
  257. wire [31:0] rgba0_r;
  258. reg rgba0_we = 1'd0;
  259. wire [31:0] rgba0_w;
  260. reg base0_re = 1'd0;
  261. wire [31:0] base0_r;
  262. reg base0_we = 1'd0;
  263. wire [31:0] base0_w;
  264. reg xstride0_re = 1'd0;
  265. wire [15:0] xstride0_r;
  266. reg xstride0_we = 1'd0;
  267. wire [15:0] xstride0_w;
  268. reg ystride0_re = 1'd0;
  269. wire [15:0] ystride0_r;
  270. reg ystride0_we = 1'd0;
  271. wire [15:0] ystride0_w;
  272. wire sel;
  273. wire [13:0] csr_interconnect_adr;
  274. wire csr_interconnect_we;
  275. wire [31:0] csr_interconnect_dat_w;
  276. wire [31:0] csr_interconnect_dat_r;
  277. reg [2:0] accelgluesoc_wpubase_state = 3'd1;
  278. reg [2:0] accelgluesoc_wpubase_next_state = 3'd0;
  279. reg [2:0] autoevict_counter_next_value = 3'd0;
  280. reg autoevict_counter_next_value_ce = 1'd0;
  281. reg accelgluesoc_wishbone2csr_state = 1'd0;
  282. reg accelgluesoc_wishbone2csr_next_state = 1'd0;
  283. assign soc_adr = mmap_s_adr;
  284. assign soc_dat_w = mmap_s_dat_w;
  285. assign mmap_s_dat_r = soc_dat_r;
  286. assign soc_sel = mmap_s_sel;
  287. assign soc_cyc = mmap_s_cyc;
  288. assign soc_stb = mmap_s_stb;
  289. assign mmap_s_ack = soc_ack;
  290. assign soc_we = mmap_s_we;
  291. assign soc_cti = mmap_s_cti;
  292. assign soc_bte = mmap_s_bte;
  293. assign mmap_s_err = soc_err;
  294. assign mmap_m_cmd_valid = cmd_valid;
  295. assign cmd_ready = mmap_m_cmd_ready;
  296. assign mmap_m_cmd_we = cmd_payload_we;
  297. assign mmap_m_cmd_addr = cmd_payload_addr;
  298. assign mmap_m_wdata_valid = wdata_valid;
  299. assign wdata_ready = mmap_m_wdata_ready;
  300. assign mmap_m_wdata_we = wdata_payload_we;
  301. assign mmap_m_wdata_data = wdata_payload_data;
  302. assign rdata_valid = mmap_m_rdata_valid;
  303. assign mmap_m_rdata_ready = rdata_ready;
  304. assign rdata_payload_data = mmap_m_rdata_data;
  305. assign sys_clk = clk;
  306. assign por_clk = clk;
  307. assign sys_rst = soc_int_rst;
  308. assign accelgluesoc_wishbone_adr = soc_adr;
  309. assign accelgluesoc_wishbone_dat_w = soc_dat_w;
  310. assign soc_dat_r = accelgluesoc_wishbone_dat_r;
  311. assign accelgluesoc_wishbone_sel = soc_sel;
  312. assign accelgluesoc_wishbone_cyc = soc_cyc;
  313. assign accelgluesoc_wishbone_stb = soc_stb;
  314. assign soc_ack = accelgluesoc_wishbone_ack;
  315. assign accelgluesoc_wishbone_we = soc_we;
  316. assign accelgluesoc_wishbone_cti = soc_cti;
  317. assign accelgluesoc_wishbone_bte = soc_bte;
  318. assign soc_err = accelgluesoc_wishbone_err;
  319. assign extcore_args_valid = extcore_run_storage;
  320. assign extcore_done_status = extcore_args_ready;
  321. assign extcore_args_payload_x0 = extcore_csrstorage0_storage;
  322. assign extcore_args_payload_y0 = extcore_csrstorage1_storage;
  323. assign extcore_args_payload_x1 = extcore_csrstorage2_storage;
  324. assign extcore_args_payload_y1 = extcore_csrstorage3_storage;
  325. assign extcore_args_payload_rgba = extcore_csrstorage4_storage;
  326. assign extcore_args_payload_base = extcore_csrstorage5_storage;
  327. assign extcore_args_payload_xstride = extcore_csrstorage6_storage;
  328. assign extcore_args_payload_ystride = extcore_csrstorage7_storage;
  329. assign extcore_dma_bus_adr = extcore_adr[31:2];
  330. assign sink_sink_payload_data = bus_dat_w;
  331. assign sink_sink_payload_sel = bus_sel;
  332. assign sink_sink_valid = ((bus_cyc & bus_stb) & bus_we);
  333. assign sink_sink_payload_address = bus_adr;
  334. assign bus_ack = (sink_sink_ready & sink_sink_valid);
  335. assign bus_dat_r = bus_dat_w;
  336. assign busx_cyc = extcore_dma_bus_cyc;
  337. assign busx_stb = extcore_dma_bus_stb;
  338. assign extcore_dma_bus_ack = busx_ack;
  339. assign busx_we = extcore_dma_bus_we;
  340. assign busx_cti = extcore_dma_bus_cti;
  341. assign busx_bte = extcore_dma_bus_bte;
  342. assign extcore_dma_bus_err = busx_err;
  343. assign bus_adr = slave_tmp_adr;
  344. assign bus_dat_w = slave_tmp_dat_w;
  345. assign slave_tmp_dat_r = bus_dat_r;
  346. assign bus_sel = slave_tmp_sel;
  347. assign bus_cyc = slave_tmp_cyc;
  348. assign bus_stb = slave_tmp_stb;
  349. assign slave_tmp_ack = bus_ack;
  350. assign bus_we = slave_tmp_we;
  351. assign bus_cti = slave_tmp_cti;
  352. assign bus_bte = slave_tmp_bte;
  353. assign slave_tmp_err = bus_err;
  354. assign {tag_do_dirty, tag_do_tag} = tag_port_dat_r;
  355. assign tag_port_dat_w = {tag_di_dirty, tag_di_tag};
  356. always @(*) begin
  357. data_port_dat_w <= 128'd0;
  358. data_port_we <= 16'd0;
  359. if (write_from_slave) begin
  360. data_port_dat_w <= slave_tmp_dat_r;
  361. data_port_we <= {16{1'd1}};
  362. end else begin
  363. data_port_dat_w <= {1{busx_dat_w}};
  364. if ((((busx_cyc & busx_stb) & busx_we) & busx_ack)) begin
  365. data_port_we <= busx_sel;
  366. end
  367. end
  368. end
  369. assign slave_tmp_dat_w = data_port_dat_r;
  370. assign busx_dat_r = data_port_dat_r;
  371. assign slave_tmp_adr = {tag_do_tag, busx_adr[2:0]};
  372. assign slave_tmp_sel = sel_port_dat_r;
  373. always @(*) begin
  374. tag_di_tag <= 27'd0;
  375. tag_di_dirty <= 1'd0;
  376. extcore_dma_bus_dat_r <= 32'd0;
  377. word_clr <= 1'd0;
  378. word_inc <= 1'd0;
  379. slave_tmp_cyc <= 1'd0;
  380. slave_tmp_stb <= 1'd0;
  381. slave_tmp_we <= 1'd0;
  382. busx_adr <= 30'd0;
  383. accelgluesoc_wpubase_next_state <= 3'd0;
  384. busx_dat_w <= 128'd0;
  385. data_port_adr <= 3'd0;
  386. busx_sel <= 16'd0;
  387. autoevict_counter_next_value <= 3'd0;
  388. autoevict_counter_next_value_ce <= 1'd0;
  389. busx_ack <= 1'd0;
  390. sel_port_adr <= 3'd0;
  391. sel_port_we <= 1'd0;
  392. auto_evict <= 1'd0;
  393. sel_port_dat_w <= 16'd0;
  394. write_from_slave <= 1'd0;
  395. tag_port_adr <= 3'd0;
  396. tag_port_we <= 1'd0;
  397. case (extcore_dma_bus_adr[1:0])
  398. 1'd0: begin
  399. busx_adr <= extcore_dma_bus_adr[29:2];
  400. busx_sel[3:0] <= extcore_dma_bus_sel;
  401. busx_dat_w[31:0] <= extcore_dma_bus_dat_w;
  402. extcore_dma_bus_dat_r <= busx_dat_r[31:0];
  403. end
  404. 1'd1: begin
  405. busx_adr <= extcore_dma_bus_adr[29:2];
  406. busx_sel[7:4] <= extcore_dma_bus_sel;
  407. busx_dat_w[63:32] <= extcore_dma_bus_dat_w;
  408. extcore_dma_bus_dat_r <= busx_dat_r[63:32];
  409. end
  410. 2'd2: begin
  411. busx_adr <= extcore_dma_bus_adr[29:2];
  412. busx_sel[11:8] <= extcore_dma_bus_sel;
  413. busx_dat_w[95:64] <= extcore_dma_bus_dat_w;
  414. extcore_dma_bus_dat_r <= busx_dat_r[95:64];
  415. end
  416. 2'd3: begin
  417. busx_adr <= extcore_dma_bus_adr[29:2];
  418. busx_sel[15:12] <= extcore_dma_bus_sel;
  419. busx_dat_w[127:96] <= extcore_dma_bus_dat_w;
  420. extcore_dma_bus_dat_r <= busx_dat_r[127:96];
  421. end
  422. endcase
  423. tag_port_adr <= busx_adr[2:0];
  424. tag_di_tag <= busx_adr[29:3];
  425. data_port_adr <= busx_adr[2:0];
  426. sel_port_adr <= busx_adr[2:0];
  427. sel_port_we <= 1'd0;
  428. accelgluesoc_wpubase_next_state <= accelgluesoc_wpubase_state;
  429. case (accelgluesoc_wpubase_state)
  430. 1'd0: begin
  431. if (busx_cyc) begin
  432. accelgluesoc_wpubase_next_state <= 1'd1;
  433. end else begin
  434. busx_adr[2:0] <= autoevict_counter;
  435. tag_port_adr <= busx_adr[2:0];
  436. data_port_adr <= busx_adr[2:0];
  437. sel_port_adr <= busx_adr[2:0];
  438. accelgluesoc_wpubase_next_state <= 2'd3;
  439. end
  440. end
  441. 2'd2: begin
  442. slave_tmp_stb <= 1'd1;
  443. slave_tmp_cyc <= 1'd1;
  444. slave_tmp_we <= 1'd1;
  445. if (slave_tmp_ack) begin
  446. word_inc <= 1'd1;
  447. if (1'd1) begin
  448. tag_port_we <= 1'd1;
  449. sel_port_we <= 1'd1;
  450. sel_port_dat_w <= 1'd0;
  451. word_clr <= 1'd1;
  452. accelgluesoc_wpubase_next_state <= 1'd1;
  453. end
  454. end
  455. end
  456. 2'd3: begin
  457. busx_adr[2:0] <= autoevict_counter;
  458. tag_port_adr <= busx_adr[2:0];
  459. data_port_adr <= busx_adr[2:0];
  460. sel_port_adr <= busx_adr[2:0];
  461. auto_evict <= tag_do_dirty;
  462. if (auto_evict) begin
  463. slave_tmp_cyc <= 1'd1;
  464. slave_tmp_stb <= 1'd1;
  465. slave_tmp_we <= 1'd1;
  466. if (slave_tmp_ack) begin
  467. tag_di_tag <= tag_do_tag;
  468. tag_di_dirty <= 1'd0;
  469. tag_port_we <= 1'd1;
  470. sel_port_we <= 1'd1;
  471. sel_port_dat_w <= 1'd0;
  472. autoevict_counter_next_value <= (autoevict_counter + 1'd1);
  473. autoevict_counter_next_value_ce <= 1'd1;
  474. accelgluesoc_wpubase_next_state <= 1'd0;
  475. end
  476. end else begin
  477. accelgluesoc_wpubase_next_state <= 1'd0;
  478. end
  479. end
  480. 3'd4: begin
  481. slave_tmp_stb <= 1'd1;
  482. slave_tmp_cyc <= 1'd1;
  483. slave_tmp_we <= 1'd0;
  484. if (slave_tmp_ack) begin
  485. write_from_slave <= 1'd1;
  486. word_inc <= 1'd1;
  487. if (1'd1) begin
  488. accelgluesoc_wpubase_next_state <= 1'd1;
  489. end else begin
  490. accelgluesoc_wpubase_next_state <= 1'd1;
  491. end
  492. end
  493. end
  494. default: begin
  495. if ((busx_cyc & busx_stb)) begin
  496. word_clr <= 1'd1;
  497. autoevict_counter_next_value <= (busx_adr[29:3] ^ 3'd4);
  498. autoevict_counter_next_value_ce <= 1'd1;
  499. if ((tag_do_tag == busx_adr[29:3])) begin
  500. busx_ack <= 1'd1;
  501. if (busx_we) begin
  502. tag_di_dirty <= 1'd1;
  503. tag_port_we <= 1'd1;
  504. sel_port_we <= 1'd1;
  505. sel_port_dat_w <= (busx_sel | sel_port_dat_r);
  506. end
  507. end else begin
  508. if (tag_do_dirty) begin
  509. accelgluesoc_wpubase_next_state <= 2'd2;
  510. end else begin
  511. tag_port_we <= 1'd1;
  512. sel_port_we <= 1'd1;
  513. if (busx_we) begin
  514. sel_port_dat_w <= busx_sel;
  515. end else begin
  516. sel_port_dat_w <= 1'd0;
  517. end
  518. word_clr <= 1'd1;
  519. accelgluesoc_wpubase_next_state <= 1'd1;
  520. end
  521. end
  522. end else begin
  523. if ((~busx_cyc)) begin
  524. accelgluesoc_wpubase_next_state <= 1'd0;
  525. end
  526. end
  527. end
  528. endcase
  529. end
  530. assign cmd_payload_we = 1'd1;
  531. assign cmd_payload_addr = sink_sink_payload_address;
  532. assign cmd_valid = (fifo_sink_ready & sink_sink_valid);
  533. assign sink_sink_ready = (fifo_sink_ready & cmd_ready);
  534. assign fifo_sink_valid = (sink_sink_valid & cmd_ready);
  535. assign fifo_sink_payload_data = sink_sink_payload_data;
  536. assign fifo_sink_payload_sel = sink_sink_payload_sel;
  537. assign wdata_payload_we = fifo_source_payload_sel;
  538. assign wdata_valid = fifo_source_valid;
  539. assign fifo_source_ready = wdata_ready;
  540. assign wdata_payload_data = fifo_source_payload_data;
  541. assign fifo_syncfifo_din = {fifo_fifo_in_last, fifo_fifo_in_first, fifo_fifo_in_payload_sel, fifo_fifo_in_payload_data};
  542. assign {fifo_fifo_out_last, fifo_fifo_out_first, fifo_fifo_out_payload_sel, fifo_fifo_out_payload_data} = fifo_syncfifo_dout;
  543. assign fifo_sink_ready = fifo_syncfifo_writable;
  544. assign fifo_syncfifo_we = fifo_sink_valid;
  545. assign fifo_fifo_in_first = fifo_sink_first;
  546. assign fifo_fifo_in_last = fifo_sink_last;
  547. assign fifo_fifo_in_payload_data = fifo_sink_payload_data;
  548. assign fifo_fifo_in_payload_sel = fifo_sink_payload_sel;
  549. assign fifo_source_valid = fifo_readable;
  550. assign fifo_source_first = fifo_fifo_out_first;
  551. assign fifo_source_last = fifo_fifo_out_last;
  552. assign fifo_source_payload_data = fifo_fifo_out_payload_data;
  553. assign fifo_source_payload_sel = fifo_fifo_out_payload_sel;
  554. assign fifo_re = fifo_source_ready;
  555. assign fifo_syncfifo_re = (fifo_syncfifo_readable & ((~fifo_readable) | fifo_re));
  556. assign fifo_level1 = (fifo_level0 + fifo_readable);
  557. always @(*) begin
  558. fifo_wrport_adr <= 4'd0;
  559. if (fifo_replace) begin
  560. fifo_wrport_adr <= (fifo_produce - 1'd1);
  561. end else begin
  562. fifo_wrport_adr <= fifo_produce;
  563. end
  564. end
  565. assign fifo_wrport_dat_w = fifo_syncfifo_din;
  566. assign fifo_wrport_we = (fifo_syncfifo_we & (fifo_syncfifo_writable | fifo_replace));
  567. assign fifo_do_read = (fifo_syncfifo_readable & fifo_syncfifo_re);
  568. assign fifo_rdport_adr = fifo_consume;
  569. assign fifo_syncfifo_dout = fifo_rdport_dat_r;
  570. assign fifo_rdport_re = fifo_do_read;
  571. assign fifo_syncfifo_writable = (fifo_level0 != 5'd16);
  572. assign fifo_syncfifo_readable = (fifo_level0 != 1'd0);
  573. always @(*) begin
  574. accelgluesoc_we <= 1'd0;
  575. accelgluesoc_wishbone_ack <= 1'd0;
  576. accelgluesoc_dat_w <= 32'd0;
  577. accelgluesoc_wishbone2csr_next_state <= 1'd0;
  578. accelgluesoc_wishbone_dat_r <= 32'd0;
  579. accelgluesoc_adr <= 14'd0;
  580. accelgluesoc_wishbone2csr_next_state <= accelgluesoc_wishbone2csr_state;
  581. case (accelgluesoc_wishbone2csr_state)
  582. 1'd1: begin
  583. accelgluesoc_wishbone_ack <= 1'd1;
  584. accelgluesoc_wishbone_dat_r <= accelgluesoc_dat_r;
  585. accelgluesoc_wishbone2csr_next_state <= 1'd0;
  586. end
  587. default: begin
  588. accelgluesoc_dat_w <= accelgluesoc_wishbone_dat_w;
  589. if ((accelgluesoc_wishbone_cyc & accelgluesoc_wishbone_stb)) begin
  590. accelgluesoc_adr <= accelgluesoc_wishbone_adr;
  591. accelgluesoc_we <= (accelgluesoc_wishbone_we & (accelgluesoc_wishbone_sel != 1'd0));
  592. accelgluesoc_wishbone2csr_next_state <= 1'd1;
  593. end
  594. end
  595. endcase
  596. end
  597. assign sel = (bank_bus_adr[13:9] == 1'd0);
  598. assign run0_r = bank_bus_dat_w[0];
  599. always @(*) begin
  600. run0_re <= 1'd0;
  601. run0_we <= 1'd0;
  602. if ((sel & (bank_bus_adr[8:0] == 1'd0))) begin
  603. run0_re <= bank_bus_we;
  604. run0_we <= (~bank_bus_we);
  605. end
  606. end
  607. assign done_r = bank_bus_dat_w[0];
  608. always @(*) begin
  609. done_we <= 1'd0;
  610. done_re <= 1'd0;
  611. if ((sel & (bank_bus_adr[8:0] == 1'd1))) begin
  612. done_re <= bank_bus_we;
  613. done_we <= (~bank_bus_we);
  614. end
  615. end
  616. assign x00_r = bank_bus_dat_w[15:0];
  617. always @(*) begin
  618. x00_re <= 1'd0;
  619. x00_we <= 1'd0;
  620. if ((sel & (bank_bus_adr[8:0] == 2'd2))) begin
  621. x00_re <= bank_bus_we;
  622. x00_we <= (~bank_bus_we);
  623. end
  624. end
  625. assign y00_r = bank_bus_dat_w[15:0];
  626. always @(*) begin
  627. y00_re <= 1'd0;
  628. y00_we <= 1'd0;
  629. if ((sel & (bank_bus_adr[8:0] == 2'd3))) begin
  630. y00_re <= bank_bus_we;
  631. y00_we <= (~bank_bus_we);
  632. end
  633. end
  634. assign x10_r = bank_bus_dat_w[15:0];
  635. always @(*) begin
  636. x10_we <= 1'd0;
  637. x10_re <= 1'd0;
  638. if ((sel & (bank_bus_adr[8:0] == 3'd4))) begin
  639. x10_re <= bank_bus_we;
  640. x10_we <= (~bank_bus_we);
  641. end
  642. end
  643. assign y10_r = bank_bus_dat_w[15:0];
  644. always @(*) begin
  645. y10_re <= 1'd0;
  646. y10_we <= 1'd0;
  647. if ((sel & (bank_bus_adr[8:0] == 3'd5))) begin
  648. y10_re <= bank_bus_we;
  649. y10_we <= (~bank_bus_we);
  650. end
  651. end
  652. assign rgba0_r = bank_bus_dat_w[31:0];
  653. always @(*) begin
  654. rgba0_we <= 1'd0;
  655. rgba0_re <= 1'd0;
  656. if ((sel & (bank_bus_adr[8:0] == 3'd6))) begin
  657. rgba0_re <= bank_bus_we;
  658. rgba0_we <= (~bank_bus_we);
  659. end
  660. end
  661. assign base0_r = bank_bus_dat_w[31:0];
  662. always @(*) begin
  663. base0_we <= 1'd0;
  664. base0_re <= 1'd0;
  665. if ((sel & (bank_bus_adr[8:0] == 3'd7))) begin
  666. base0_re <= bank_bus_we;
  667. base0_we <= (~bank_bus_we);
  668. end
  669. end
  670. assign xstride0_r = bank_bus_dat_w[15:0];
  671. always @(*) begin
  672. xstride0_re <= 1'd0;
  673. xstride0_we <= 1'd0;
  674. if ((sel & (bank_bus_adr[8:0] == 4'd8))) begin
  675. xstride0_re <= bank_bus_we;
  676. xstride0_we <= (~bank_bus_we);
  677. end
  678. end
  679. assign ystride0_r = bank_bus_dat_w[15:0];
  680. always @(*) begin
  681. ystride0_we <= 1'd0;
  682. ystride0_re <= 1'd0;
  683. if ((sel & (bank_bus_adr[8:0] == 4'd9))) begin
  684. ystride0_re <= bank_bus_we;
  685. ystride0_we <= (~bank_bus_we);
  686. end
  687. end
  688. assign run0_w = extcore_run_storage;
  689. assign done_w = extcore_done_status;
  690. assign extcore_done_we = done_we;
  691. assign x00_w = extcore_csrstorage0_storage[15:0];
  692. assign y00_w = extcore_csrstorage1_storage[15:0];
  693. assign x10_w = extcore_csrstorage2_storage[15:0];
  694. assign y10_w = extcore_csrstorage3_storage[15:0];
  695. assign rgba0_w = extcore_csrstorage4_storage[31:0];
  696. assign base0_w = extcore_csrstorage5_storage[31:0];
  697. assign xstride0_w = extcore_csrstorage6_storage[15:0];
  698. assign ystride0_w = extcore_csrstorage7_storage[15:0];
  699. assign csr_interconnect_adr = accelgluesoc_adr;
  700. assign csr_interconnect_we = accelgluesoc_we;
  701. assign csr_interconnect_dat_w = accelgluesoc_dat_w;
  702. assign accelgluesoc_dat_r = csr_interconnect_dat_r;
  703. assign bank_bus_adr = csr_interconnect_adr;
  704. assign bank_bus_we = csr_interconnect_we;
  705. assign bank_bus_dat_w = csr_interconnect_dat_w;
  706. assign csr_interconnect_dat_r = bank_bus_dat_r;
  707. always @(posedge por_clk) begin
  708. soc_int_rst <= rst;
  709. end
  710. always @(posedge sys_clk) begin
  711. accelgluesoc_wpubase_state <= accelgluesoc_wpubase_next_state;
  712. if (autoevict_counter_next_value_ce) begin
  713. autoevict_counter <= autoevict_counter_next_value;
  714. end
  715. if (fifo_syncfifo_re) begin
  716. fifo_readable <= 1'd1;
  717. end else begin
  718. if (fifo_re) begin
  719. fifo_readable <= 1'd0;
  720. end
  721. end
  722. if (((fifo_syncfifo_we & fifo_syncfifo_writable) & (~fifo_replace))) begin
  723. fifo_produce <= (fifo_produce + 1'd1);
  724. end
  725. if (fifo_do_read) begin
  726. fifo_consume <= (fifo_consume + 1'd1);
  727. end
  728. if (((fifo_syncfifo_we & fifo_syncfifo_writable) & (~fifo_replace))) begin
  729. if ((~fifo_do_read)) begin
  730. fifo_level0 <= (fifo_level0 + 1'd1);
  731. end
  732. end else begin
  733. if (fifo_do_read) begin
  734. fifo_level0 <= (fifo_level0 - 1'd1);
  735. end
  736. end
  737. accelgluesoc_wishbone2csr_state <= accelgluesoc_wishbone2csr_next_state;
  738. bank_bus_dat_r <= 1'd0;
  739. if (sel) begin
  740. case (bank_bus_adr[8:0])
  741. 1'd0: begin
  742. bank_bus_dat_r <= run0_w;
  743. end
  744. 1'd1: begin
  745. bank_bus_dat_r <= done_w;
  746. end
  747. 2'd2: begin
  748. bank_bus_dat_r <= x00_w;
  749. end
  750. 2'd3: begin
  751. bank_bus_dat_r <= y00_w;
  752. end
  753. 3'd4: begin
  754. bank_bus_dat_r <= x10_w;
  755. end
  756. 3'd5: begin
  757. bank_bus_dat_r <= y10_w;
  758. end
  759. 3'd6: begin
  760. bank_bus_dat_r <= rgba0_w;
  761. end
  762. 3'd7: begin
  763. bank_bus_dat_r <= base0_w;
  764. end
  765. 4'd8: begin
  766. bank_bus_dat_r <= xstride0_w;
  767. end
  768. 4'd9: begin
  769. bank_bus_dat_r <= ystride0_w;
  770. end
  771. endcase
  772. end
  773. if (run0_re) begin
  774. extcore_run_storage <= run0_r;
  775. end
  776. extcore_run_re <= run0_re;
  777. extcore_done_re <= done_re;
  778. if (x00_re) begin
  779. extcore_csrstorage0_storage[15:0] <= x00_r;
  780. end
  781. extcore_csrstorage0_re <= x00_re;
  782. if (y00_re) begin
  783. extcore_csrstorage1_storage[15:0] <= y00_r;
  784. end
  785. extcore_csrstorage1_re <= y00_re;
  786. if (x10_re) begin
  787. extcore_csrstorage2_storage[15:0] <= x10_r;
  788. end
  789. extcore_csrstorage2_re <= x10_re;
  790. if (y10_re) begin
  791. extcore_csrstorage3_storage[15:0] <= y10_r;
  792. end
  793. extcore_csrstorage3_re <= y10_re;
  794. if (rgba0_re) begin
  795. extcore_csrstorage4_storage[31:0] <= rgba0_r;
  796. end
  797. extcore_csrstorage4_re <= rgba0_re;
  798. if (base0_re) begin
  799. extcore_csrstorage5_storage[31:0] <= base0_r;
  800. end
  801. extcore_csrstorage5_re <= base0_re;
  802. if (xstride0_re) begin
  803. extcore_csrstorage6_storage[15:0] <= xstride0_r;
  804. end
  805. extcore_csrstorage6_re <= xstride0_re;
  806. if (ystride0_re) begin
  807. extcore_csrstorage7_storage[15:0] <= ystride0_r;
  808. end
  809. extcore_csrstorage7_re <= ystride0_re;
  810. if (sys_rst) begin
  811. extcore_run_storage <= 1'd0;
  812. extcore_run_re <= 1'd0;
  813. extcore_done_re <= 1'd0;
  814. extcore_csrstorage0_storage <= 16'd0;
  815. extcore_csrstorage0_re <= 1'd0;
  816. extcore_csrstorage1_storage <= 16'd0;
  817. extcore_csrstorage1_re <= 1'd0;
  818. extcore_csrstorage2_storage <= 16'd0;
  819. extcore_csrstorage2_re <= 1'd0;
  820. extcore_csrstorage3_storage <= 16'd0;
  821. extcore_csrstorage3_re <= 1'd0;
  822. extcore_csrstorage4_storage <= 32'd0;
  823. extcore_csrstorage4_re <= 1'd0;
  824. extcore_csrstorage5_storage <= 32'd0;
  825. extcore_csrstorage5_re <= 1'd0;
  826. extcore_csrstorage6_storage <= 16'd0;
  827. extcore_csrstorage6_re <= 1'd0;
  828. extcore_csrstorage7_storage <= 16'd0;
  829. extcore_csrstorage7_re <= 1'd0;
  830. autoevict_counter <= 3'd0;
  831. fifo_readable <= 1'd0;
  832. fifo_level0 <= 5'd0;
  833. fifo_produce <= 4'd0;
  834. fifo_consume <= 4'd0;
  835. accelgluesoc_wpubase_state <= 3'd1;
  836. accelgluesoc_wishbone2csr_state <= 1'd0;
  837. end
  838. end
  839. reg [127:0] data_mem[0:7];
  840. reg [2:0] data_mem_adr0;
  841. always @(posedge sys_clk) begin
  842. if (data_port_we[0])
  843. data_mem[data_port_adr][7:0] <= data_port_dat_w[7:0];
  844. if (data_port_we[1])
  845. data_mem[data_port_adr][15:8] <= data_port_dat_w[15:8];
  846. if (data_port_we[2])
  847. data_mem[data_port_adr][23:16] <= data_port_dat_w[23:16];
  848. if (data_port_we[3])
  849. data_mem[data_port_adr][31:24] <= data_port_dat_w[31:24];
  850. if (data_port_we[4])
  851. data_mem[data_port_adr][39:32] <= data_port_dat_w[39:32];
  852. if (data_port_we[5])
  853. data_mem[data_port_adr][47:40] <= data_port_dat_w[47:40];
  854. if (data_port_we[6])
  855. data_mem[data_port_adr][55:48] <= data_port_dat_w[55:48];
  856. if (data_port_we[7])
  857. data_mem[data_port_adr][63:56] <= data_port_dat_w[63:56];
  858. if (data_port_we[8])
  859. data_mem[data_port_adr][71:64] <= data_port_dat_w[71:64];
  860. if (data_port_we[9])
  861. data_mem[data_port_adr][79:72] <= data_port_dat_w[79:72];
  862. if (data_port_we[10])
  863. data_mem[data_port_adr][87:80] <= data_port_dat_w[87:80];
  864. if (data_port_we[11])
  865. data_mem[data_port_adr][95:88] <= data_port_dat_w[95:88];
  866. if (data_port_we[12])
  867. data_mem[data_port_adr][103:96] <= data_port_dat_w[103:96];
  868. if (data_port_we[13])
  869. data_mem[data_port_adr][111:104] <= data_port_dat_w[111:104];
  870. if (data_port_we[14])
  871. data_mem[data_port_adr][119:112] <= data_port_dat_w[119:112];
  872. if (data_port_we[15])
  873. data_mem[data_port_adr][127:120] <= data_port_dat_w[127:120];
  874. data_mem_adr0 <= data_port_adr;
  875. end
  876. assign data_port_dat_r = data_mem[data_mem_adr0];
  877. reg [15:0] sel_mem[0:7];
  878. reg [2:0] sel_mem_adr0;
  879. always @(posedge sys_clk) begin
  880. if (sel_port_we)
  881. sel_mem[sel_port_adr] <= sel_port_dat_w;
  882. sel_mem_adr0 <= sel_port_adr;
  883. end
  884. assign sel_port_dat_r = sel_mem[sel_mem_adr0];
  885. reg [27:0] tag_mem[0:7];
  886. reg [2:0] tag_mem_adr0;
  887. always @(posedge sys_clk) begin
  888. if (tag_port_we)
  889. tag_mem[tag_port_adr] <= tag_port_dat_w;
  890. tag_mem_adr0 <= tag_port_adr;
  891. end
  892. assign tag_port_dat_r = tag_mem[tag_mem_adr0];
  893. reg [145:0] storage[0:15];
  894. reg [145:0] storage_dat0;
  895. reg [145:0] storage_dat1;
  896. always @(posedge sys_clk) begin
  897. if (fifo_wrport_we)
  898. storage[fifo_wrport_adr] <= fifo_wrport_dat_w;
  899. storage_dat0 <= storage[fifo_wrport_adr];
  900. end
  901. always @(posedge sys_clk) begin
  902. if (fifo_rdport_re)
  903. storage_dat1 <= storage[fifo_rdport_adr];
  904. end
  905. assign fifo_wrport_dat_r = storage_dat0;
  906. assign fifo_rdport_dat_r = storage_dat1;
  907. M_accel_rectangle_fill32 M_accel_rectangle_fill32(
  908. .clock(sys_clk),
  909. .in_base(extcore_args_payload_base),
  910. .in_bus_ack(extcore_dma_bus_ack),
  911. .in_bus_dat_r(extcore_dma_bus_dat_r),
  912. .in_rgba(extcore_args_payload_rgba),
  913. .in_run(extcore_args_valid),
  914. .in_x0(extcore_args_payload_x0),
  915. .in_x1(extcore_args_payload_x1),
  916. .in_xstride(extcore_args_payload_xstride),
  917. .in_y0(extcore_args_payload_y0),
  918. .in_y1(extcore_args_payload_y1),
  919. .in_ystride(extcore_args_payload_ystride),
  920. .reset(sys_rst),
  921. .out_bus_adr(extcore_adr),
  922. .out_bus_cyc(extcore_dma_bus_cyc),
  923. .out_bus_dat_w(extcore_dma_bus_dat_w),
  924. .out_bus_sel(extcore_dma_bus_sel),
  925. .out_bus_stb(extcore_dma_bus_stb),
  926. .out_bus_we(extcore_dma_bus_we),
  927. .out_done(extcore_args_ready)
  928. );
  929. endmodule