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.
 
 

254 lines
5.0 KiB

// Created by IP Generator (Version 2021.1-SP7 build 86875)
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2019 PANGO MICROSYSTEMS, INC
// ALL RIGHTS REVERVED.
//
// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC.
// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY
// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER.
//
//////////////////////////////////////////////////////////////////////////////
//
// Library:
// Filename:SPLL.v
//////////////////////////////////////////////////////////////////////////////
`timescale 1 ns/1 ps
module SPLL_tb ();
localparam CLKIN_FREQ = 50.0;
localparam integer FBDIV_SEL = 0;
localparam FBMODE = "FALSE";
// Generate testbench reset and clock
reg pll_rst;
reg rstodiv;
reg pll_pwd;
reg clkin1;
reg clkin2;
reg clkin_dsel;
reg clkin_dsel_en;
reg pfden;
reg clkout0_gate;
reg clkout0_2pad_gate;
reg clkout1_gate;
reg clkout2_gate;
reg clkout3_gate;
reg clkout4_gate;
reg clkout5_gate;
reg [9:0] dyn_idiv;
reg [9:0] dyn_odiv0;
reg [9:0] dyn_odiv1;
reg [9:0] dyn_odiv2;
reg [9:0] dyn_odiv3;
reg [9:0] dyn_odiv4;
reg [9:0] dyn_fdiv;
reg [9:0] dyn_duty0;
reg [9:0] dyn_duty1;
reg [9:0] dyn_duty2;
reg [9:0] dyn_duty3;
reg [9:0] dyn_duty4;
reg [12:0] dyn_phase0;
reg [12:0] dyn_phase1;
reg [12:0] dyn_phase2;
reg [12:0] dyn_phase3;
reg [12:0] dyn_phase4;
reg err_chk;
reg [2:0] results_cnt;
reg rst_n;
reg clk_tb;
wire clkout0;
wire clkout1;
wire clkout2;
wire clkout3;
wire clkout4;
wire clkfb = (FBMODE == "FALSE") ? clkin1 :
(FBDIV_SEL == 0 ) ? clkout0 :
(FBDIV_SEL == 1 ) ? clkout1 :
(FBDIV_SEL == 2 ) ? clkout2 :
(FBDIV_SEL == 3 ) ? clkout3 :
(FBDIV_SEL == 4 ) ? clkout4 : clkin1;
initial
begin
rst_n = 0;
#20
rst_n = 1;
end
initial
begin
clk_tb = 0;
forever #1 clk_tb = ~clk_tb;
end
parameter CLOCK_PERIOD1 = (500.0/CLKIN_FREQ);
//parameter CLOCK_PERIOD2 = (500.0/CLKIN_FREQ);
initial
begin
clkin1 = 0;
forever #(CLOCK_PERIOD1) clkin1 = ~clkin1;
end
initial
begin
pll_pwd = 0;
pll_rst = 0;
rstodiv = 0;
clkin_dsel = 0;
clkin_dsel_en = 0;
pfden = 0;
clkout0_gate = 0;
clkout0_2pad_gate = 0;
clkout1_gate = 0;
clkout2_gate = 0;
clkout3_gate = 0;
clkout4_gate = 0;
clkout5_gate = 0;
dyn_idiv = 10'd2;
dyn_fdiv = 10'd32;
dyn_odiv0 = 10'd100;
dyn_odiv1 = 10'd100;
dyn_odiv2 = 10'd100;
dyn_odiv3 = 10'd100;
dyn_odiv4 = 10'd100;
dyn_duty0 = 10'd100;
dyn_duty1 = 10'd100;
dyn_duty2 = 10'd100;
dyn_duty3 = 10'd100;
dyn_duty4 = 10'd100;
dyn_phase0 = 13'd16;
dyn_phase1 = 13'd16;
dyn_phase2 = 13'd16;
dyn_phase3 = 13'd16;
dyn_phase4 = 13'd16;
#10
pll_pwd = 1;
#20
pll_pwd = 0;
pll_rst = 0;
#10
pll_rst = 1;
#20
pll_rst = 0;
#1000000
dyn_odiv0 = 10'd200;
dyn_odiv1 = 10'd200;
dyn_odiv2 = 10'd200;
dyn_odiv3 = 10'd200;
dyn_odiv4 = 10'd200;
dyn_duty0 = 10'd200;
dyn_duty1 = 10'd200;
dyn_duty2 = 10'd200;
dyn_duty3 = 10'd200;
dyn_duty4 = 10'd200;
#3000000
$finish;
end
initial
begin
$display("Simulation Starts.") ;
$display("Simulation is done.") ;
if (|results_cnt)
$display("Simulation Failed due to Error Found.") ;
else
$display("Simulation Success.") ;
end
GTP_GRS GRS_INST(
.GRS_N(1'b1)
);
SPLL U_SPLL (
.clkout0(clkout0),
.clkout1(clkout1),
.clkout2(clkout2),
.clkin1(clkin1),
.pll_lock(pll_lock)
);
//******************Results Cheching************************
reg [2:0] pll_lock_shift;
wire pll_lock_pulse = ~pll_lock_shift[2] & pll_lock_shift[1];
always @( posedge clk_tb or negedge rst_n )
begin
if (!rst_n)
begin
pll_lock_shift <= 3'd0;
end
else
begin
pll_lock_shift[0] <= pll_lock;
pll_lock_shift[2:1] <= pll_lock_shift[1:0];
end
end
reg [1:0] pll_lock_pulse_cnt;
always @( posedge clk_tb or negedge rst_n )
begin
if (!rst_n)
begin
pll_lock_pulse_cnt <= 2'd0;
end
else
begin
if (pll_lock_pulse)
pll_lock_pulse_cnt <= pll_lock_pulse_cnt + 1;
else ;
end
end
always @( posedge clk_tb or negedge rst_n )
begin
if (!rst_n)
begin
err_chk <= 1'b0;
end
else
begin
if ((!pll_lock) && (^pll_lock_pulse_cnt))
err_chk <= 1'b1;
else if (pll_lock_pulse_cnt[1])
err_chk <= 1'b1;
else
err_chk <= 1'b0;
end
end
always @(posedge clk_tb or negedge rst_n)
begin
if (!rst_n)
results_cnt <= 3'b000 ;
else if (&results_cnt)
results_cnt <= 3'b100 ;
else if (err_chk)
results_cnt <= results_cnt + 3'd1 ;
end
integer result_fid;
initial begin
result_fid = $fopen ("sim_results.log","a");
$fmonitor(result_fid,"err_chk=%b", err_chk);
end
endmodule