You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
5.0 KiB

2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
  1. // Created by IP Generator (Version 2021.1-SP7 build 86875)
  2. //////////////////////////////////////////////////////////////////////////////
  3. //
  4. // Copyright (c) 2019 PANGO MICROSYSTEMS, INC
  5. // ALL RIGHTS REVERVED.
  6. //
  7. // THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC.
  8. // IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY
  9. // PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER.
  10. //
  11. //////////////////////////////////////////////////////////////////////////////
  12. //
  13. // Library:
  14. // Filename:SPLL.v
  15. //////////////////////////////////////////////////////////////////////////////
  16. `timescale 1 ns/1 ps
  17. module SPLL_tb ();
  18. localparam CLKIN_FREQ = 50.0;
  19. localparam integer FBDIV_SEL = 0;
  20. localparam FBMODE = "FALSE";
  21. // Generate testbench reset and clock
  22. reg pll_rst;
  23. reg rstodiv;
  24. reg pll_pwd;
  25. reg clkin1;
  26. reg clkin2;
  27. reg clkin_dsel;
  28. reg clkin_dsel_en;
  29. reg pfden;
  30. reg clkout0_gate;
  31. reg clkout0_2pad_gate;
  32. reg clkout1_gate;
  33. reg clkout2_gate;
  34. reg clkout3_gate;
  35. reg clkout4_gate;
  36. reg clkout5_gate;
  37. reg [9:0] dyn_idiv;
  38. reg [9:0] dyn_odiv0;
  39. reg [9:0] dyn_odiv1;
  40. reg [9:0] dyn_odiv2;
  41. reg [9:0] dyn_odiv3;
  42. reg [9:0] dyn_odiv4;
  43. reg [9:0] dyn_fdiv;
  44. reg [9:0] dyn_duty0;
  45. reg [9:0] dyn_duty1;
  46. reg [9:0] dyn_duty2;
  47. reg [9:0] dyn_duty3;
  48. reg [9:0] dyn_duty4;
  49. reg [12:0] dyn_phase0;
  50. reg [12:0] dyn_phase1;
  51. reg [12:0] dyn_phase2;
  52. reg [12:0] dyn_phase3;
  53. reg [12:0] dyn_phase4;
  54. reg err_chk;
  55. reg [2:0] results_cnt;
  56. reg rst_n;
  57. reg clk_tb;
  58. wire clkout0;
  59. wire clkout1;
  60. wire clkout2;
  61. wire clkout3;
  62. wire clkout4;
  63. wire clkfb = (FBMODE == "FALSE") ? clkin1 :
  64. (FBDIV_SEL == 0 ) ? clkout0 :
  65. (FBDIV_SEL == 1 ) ? clkout1 :
  66. (FBDIV_SEL == 2 ) ? clkout2 :
  67. (FBDIV_SEL == 3 ) ? clkout3 :
  68. (FBDIV_SEL == 4 ) ? clkout4 : clkin1;
  69. initial
  70. begin
  71. rst_n = 0;
  72. #20
  73. rst_n = 1;
  74. end
  75. initial
  76. begin
  77. clk_tb = 0;
  78. forever #1 clk_tb = ~clk_tb;
  79. end
  80. parameter CLOCK_PERIOD1 = (500.0/CLKIN_FREQ);
  81. //parameter CLOCK_PERIOD2 = (500.0/CLKIN_FREQ);
  82. initial
  83. begin
  84. clkin1 = 0;
  85. forever #(CLOCK_PERIOD1) clkin1 = ~clkin1;
  86. end
  87. initial
  88. begin
  89. pll_pwd = 0;
  90. pll_rst = 0;
  91. rstodiv = 0;
  92. clkin_dsel = 0;
  93. clkin_dsel_en = 0;
  94. pfden = 0;
  95. clkout0_gate = 0;
  96. clkout0_2pad_gate = 0;
  97. clkout1_gate = 0;
  98. clkout2_gate = 0;
  99. clkout3_gate = 0;
  100. clkout4_gate = 0;
  101. clkout5_gate = 0;
  102. dyn_idiv = 10'd2;
  103. dyn_fdiv = 10'd32;
  104. dyn_odiv0 = 10'd100;
  105. dyn_odiv1 = 10'd100;
  106. dyn_odiv2 = 10'd100;
  107. dyn_odiv3 = 10'd100;
  108. dyn_odiv4 = 10'd100;
  109. dyn_duty0 = 10'd100;
  110. dyn_duty1 = 10'd100;
  111. dyn_duty2 = 10'd100;
  112. dyn_duty3 = 10'd100;
  113. dyn_duty4 = 10'd100;
  114. dyn_phase0 = 13'd16;
  115. dyn_phase1 = 13'd16;
  116. dyn_phase2 = 13'd16;
  117. dyn_phase3 = 13'd16;
  118. dyn_phase4 = 13'd16;
  119. #10
  120. pll_pwd = 1;
  121. #20
  122. pll_pwd = 0;
  123. pll_rst = 0;
  124. #10
  125. pll_rst = 1;
  126. #20
  127. pll_rst = 0;
  128. #1000000
  129. dyn_odiv0 = 10'd200;
  130. dyn_odiv1 = 10'd200;
  131. dyn_odiv2 = 10'd200;
  132. dyn_odiv3 = 10'd200;
  133. dyn_odiv4 = 10'd200;
  134. dyn_duty0 = 10'd200;
  135. dyn_duty1 = 10'd200;
  136. dyn_duty2 = 10'd200;
  137. dyn_duty3 = 10'd200;
  138. dyn_duty4 = 10'd200;
  139. #3000000
  140. $finish;
  141. end
  142. initial
  143. begin
  144. $display("Simulation Starts.") ;
  145. $display("Simulation is done.") ;
  146. if (|results_cnt)
  147. $display("Simulation Failed due to Error Found.") ;
  148. else
  149. $display("Simulation Success.") ;
  150. end
  151. GTP_GRS GRS_INST(
  152. .GRS_N(1'b1)
  153. );
  154. SPLL U_SPLL (
  155. .clkout0(clkout0),
  156. .clkout1(clkout1),
  157. .clkout2(clkout2),
  158. .clkout3(clkout3),
  159. .clkin1(clkin1),
  160. .pll_lock(pll_lock)
  161. );
  162. //******************Results Cheching************************
  163. reg [2:0] pll_lock_shift;
  164. wire pll_lock_pulse = ~pll_lock_shift[2] & pll_lock_shift[1];
  165. always @( posedge clk_tb or negedge rst_n )
  166. begin
  167. if (!rst_n)
  168. begin
  169. pll_lock_shift <= 3'd0;
  170. end
  171. else
  172. begin
  173. pll_lock_shift[0] <= pll_lock;
  174. pll_lock_shift[2:1] <= pll_lock_shift[1:0];
  175. end
  176. end
  177. reg [1:0] pll_lock_pulse_cnt;
  178. always @( posedge clk_tb or negedge rst_n )
  179. begin
  180. if (!rst_n)
  181. begin
  182. pll_lock_pulse_cnt <= 2'd0;
  183. end
  184. else
  185. begin
  186. if (pll_lock_pulse)
  187. pll_lock_pulse_cnt <= pll_lock_pulse_cnt + 1;
  188. else ;
  189. end
  190. end
  191. always @( posedge clk_tb or negedge rst_n )
  192. begin
  193. if (!rst_n)
  194. begin
  195. err_chk <= 1'b0;
  196. end
  197. else
  198. begin
  199. if ((!pll_lock) && (^pll_lock_pulse_cnt))
  200. err_chk <= 1'b1;
  201. else if (pll_lock_pulse_cnt[1])
  202. err_chk <= 1'b1;
  203. else
  204. err_chk <= 1'b0;
  205. end
  206. end
  207. always @(posedge clk_tb or negedge rst_n)
  208. begin
  209. if (!rst_n)
  210. results_cnt <= 3'b000 ;
  211. else if (&results_cnt)
  212. results_cnt <= 3'b100 ;
  213. else if (err_chk)
  214. results_cnt <= results_cnt + 3'd1 ;
  215. end
  216. integer result_fid;
  217. initial begin
  218. result_fid = $fopen ("sim_results.log","a");
  219. $fmonitor(result_fid,"err_chk=%b", err_chk);
  220. end
  221. endmodule