S5443_3_tb.v 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. `timescale 1ns / 1ps
  2. module S5443_3_tb;
  3. parameter CLK_PERIOD = 8.13; // Clock period in ns
  4. reg Clk_i;
  5. reg Rst_i;
  6. reg [10:0] SmcAddr_i;
  7. reg [15:0]SmcData_i;
  8. reg SmcAre_i;
  9. wire smcAre;
  10. reg SmcAwe_i;
  11. wire SmcAmsN_i;
  12. wire [1:0] SmcBe_i;
  13. wire SmcAoe_i;
  14. reg [31:0] tb_cnt;
  15. wire [15:0] smcData;
  16. reg mosi1reg;
  17. reg minorByte;
  18. reg [1:0] areCnt;
  19. //***********************************************
  20. // SPI0 Adresses
  21. //***********************************************
  22. // Address map for SPI0
  23. localparam [10:0] BaseAddr0 = 11'h0;
  24. localparam [10:0] Spi0CtrlAddr = BaseAddr0;
  25. localparam [10:0] Spi0ClkAddr = (BaseAddr0 + 4)>>1;
  26. localparam [10:0] Spi0CsDelayAddr = (BaseAddr0 + 8)>>1;
  27. localparam [10:0] Spi0CsCtrlAddr = (BaseAddr0 + 12)>>1;
  28. localparam [10:0] Spi0TxFifoCtrlAddr = (BaseAddr0 + 16)>>1;
  29. localparam [10:0] Spi0RxFifoCtrlAddr = (BaseAddr0 + 20)>>1;
  30. localparam [10:0] Spi0TxFifoAddrL = (BaseAddr0 + 24)>>1;
  31. localparam [10:0] Spi0TxFifoAddrM = (BaseAddr0 + 26)>>1;
  32. localparam [10:0] Spi0RxFifoAddrL = (BaseAddr0 + 28)>>1;
  33. localparam [10:0] Spi0RxFifoAddrM = (BaseAddr0 + 30)>>1;
  34. // Data for SPI0CtrlReg
  35. //***********************************************
  36. // SPI0 Ctrl Reg Data
  37. //***********************************************
  38. localparam SpiEn0 = 1'b1;//1 for enable, 0 for disable
  39. localparam ClockPhase0 = 1'b0;//
  40. localparam ClockPolarity0 = 1'b0;//0 for active high, 1 for active low
  41. localparam Assel0 = 1'b1;//0 for software control, 1 for hardware control
  42. localparam SelSt0 = 1'b1; //1 - assert slave select(low), 0 - deassert slave select(high)
  43. localparam Size0 = 2'd2; //0 - 8 bits, 1 - 16 bits, 2 - 24 bits, 3 - 32 bits
  44. localparam Mode0 = 1'b0; // 1 - 4 Mosi, 0 - 1 Mosi
  45. localparam LSBF0 = 1'b0; // 1 - LSB first, 0 - MSB first
  46. localparam [15:0] Spi0CtrlRegData = {8'h0,LSBF0, Mode0, Size0, SelSt0, Assel0, ClockPolarity0, ClockPhase0, SpiEn0};
  47. //***********************************************
  48. // SPI0 Clk Reg Data
  49. //***********************************************
  50. localparam Div = 4'd1; // Custom divider value(input clock frequency = 80 MHz)
  51. localparam Mux0 = 1'b1; // 0 - input clock, 1 - MMCM output clock
  52. localparam Mux1 = 3'd0; // MMCM output clock number
  53. localparam Spi0ClkRegData = {8'h0, Mux1, Mux0, Div};
  54. //***********************************************
  55. // SPI0 Cs Delay Reg Data
  56. //***********************************************
  57. localparam Lag0 = 1'b0; //Extended SPI clock lag control, 0 - Disable, 1 - Enable
  58. localparam Lead0 = 1'b0; //Extended SPI clock lead control, 0 - Disable, 1 - Enable
  59. localparam Stop0 = 6'd0; //Number of clock cycles to wait after CS is deasserted
  60. localparam [15:0] Spi0CsDelayRegData = {8'h0, Stop0, Lead0, Lag0};
  61. //***********************************************
  62. // SPI0 Cs Ctrl Reg Data
  63. //***********************************************
  64. localparam CS0 = 1'b1; // 1 - device selected, 0 - device deselected
  65. localparam CS1 = 1'b1; // 1 - device selected, 0 - device deselected
  66. localparam [15:0] Spi0CsCtrlRegData = {14'h0, CS1, CS0};
  67. //***********************************************
  68. // SPI0 Tx Fifo Ctrl Reg Data
  69. //***********************************************
  70. localparam RstTxFifo0 = 1'b1; // 1 - Reset Tx FIFO, 0 - Normal operation
  71. // at least 5 clock cycles of a slow clock
  72. localparam [15:0] Spi0TxFifoCtrlRegDataRstOn = {15'h0, RstTxFifo0};
  73. localparam [15:0] Spi0TxFifoCtrlRegDataRstOff = {15'h0, 1'b0};
  74. //***********************************************
  75. // SPI0 Rx Fifo Ctrl Reg Data
  76. //***********************************************
  77. localparam RstRxFifo0 = 1'b1; // 1 - Reset Rx FIFO, 0 - Normal operation
  78. localparam [15:0] Spi0RxFifoCtrlRegDataRstOn = {15'h0, RstRxFifo0};
  79. localparam [15:0] Spi0RxFifoCtrlRegDataRstOff = {15'h0, 1'b0};
  80. //***********************************************
  81. // SPITXRX Enable Register
  82. //***********************************************
  83. localparam SpiTxRxEn0 = 1'b1;
  84. localparam SpiTxRxEn1 = 1'b0;
  85. localparam SpiTxRxEn2 = 1'b0;
  86. localparam SpiTxRxEn3 = 1'b0;
  87. localparam SpiTxRxEn4 = 1'b0;
  88. localparam SpiTxRxEn5 = 1'b0;
  89. localparam SpiTxRxEn6 = 1'b0;
  90. localparam [15:0] SpiTxRxEnRegData = {8'h0, SpiTxRxEn6, SpiTxRxEn5, SpiTxRxEn4, SpiTxRxEn3, SpiTxRxEn2, SpiTxRxEn1, SpiTxRxEn0};
  91. //***********************************************
  92. // GPIO Reg Data
  93. //***********************************************
  94. localparam RstForSbTmsg = 1'b1; // 1 - Reset for SB TMSG, 0 - Normal operation
  95. localparam [15:0] GPIORegDataRstOn = {15'h0, RstForSbTmsg};
  96. localparam [15:0] GPIORegDataRstOff = {15'h0, 1'b0};
  97. //***********************************************
  98. // SPI1HEADERS
  99. //***********************************************
  100. localparam [10:0] BaseAddr1 = 11'h50;
  101. localparam [10:0] Spi1CtrlAddr = (BaseAddr1)>>1;
  102. localparam [10:0] Spi1ClkAddr = (BaseAddr1 + 4)>>1;
  103. localparam [10:0] Spi1CsDelayAddr = (BaseAddr1 + 8)>>1;
  104. localparam [10:0] Spi1CsCtrlAddr = (BaseAddr1 + 12)>>1;
  105. localparam [10:0] Spi1TxFifoCtrlAddr = (BaseAddr1 + 16)>>1;
  106. localparam [10:0] Spi1RxFifoCtrlAddr = (BaseAddr1 + 20)>>1;
  107. localparam [10:0] Spi1TxFifoAddr = (BaseAddr1 + 24)>>1;
  108. localparam [10:0] Spi1RxFifoAddr = (BaseAddr1 + 28)>>1;
  109. //***********************************************
  110. // SPI2HEADERS
  111. //***********************************************
  112. localparam [10:0] BaseAddr2 = 11'hF0;
  113. localparam [10:0] Spi2CtrlAddr = (BaseAddr2)>>1;
  114. localparam [10:0] Spi2ClkAddr = (BaseAddr2 + 4)>>1;
  115. localparam [10:0] Spi2CsDelayAddr = (BaseAddr2 + 8)>>1;
  116. localparam [10:0] Spi2CsCtrlAddr = (BaseAddr2 + 12)>>1;
  117. localparam [10:0] Spi2TxFifoCtrlAddr = (BaseAddr2 + 16)>>1;
  118. localparam [10:0] Spi2RxFifoCtrlAddr = (BaseAddr2 + 20)>>1;
  119. localparam [10:0] Spi2TxFifoAddr = (BaseAddr2 + 24)>>1;
  120. localparam [10:0] Spi2RxFifoAddr = (BaseAddr2 + 28)>>1;
  121. //***********************************************
  122. // SPI3HEADERS
  123. //***********************************************
  124. localparam [10:0] BaseAddr3 = 11'h140;
  125. localparam [10:0] Spi3CtrlAddr = (BaseAddr3)>>1;
  126. localparam [10:0] Spi3ClkAddr = (BaseAddr3 + 4)>>1;
  127. localparam [10:0] Spi3CsDelayAddr = (BaseAddr3 + 8)>>1;
  128. localparam [10:0] Spi3CsCtrlAddr = (BaseAddr3 + 12)>>1;
  129. localparam [10:0] Spi3TxFifoCtrlAddr = (BaseAddr3 + 16)>>1;
  130. localparam [10:0] Spi3RxFifoCtrlAddr = (BaseAddr3 + 20)>>1;
  131. localparam [10:0] Spi3TxFifoAddr = (BaseAddr3 + 24)>>1;
  132. localparam [10:0] Spi3RxFifoAddr = (BaseAddr3 + 28)>>1;
  133. //***********************************************
  134. // SPI4HEADERS
  135. //***********************************************
  136. localparam [10:0] BaseAddr4 = 11'h190;
  137. localparam [10:0] Spi4CtrlAddr = (BaseAddr4)>>1;
  138. localparam [10:0] Spi4ClkAddr = (BaseAddr4 + 4)>>1;
  139. localparam [10:0] Spi4CsDelayAddr = (BaseAddr4 + 8)>>1;
  140. localparam [10:0] Spi4CsCtrlAddr = (BaseAddr4 + 12)>>1;
  141. localparam [10:0] Spi4TxFifoCtrlAddr = (BaseAddr4 + 16)>>1;
  142. localparam [10:0] Spi4RxFifoCtrlAddr = (BaseAddr4 + 20)>>1;
  143. localparam [10:0] Spi4TxFifoAddr = (BaseAddr4 + 24)>>1;
  144. localparam [10:0] Spi4RxFifoAddr = (BaseAddr4 + 28)>>1;
  145. //***********************************************
  146. // SPI5HEADERS
  147. //***********************************************
  148. localparam [10:0] BaseAddr5 = 11'h1E0;
  149. localparam [10:0] Spi5CtrlAddr = (BaseAddr5)>>1;
  150. localparam [10:0] Spi5ClkAddr = (BaseAddr5 + 4)>>1;
  151. localparam [10:0] Spi5CsDelayAddr = (BaseAddr5 + 8)>>1;
  152. localparam [10:0] Spi5CsCtrlAddr = (BaseAddr5 + 12)>>1;
  153. localparam [10:0] Spi5TxFifoCtrlAddr = (BaseAddr5 + 16)>>1;
  154. localparam [10:0] Spi5RxFifoCtrlAddr = (BaseAddr5 + 20)>>1;
  155. localparam [10:0] Spi5TxFifoAddr = (BaseAddr5 + 24)>>1;
  156. localparam [10:0] Spi5RxFifoAddr = (BaseAddr5 + 28)>>1;
  157. //***********************************************
  158. // SPI5HEADERS
  159. //***********************************************
  160. localparam [10:0] BaseAddr6 = 11'h230;
  161. localparam [10:0] Spi6CtrlAddr = (BaseAddr6)>>1;
  162. localparam [10:0] Spi6ClkAddr = (BaseAddr6 + 4)>>1;
  163. localparam [10:0] Spi6CsDelayAddr = (BaseAddr6 + 8)>>1;
  164. localparam [10:0] Spi6CsCtrlAddr = (BaseAddr6 + 12)>>1;
  165. localparam [10:0] Spi6TxFifoCtrlAddr = (BaseAddr6 + 16)>>1;
  166. localparam [10:0] Spi6RxFifoCtrlAddr = (BaseAddr6 + 20)>>1;
  167. localparam [10:0] Spi6TxFifoAddr = (BaseAddr6 + 24)>>1;
  168. localparam [10:0] Spi6RxFifoAddr = (BaseAddr6 + 28)>>1;
  169. //***********************************************
  170. // SPITXRX Enable Reg Adress
  171. //***********************************************
  172. localparam SpiTxRxEnAddr = 11'h780;
  173. //***********************************************
  174. // GPIO Reg Adress
  175. //***********************************************
  176. localparam GPIOAddr = 11'h7F8;
  177. //***********************************************
  178. // ASSIGNS
  179. //***********************************************
  180. assign SmcBe_i = (tb_cnt >0 && tb_cnt <=374) ? 2'b00 : 2'b11;
  181. assign SmcAmsN_i = (tb_cnt > 0 && tb_cnt <= 44) ? 1'b0 : 1'b1;
  182. assign SmcAoe_i = (tb_cnt > 330 && tb_cnt <= 374) ? 1'b0 : 1'b1;
  183. assign smcData = (!SmcAoe_i && !SmcAre_i) ? 16'bz:SmcData_i;
  184. assign mosi1_io = (!Mode0) ? mosi0_o : 1'bz;
  185. assign smcAre = SmcAre_i;
  186. //***********************************************
  187. // CLOCK GENERATION
  188. //***********************************************
  189. always #(CLK_PERIOD/2) Clk_i = ~Clk_i;
  190. S5443_3Top uut (
  191. .Clk123_i(Clk_i),
  192. .SmcAddr_i(SmcAddr_i),
  193. .SmcData_io(smcData),
  194. .SmcAwe_i(SmcAwe_i),
  195. .SmcAmsN_i(SmcAmsN_i),
  196. .SmcAre_i(smcAre),
  197. .SmcBe_i(SmcBe_i),
  198. .SmcAoe_i(SmcAoe_i),
  199. .Led_o(),
  200. .Mosi0_o(mosi0_o),
  201. .Mosi1_io(mosi1_io),
  202. .Mosi2_o(),
  203. .Mosi3_o(),
  204. .Ss_o(),
  205. .SsFlash_o(),
  206. .Sck_o(),
  207. .SpiRst_o(),
  208. .LD_o()
  209. );
  210. always @(posedge Clk_i) begin
  211. if (Rst_i) begin
  212. SmcAwe_i <= 1'b1;
  213. end
  214. else begin
  215. if (tb_cnt > 0 && tb_cnt <= 44) begin
  216. if (tb_cnt % 2 != 0) begin
  217. SmcAwe_i <= 1'b1;
  218. end
  219. else begin
  220. SmcAwe_i <= 1'b0;
  221. end
  222. end
  223. end
  224. end
  225. always @(*) begin
  226. if (Rst_i) begin
  227. SmcAre_i <= 1'b1;
  228. end
  229. else begin
  230. if (tb_cnt > 330 && tb_cnt <= 374) begin
  231. if (tb_cnt % 2 != 0) begin
  232. if (areCnt < 3) begin
  233. SmcAre_i <= 1'b0;
  234. end
  235. else begin
  236. SmcAre_i = 1'b1;
  237. end
  238. end
  239. else begin
  240. SmcAre_i <= 1'b1;
  241. end
  242. end
  243. else begin
  244. SmcAre_i <= 1'b1;
  245. end
  246. end
  247. end
  248. always @(posedge Clk_i) begin
  249. if (Rst_i) begin
  250. SmcAddr_i <= 0;
  251. end
  252. else begin
  253. if (tb_cnt < 27) begin
  254. case (tb_cnt)
  255. 0: begin
  256. SmcAddr_i <= BaseAddr0;
  257. end
  258. 3: begin
  259. SmcAddr_i <= Spi0ClkAddr;
  260. end
  261. 5: begin
  262. SmcAddr_i <= Spi0CsDelayAddr;
  263. end
  264. 7: begin
  265. SmcAddr_i <= Spi0CsCtrlAddr;
  266. end
  267. 9: begin
  268. SmcAddr_i <= Spi0TxFifoCtrlAddr;
  269. end
  270. 11: begin
  271. SmcAddr_i <= Spi0RxFifoCtrlAddr;
  272. end
  273. 19 : begin
  274. SmcAddr_i <= Spi0TxFifoCtrlAddr;
  275. end
  276. 21 : begin
  277. SmcAddr_i <= Spi0RxFifoCtrlAddr;
  278. end
  279. 23 : begin
  280. SmcAddr_i <= SpiTxRxEnAddr;
  281. end
  282. endcase
  283. end
  284. else begin
  285. if (tb_cnt <= 44) begin
  286. if (tb_cnt % 2 != 0) begin
  287. SmcAddr_i <= Spi0TxFifoAddrL;
  288. end
  289. else begin
  290. SmcAddr_i <= Spi0TxFifoAddrM;
  291. end
  292. end
  293. else begin
  294. if (tb_cnt % 2 == 0) begin
  295. if (minorByte == 0) begin
  296. SmcAddr_i <= Spi0RxFifoCtrlAddr;
  297. end
  298. else begin
  299. SmcAddr_i <= Spi0RxFifoAddrL;
  300. end
  301. end
  302. end
  303. end
  304. end
  305. end
  306. always @(posedge Clk_i) begin
  307. if (Rst_i) begin
  308. areCnt <= 2'b0;
  309. end
  310. else begin
  311. if (!SmcAre_i) begin
  312. areCnt <= areCnt+1;
  313. end
  314. else begin
  315. areCnt <= 2'b0;
  316. end
  317. end
  318. end
  319. always @(posedge Clk_i) begin
  320. if (SmcAddr_i == Spi0RxFifoCtrlAddr) begin
  321. minorByte <= 1'b1;
  322. end
  323. else begin
  324. minorByte <= 1'b0;
  325. end
  326. end
  327. always @(posedge Clk_i) begin
  328. if (Rst_i) begin
  329. SmcData_i <= 16'h0;
  330. end
  331. else begin
  332. if (tb_cnt < 27 ) begin
  333. case (tb_cnt)
  334. 0 : begin
  335. SmcData_i <= Spi0CtrlRegData;
  336. end
  337. 3 : begin
  338. SmcData_i <= Spi0ClkRegData;
  339. end
  340. 5 : begin
  341. SmcData_i <= Spi0CsDelayRegData;
  342. end
  343. 7 : begin
  344. SmcData_i <= Spi0CsCtrlRegData;
  345. end
  346. 9 : begin
  347. SmcData_i <= Spi0TxFifoCtrlRegDataRstOn;
  348. end
  349. 11 : begin
  350. SmcData_i <= Spi0RxFifoCtrlRegDataRstOn;
  351. end
  352. 19 : begin
  353. SmcData_i <= Spi0TxFifoCtrlRegDataRstOff;
  354. end
  355. 21 : begin
  356. SmcData_i <= Spi0RxFifoCtrlRegDataRstOff;
  357. end
  358. 23 : begin
  359. SmcData_i <= SpiTxRxEnRegData;
  360. end
  361. endcase
  362. end
  363. else begin
  364. if (tb_cnt <300)
  365. SmcData_i <= $urandom_range(0, 8'hFF);
  366. end
  367. end
  368. end
  369. always @(posedge Clk_i) begin
  370. if (Rst_i) begin
  371. tb_cnt <= 0;
  372. end
  373. else begin
  374. if (SmcAre_i) begin
  375. tb_cnt <= tb_cnt + 1;
  376. end
  377. end
  378. end
  379. initial begin
  380. Clk_i = 1'b0;
  381. Rst_i = 1'b1;
  382. #(CLK_PERIOD*300) Rst_i = 1'b0;
  383. end
  384. endmodule