S5443_3_tb.v 12 KB

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