TopSbTmsgTb.sv 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. `timescale 1ns/1ns
  2. module TopSbTmsgTb(inout Mosi1_io);
  3. parameter CLK_PERIOD = 8.13; // Clock period in ns
  4. // Inputs
  5. logic Clk_i;
  6. logic Clk100;
  7. logic Clk200;
  8. logic Clk125;
  9. logic Clk60;
  10. logic Clk20;
  11. logic Clk80;
  12. logic Clk50;
  13. logic Clk24;
  14. logic Clk10;
  15. logic Rst_i;
  16. logic Start_i;
  17. logic CPHA_i;
  18. logic [31:0] SPIdata;
  19. logic SpiDataVal_i;
  20. logic SELST_i;
  21. logic [1:0] WidthSel_i;
  22. logic LAG_i;
  23. logic LEAD_i;
  24. logic EndianSel_i;
  25. logic [5:0] Stop_i;
  26. logic PulsePol_i;
  27. logic MisoLdLmx_i;
  28. // Outputs
  29. wire Mosi0_o;
  30. wire Mosi1_o;
  31. wire Mosi2_o;
  32. wire Mosi3_o;
  33. wire Sck_o;
  34. wire Ss_o;
  35. wire Val_o;
  36. wire anyFlag;
  37. wire valR;
  38. wire valQ;
  39. wire SckR;
  40. wire SckQ;
  41. wire SsR;
  42. wire SsQ;
  43. wire mosi0R;
  44. wire mosi0Q;
  45. wire locked;
  46. wire rstInit;
  47. logic mosi1Reg;
  48. logic [16:0] trCnt;
  49. logic [4:0] trCntSync;
  50. logic modeSel;
  51. logic [23:0] randData;
  52. logic [31:0] randData32;
  53. logic [5:0] QSPITotalWordNum;
  54. logic Stop;
  55. logic [31:0] stopCnt;
  56. logic rstForFPGA;
  57. //***********************************************
  58. // Lines From RF Top
  59. //***********************************************
  60. logic [7:0] sckFromRFTop;
  61. logic [7:0] mosiFromRFTop;
  62. logic [7:0] ssFromRFTop;
  63. logic [23:0] dataFromSPItb;
  64. logic valFromSPItb;
  65. //***********************************************
  66. // CLASSES
  67. //***********************************************
  68. class Packet;
  69. rand bit [23:0] data;
  70. rand bit [31:0] data32;
  71. endclass
  72. Packet pkt;
  73. //***********************************************
  74. // HEADERS FOR DEVICES
  75. //***********************************************
  76. localparam [4:0] DeviceIdLmx2594 = 5'h0;
  77. localparam [4:0] DeviceIdDDS = 5'h1;
  78. localparam [4:0] DeviceIdPot = 5'h2;
  79. localparam [4:0] DeviceIdDac = 5'h3;
  80. localparam [4:0] DeviceIdAtt = 5'h4;
  81. localparam [4:0] DeviceIdShReg = 5'h5;
  82. localparam [4:0] DeviceIdMax2870 = 5'h6;
  83. localparam [4:0] DeviceIdGpio1 = 5'h7;
  84. localparam [4:0] DeviceIdTemp = 5'h8;
  85. localparam [4:0] DeviceIdGpio2 = 5'h9;
  86. localparam [16:0] Gpio1InitWordNum = 17'd1;
  87. localparam [16:0] Gpio2InitWordNum = 17'd1;
  88. localparam [16:0] PotWordInitNum = 17'd1;
  89. localparam [16:0] DacWordInitNum = 17'd1;
  90. localparam [16:0] AttWordInitNum = 17'd1;
  91. localparam [16:0] ShRegWordInitNum = 17'd1;
  92. localparam [16:0] Lmx2594InitWordNum = 17'd13;
  93. localparam [16:0] DDSInitWordNum = 17'd7;
  94. localparam [16:0] MaxInitWordNum = 17'd6;
  95. localparam [16:0] TempSensWordNum = 17'd1;
  96. localparam [23:0] InitGpio1Header = {1'h0, DeviceIdGpio1, Gpio1InitWordNum, 1'h1};
  97. localparam [23:0] InitGpio2Header = {1'b0, DeviceIdGpio2,Gpio2InitWordNum,1'h1 };
  98. localparam [23:0] TempSensHeader = {1'h0, DeviceIdTemp, TempSensWordNum, 1'h1};
  99. localparam [23:0] InitLMX2594Header = {1'h0, DeviceIdLmx2594, Lmx2594InitWordNum, 1'h1};
  100. localparam [23:0] InitDDSHeader = {1'h0, DeviceIdDDS, DDSInitWordNum, 1'h1};
  101. localparam [23:0] InitMAX2870Header = {1'h0, DeviceIdMax2870, MaxInitWordNum, 1'h1};
  102. localparam [23:0] InitPotHeader = {1'h0, DeviceIdPot, PotWordInitNum, 1'h1};
  103. localparam [23:0] InitDacHeader = {1'h0, DeviceIdDac, DacWordInitNum, 1'h1};
  104. localparam [23:0] InitAttHeader = {1'h0, DeviceIdAtt, AttWordInitNum, 1'h1};
  105. localparam [23:0] InitShRegHeader = {1'h0, DeviceIdShReg, ShRegWordInitNum, 1'h1};
  106. localparam [3:0] LMXWordNum = 4'd4;
  107. localparam [2:0] DDSWordNum = 3'd4;
  108. localparam POTWordNum = 2'd2;
  109. localparam DACWordNum = 1'd1;
  110. localparam ATTWordNum = 1'd1;
  111. localparam [1:0] ShRegWordNum = 2'd1;
  112. localparam [1:0] MaxWordNum = 2'd2;
  113. localparam [1:0] GPIOWordNum = 2'd1;
  114. //***********************************************
  115. // GPIO 1 REG
  116. //***********************************************
  117. localparam [0:0] RF_SW1 = 1'h0;
  118. localparam [0:0] RF_SW2 = 1'h0;
  119. localparam [0:0] CTRL_AM_SW3 = 1'h0;
  120. localparam [0:0] DDS_SYNC_CTRL_FPGA = 1'h0;
  121. localparam [0:0] DDS_RESET_FPGA = 1'h0;
  122. localparam [0:0] DDS_SYNC_FPGA = 1'h0;
  123. localparam [0:0] SW_CAP4 = 1'h0;
  124. localparam [0:0] AM_ALC_SW = 1'h0;
  125. localparam [0:0] SW_CAP3 = 1'h0;
  126. localparam [0:0] SW_CAP2 = 1'h0;
  127. localparam [0:0] SW_CAP1 = 1'h0;
  128. localparam [0:0] AM_ALC_1_FIX = 1'h0;
  129. localparam [0:0] PLL_VTUNE_CTRL = 1'h0;
  130. localparam [0:0] PLL_SYNC_CTRL = 1'h0;
  131. localparam [0:0] PLL_SYNC = 1'h0;
  132. localparam [0:0] PLL_LOOP_CTRL = 1'h0;
  133. localparam [0:0] DDS_X2_FPGA = 1'h0;
  134. localparam [0:0] DDS_SAW2_FPGA = 1'h0;
  135. localparam [0:0] REF_OFFSET_CTRL_FPGA = 1'h0;
  136. localparam [0:0] GPIO_ADRF_V1 = 1'h0;
  137. localparam [0:0] GPIO_ADRF_V2 = 1'h0;
  138. localparam [0:0] DDS_SAW1_FPGA = 1'h0;
  139. localparam [23:0] GPIO_REG = {DDS_SAW1_FPGA,GPIO_ADRF_V2,GPIO_ADRF_V1,REF_OFFSET_CTRL_FPGA,DDS_SAW2_FPGA,DDS_X2_FPGA,PLL_LOOP_CTRL,PLL_SYNC,PLL_SYNC_CTRL,PLL_VTUNE_CTRL,AM_ALC_1_FIX,SW_CAP1,SW_CAP2,SW_CAP3,AM_ALC_SW,SW_CAP4,DDS_SYNC_FPGA,DDS_RESET_FPGA,DDS_SYNC_CTRL_FPGA,CTRL_AM_SW3,RF_SW2,RF_SW1};
  140. //***********************************************
  141. // localparam [23:0] AllDevQSPIHeader = {1'h1, LMXWordNum, DDSWordNum, POTWordNum, DACWordNum,ATTWordNum, ShRegWordNum,MaxWordNum, GPIOWordNum, 7'h1};
  142. localparam [23:0] AllDevQSPIHeader = {1'h1, 1'h0,LMXWordNum,GPIOWordNum, 1'h0, DDSWordNum,1'h0,MaxWordNum,1'h0,ShRegWordNum,1'h0,POTWordNum,DACWordNum,ATTWordNum,1'h1};
  143. //***********************************************
  144. // ASSIGNS
  145. //***********************************************
  146. assign Val_o = (modeSel) ? valQ : valR;
  147. assign Sck_o = (modeSel) ? SckQ : SckR;
  148. assign Ss_o = (modeSel) ? SsQ : SsR;
  149. assign Mosi0_o = (modeSel) ? mosi0Q : mosi0R;
  150. assign Mosi1_io = (anyFlag) ? 1'bz : Mosi1_o;
  151. assign MisoLdLmx_i = 1'b1;
  152. assign emptyFlagTx = (trCnt > 61) ? 1'b1 : 1'b0;
  153. assign QSPITotalWordNum = LMXWordNum + DDSWordNum + POTWordNum + DACWordNum + ATTWordNum + ShRegWordNum + MaxWordNum + GPIOWordNum;
  154. assign currClk = (modeSel) ? Clk60 : Clk10;
  155. //***********************************************
  156. // CLOCK GENERATION
  157. //***********************************************
  158. always #(CLK_PERIOD/2) Clk_i = ~Clk_i;
  159. always #(10/2) Clk100 = ~Clk100;
  160. always #(5/2) Clk200 = ~Clk200;
  161. always #(8/2) Clk125 = ~Clk125;
  162. always #(16.67/2) Clk60 = ~Clk60;
  163. always #(20/2) Clk50 = ~Clk50;
  164. always #(12.5/2) Clk80 = ~Clk80;
  165. always #(41.67/2) Clk24 = ~Clk24;
  166. always #(50/2) Clk20 = ~Clk20;
  167. always #(50) Clk10 = ~Clk10;
  168. //***********************************************
  169. // INITIALIZATION
  170. //***********************************************
  171. initial begin
  172. // Initialize Inputs
  173. Clk_i = 1;
  174. Clk100= 1;
  175. Clk200 = 1;
  176. Clk125 = 1;
  177. Clk60 = 1;
  178. Clk20 = 1;
  179. Clk50 = 1;
  180. Clk80 = 1;
  181. Clk24 = 1;
  182. rstForFPGA = 0;
  183. Clk10 = 1;
  184. pkt = new();
  185. Rst_i = 1;
  186. Start_i = 0;
  187. CPHA_i = 0; SpiDataVal_i = 0;
  188. SELST_i = 1;//0:High, 1:Low
  189. // WidthSel_i = 2; // 3-32bit, 2-24bit, 1-16bit, 0-8bit
  190. LAG_i = 0;
  191. LEAD_i = 0;
  192. EndianSel_i = 0; // 0:MSB first, 1:lsb first
  193. PulsePol_i = 0;
  194. // Reset the system
  195. #(CLK_PERIOD*10) Rst_i = 0;
  196. #(700000-60) rstForFPGA = 1;
  197. #(CLK_PERIOD*74) rstForFPGA = 0;
  198. #(165000) Start_i = 1; // Start SPI transaction
  199. wait (trCnt == 45) begin
  200. Start_i = 0;
  201. end
  202. #(CLK_PERIOD*100)
  203. Start_i = 1; // Start SPI transaction
  204. wait (trCnt == 70) begin
  205. Start_i = 0;
  206. end
  207. #(CLK_PERIOD*1000)
  208. Start_i = 1; // Start SPI transaction
  209. end
  210. //***********************************************
  211. always_ff @(posedge currClk) begin
  212. if (Rst_i) begin
  213. trCnt <= 0;
  214. end
  215. else begin
  216. if (Val_o) begin
  217. trCnt <= trCnt + 1;
  218. end
  219. end
  220. end
  221. always_comb begin
  222. if (Rst_i) begin
  223. mosi1Reg = 0;
  224. end
  225. else begin
  226. mosi1Reg = Mosi1_io;
  227. end
  228. end
  229. genvar i;
  230. always_comb begin
  231. if (Rst_i) begin
  232. WidthSel_i = 2'd0;
  233. end
  234. else begin
  235. if (trCnt == 1 || trCnt == 3 ) begin
  236. WidthSel_i = 2'd0;
  237. end
  238. else if (trCnt > 36 && trCnt < 43) begin
  239. WidthSel_i = 2'd3;
  240. end
  241. else begin
  242. WidthSel_i = 2'd2;
  243. end
  244. end
  245. end
  246. always_comb begin
  247. if (Rst_i) begin
  248. modeSel = 0;
  249. end
  250. else begin
  251. if (trCnt == 45) begin
  252. modeSel = 1;
  253. end
  254. end
  255. end
  256. always_comb begin
  257. if (Rst_i) begin
  258. Stop_i = 6'd0;
  259. end
  260. else begin
  261. if (trCnt == 158) begin
  262. Stop_i = 6'h0;
  263. end
  264. else begin
  265. Stop_i = 6'd0;
  266. end
  267. end
  268. end
  269. always_ff @(posedge currClk) begin
  270. if (Rst_i) begin
  271. randData<=0;
  272. randData32 <= 0;
  273. end
  274. else begin
  275. randData <= pkt.randomize(data);
  276. randData32 <= pkt.randomize(data32);
  277. end
  278. end
  279. always_comb begin
  280. if (Rst_i) begin
  281. SPIdata = 0;
  282. end
  283. else begin
  284. // if (!rstInit && locked) begin
  285. if (trCnt == 0) begin
  286. SPIdata = InitGpio1Header;
  287. end
  288. else if (trCnt == 2) begin
  289. SPIdata = InitGpio1Header;
  290. end
  291. else if (trCnt == 4) begin
  292. SPIdata = TempSensHeader;
  293. end
  294. else if (trCnt == 6) begin
  295. SPIdata = InitLMX2594Header;
  296. end
  297. // else if (trCnt > 0 && trCnt < 114) begin
  298. // SPIdata = pkt.data;
  299. // end
  300. else if (trCnt == 20) begin
  301. SPIdata = InitDDSHeader;
  302. end
  303. else if (trCnt == 28) begin
  304. SPIdata = InitPotHeader;
  305. end
  306. else if (trCnt == 30) begin
  307. SPIdata = InitDacHeader;
  308. end
  309. else if (trCnt == 32) begin
  310. SPIdata = InitAttHeader;
  311. end
  312. else if (trCnt == 34) begin
  313. SPIdata = InitShRegHeader;
  314. end
  315. else if (trCnt == 36) begin
  316. SPIdata = InitMAX2870Header;
  317. end
  318. else if (trCnt > 36 && trCnt < 43) begin
  319. SPIdata = 32'haaaaaaaa;
  320. end
  321. else if (trCnt == 43) begin
  322. SPIdata = InitGpio2Header;
  323. end
  324. else if (trCnt == 45) begin
  325. SPIdata = AllDevQSPIHeader;
  326. end
  327. else if (trCnt == 46) begin
  328. SPIdata = 7'h55;
  329. end
  330. else if (trCnt == 72) begin
  331. SPIdata = AllDevQSPIHeader;
  332. end
  333. else begin
  334. SPIdata = 24'haaaaaa;
  335. end
  336. end
  337. end
  338. // end
  339. //***********************************************
  340. // DUT INSTANTIATION
  341. //***********************************************
  342. GSR GSR(.GSRI(1'b1));
  343. ExtSpiMEmul ExtSpiMEmul_inst (
  344. .Clk_i(currClk),
  345. .Rst_i(Rst_i || modeSel),
  346. .Start_i(Start_i),
  347. .ClockPhase_i(CPHA_i),
  348. .EmptyFlag_i(emptyFlagTx),
  349. .SpiData_i(SPIdata),
  350. .SelSt_i(SELST_i),
  351. .WidthSel_i(WidthSel_i),
  352. .Lag_i(LAG_i),
  353. .Lead_i(LEAD_i),
  354. .EndianSel_i(EndianSel_i),
  355. .Stop_i(6'h0),
  356. .PulsePol_i(PulsePol_i),
  357. .Mosi0_o(mosi0R),
  358. .Sck_o(SckR),
  359. .Ss_o(SsR),
  360. .Val_o(valR)
  361. );
  362. ExtQspiMEmul ExtQspiMEmul_inst (
  363. .Clk_i(currClk),
  364. .Rst_i(Rst_i || !modeSel),
  365. .Start_i(Start_i),
  366. .ClockPhase_i(CPHA_i),
  367. .EmptyFlag_i(emptyFlagTx),
  368. .SpiData_i(SPIdata),
  369. .SelSt_i(SELST_i),
  370. .WidthSel_i(WidthSel_i),
  371. .Lag_i(LAG_i),
  372. .Lead_i(LEAD_i),
  373. .EndianSel_i(EndianSel_i),
  374. .Stop_i(6'h0),
  375. .PulsePol_i(PulsePol_i),
  376. .Mosi0_o(mosi0Q),
  377. .Mosi1_o(Mosi1_o),
  378. .Mosi2_o(Mosi2_o),
  379. .Mosi3_o(Mosi3_o),
  380. .Sck_o(SckQ),
  381. .Ss_o(SsQ),
  382. .Val_o(valQ)
  383. );
  384. ExtI2cSlaveEmul ExtI2cSlaveEmul_inst (
  385. .scl (i2cScl),
  386. .sda (i2cSda)
  387. );
  388. pullup p2(i2cSda); // pullup sda line
  389. TopSbTmsg TopSbTmsg_inst (
  390. .Clk_i(Clk24),
  391. .Rst_i(rstForFPGA),
  392. .Sck_i(Sck_o),
  393. .Ss_i(Ss_o),
  394. .MisoLdLmx_i(1'b1),
  395. .MisoLdMax2870_i(1'b1),
  396. .I2cScl_o(i2cScl),
  397. .I2cSda_io(i2cSda),
  398. .AnyFlag_o(anyFlag),
  399. .Mosi0_i(Mosi0_o),
  400. .Mosi1_io(Mosi1_io),
  401. .Mosi2_i(Mosi2_o),
  402. .Mosi3_i(Mosi3_o)
  403. );
  404. endmodule