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.

252 lines
4.9 KiB

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:inclkpll.v
  15. //////////////////////////////////////////////////////////////////////////////
  16. `timescale 1 ns/1 ps
  17. module inclkpll_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. inclkpll U_inclkpll (
  155. .clkout0(clkout0),
  156. .clkin1(clkin1),
  157. .pll_lock(pll_lock)
  158. );
  159. //******************Results Cheching************************
  160. reg [2:0] pll_lock_shift;
  161. wire pll_lock_pulse = ~pll_lock_shift[2] & pll_lock_shift[1];
  162. always @( posedge clk_tb or negedge rst_n )
  163. begin
  164. if (!rst_n)
  165. begin
  166. pll_lock_shift <= 3'd0;
  167. end
  168. else
  169. begin
  170. pll_lock_shift[0] <= pll_lock;
  171. pll_lock_shift[2:1] <= pll_lock_shift[1:0];
  172. end
  173. end
  174. reg [1:0] pll_lock_pulse_cnt;
  175. always @( posedge clk_tb or negedge rst_n )
  176. begin
  177. if (!rst_n)
  178. begin
  179. pll_lock_pulse_cnt <= 2'd0;
  180. end
  181. else
  182. begin
  183. if (pll_lock_pulse)
  184. pll_lock_pulse_cnt <= pll_lock_pulse_cnt + 1;
  185. else ;
  186. end
  187. end
  188. always @( posedge clk_tb or negedge rst_n )
  189. begin
  190. if (!rst_n)
  191. begin
  192. err_chk <= 1'b0;
  193. end
  194. else
  195. begin
  196. if ((!pll_lock) && (^pll_lock_pulse_cnt))
  197. err_chk <= 1'b1;
  198. else if (pll_lock_pulse_cnt[1])
  199. err_chk <= 1'b1;
  200. else
  201. err_chk <= 1'b0;
  202. end
  203. end
  204. always @(posedge clk_tb or negedge rst_n)
  205. begin
  206. if (!rst_n)
  207. results_cnt <= 3'b000 ;
  208. else if (&results_cnt)
  209. results_cnt <= 3'b100 ;
  210. else if (err_chk)
  211. results_cnt <= results_cnt + 3'd1 ;
  212. end
  213. integer result_fid;
  214. initial begin
  215. result_fid = $fopen ("sim_results.log","a");
  216. $fmonitor(result_fid,"err_chk=%b", err_chk);
  217. end
  218. endmodule