blob: 26810fb2f360f571f76414ac5fcd53f31ab7bfaf [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//############################################################################
//
// *Name: sys_osc
// *Module Description: System Clock Oscilator
//
//############################################################################
`timescale 1ns/1ps
module sys_osc #(
// synopsys translate_off
parameter time SYS_EN_RDLY = 10us,
parameter time SYS_EN_FDLY = 100ns,
parameter time SYS_JEN_RDLY = 80ns,
parameter time SYS_JEN_FDLY = 80ns
// synopsys translate_on
) (
input sys_en_i, // System Source Clock Enable
input sys_jen_i, // System Source Clock Jitter Enable
output logic sys_clk_o, // System Clock Output
output logic sys_clk_en_o // System Clock Enable Output
);
// synopsys translate_off
localparam real SYS_CLK_PERIOD = 10000; // 10000ps (100Mhz)
logic init_start, clk;
shortreal jitter;
initial begin
clk = 1'b0;
$display("\nSYS Clock Period: %0dps", SYS_CLK_PERIOD);
init_start = 1'b1; #1;
init_start = 1'b0;
end
wire #(SYS_JEN_RDLY, SYS_JEN_FDLY) sys_jen = sys_jen_i;
always begin
// 0-2000ps is upto +20% Jitter
jitter = sys_jen ? $urandom_range(2000, 0) : 0;
#((SYS_CLK_PERIOD+jitter)/2000) clk = ~clk;
end
assign sys_clk_o = clk;
always_ff @( init_start, posedge sys_en_i, negedge sys_en_i ) begin
if ( init_start )
sys_clk_en_o <= 1'b0;
else if ( !init_start && sys_en_i )
sys_clk_en_o <= #(SYS_EN_RDLY) sys_en_i;
else if ( !init_start && !sys_en_i )
sys_clk_en_o <= #(SYS_EN_FDLY) sys_en_i;
end
// synopsys translate_on
endmodule // of sys_osc