SPIm_tb.v 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. `timescale 1ns/1ps
  2. module tb_SPIm;
  3. // Parameters
  4. parameter CLK_PERIOD = 8.13; // Clock period in ns
  5. // Inputs
  6. reg Clk_i;
  7. reg Rst_i;
  8. reg Start_i;
  9. reg CPHA_i;
  10. reg [31:0] SPIdata;
  11. reg SpiDataVal_i;
  12. reg SELST_i;
  13. reg [1:0] WidthSel_i;
  14. reg LAG_i;
  15. reg LEAD_i;
  16. reg EndianSel_i;
  17. reg [5:0] Stop_i;
  18. reg PulsePol_i;
  19. // Outputs
  20. wire Mosi0_o;
  21. wire Mosi1_o;
  22. wire Mosi2_o;
  23. wire Mosi3_o;
  24. wire Sck_o;
  25. wire Ss_o;
  26. wire Val_o;
  27. // SPIm SPIm_inst (
  28. // .Clk_i(Clk_i),
  29. // .Rst_i(Rst_i),
  30. // .Start_i(Start_i),
  31. // .CPHA_i(CPHA_i),
  32. // .SPIdata(SPIdata),
  33. // .SpiDataVal_i(SpiDataVal_i),
  34. // .SELST_i(SELST_i),
  35. // .WidthSel_i(WidthSel_i),
  36. // .LAG_i(LAG_i),
  37. // .LEAD_i(LEAD_i),
  38. // .EndianSel_i(EndianSel_i),
  39. // .Stop_i(Stop_i),
  40. // .PulsePol_i(PulsePol_i),
  41. // .Mosi0_o(Mosi0_o),
  42. // .Sck_o(Sck_o),
  43. // .Ss_o(Ss_o),
  44. // .Val_o(Val_o)
  45. // );
  46. // SPIs SPIs_inst (
  47. // .Clk_i(Clk_i),
  48. // .Rst_i(Rst_i),
  49. // .Sck_i(Sck_o),
  50. // .Ss_i(Ss_o),
  51. // .Mosi0_i(Mosi0_o),
  52. // .WidthSel_i(WidthSel_i),
  53. // .EndianSel_i(EndianSel_i),
  54. // .SELST_i(SELST_i),
  55. // .Data_o(),
  56. // .Addr_o(),
  57. // .DataToRxFifo_o(),
  58. // .Val_o()
  59. // );
  60. QuadSPIm QuadSPIm_inst (
  61. .Clk_i(Clk_i),
  62. .Rst_i(Rst_i),
  63. .Start_i(Start_i),
  64. .CPHA_i(CPHA_i),
  65. .SPIdata(SPIdata),
  66. .SpiDataVal_i(SpiDataVal_i),
  67. .SELST_i(SELST_i),
  68. .WidthSel_i(WidthSel_i),
  69. .LAG_i(LAG_i),
  70. .LEAD_i(LEAD_i),
  71. .EndianSel_i(EndianSel_i),
  72. .Stop_i(Stop_i),
  73. .PulsePol_i(PulsePol_i),
  74. .Mosi0_i(Mosi0_o),
  75. .Mosi1_i(Mosi1_o),
  76. .Mosi2_i(Mosi2_o),
  77. .Mosi3_i(Mosi3_o),
  78. .Sck_o(Sck_o),
  79. .Ss_o(Ss_o),
  80. .Val_o(Val_o)
  81. );
  82. QuadSPIs QuadSPIs_inst (
  83. .Clk_i(Clk_i),
  84. .Rst_i(Rst_i),
  85. .Sck_i(Sck_o),
  86. .Ss_i(Ss_o),
  87. .Mosi0_i(Mosi0_o),
  88. .Mosi1_i(Mosi1_o),
  89. .Mosi2_i(Mosi2_o),
  90. .Mosi3_i(Mosi3_o),
  91. .WidthSel_i(WidthSel_i),
  92. .SELST_i(SELST_i),
  93. .Data_o(),
  94. .Addr_o(),
  95. .DataToRxFifo_o(),
  96. .Val_o()
  97. );
  98. // Clock generation
  99. always #(CLK_PERIOD/2) Clk_i = ~Clk_i;
  100. // Initial setup and test sequence
  101. initial begin
  102. // Initialize Inputs
  103. Clk_i = 0;
  104. Rst_i = 1;
  105. Start_i = 0;
  106. CPHA_i = 0;
  107. SpiDataVal_i = 0;
  108. SPIdata = 32'h00000000;
  109. SELST_i = 1;//0:High, 1:Low
  110. WidthSel_i = 3; // Full 32-bit width
  111. LAG_i = 0;
  112. LEAD_i = 0;
  113. EndianSel_i = 1; // 0:MSB first, 1:lsb first
  114. Stop_i = 6'd0;
  115. PulsePol_i = 0;
  116. // Reset the system
  117. #(CLK_PERIOD*10) Rst_i = 0;
  118. #(CLK_PERIOD*2) Start_i = 1; // Start SPI transaction
  119. #(CLK_PERIOD*10)SPIdata = {1'h0, 7'h2a, 8'haa,8'h00,8'haa};
  120. // #(CLK_PERIOD*10)SPIdata = 32'haa;
  121. #(CLK_PERIOD*100);
  122. // EndianSel_i = 1; // LSB first
  123. // SPIdata = {1'h0, 7'h2a, 8'haa,8'h00,8'haa};
  124. // #(CLK_PERIOD*2) Start_i = 0;
  125. // #(CLK_PERIOD) Start_i = 1;
  126. end
  127. endmodule