apbDriver/generateClock.sv

59 lines
1.7 KiB
Systemverilog
Raw Permalink Normal View History

2022-09-15 17:28:16 +00:00
// V_erilator clock generation module, allows for the clock to be "stepped down" for use within the testbench
// SPDX-FileCopyrightText: © 2022 Aadi Desai <21363892+supleed2@users.noreply.github.com>
// SPDX-License-Identifier: Apache-2.0
`default_nettype none
module generateClock
( output var logic o_clk // Generated clock for testbench
, input var logic i_rootClk // V_erilator clock input
, input var logic [63:0] i_periodHi // Number of rootClk cycles-1 to stay high
, input var logic [63:0] i_periodLo // Number of rootClk cycles-1 to stay low
, input var logic [ 7:0] i_jitterControl // Random jitter control (0: none --> higher number: more jitter)
);
logic intClk_d;
logic intClk_q;
logic [63:0] downCounter_d;
logic [63:0] downCounter_q;
/* svlint off legacy_always */
always @(posedge i_rootClk)
intClk_q <= intClk_d;
always @(posedge i_rootClk)
downCounter_q <= downCounter_d;
/* svlint on legacy_always */
logic [7:0] rndJitter;
always_ff @(posedge i_rootClk)
/* verilator lint_off WIDTH */
rndJitter <= $random;
/* verilator lint_on WIDTH */
logic jitterThisCycle;
assign jitterThisCycle = (rndJitter < i_jitterControl);
always_comb
if (downCounter_q == '0)
if (jitterThisCycle)
downCounter_d = downCounter_q;
else if (intClk_q)
downCounter_d = i_periodLo;
else
downCounter_d = i_periodHi;
else
downCounter_d = downCounter_q - 'd1;
always_comb
if ((downCounter_q == '0) && !jitterThisCycle)
intClk_d = ~intClk_q;
else
intClk_d = intClk_q;
assign o_clk = intClk_q;
endmodule
`resetall