Skip to content

Commit 6d98d9d

Browse files
committed
Added configurable simulation clock gen
1 parent 49fefc9 commit 6d98d9d

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

sim_clk_gen.sv

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//------------------------------------------------------------------------------
2+
// sim_clk_gen.sv
3+
// published as part of https://github.com/pConst/basic_verilog
4+
// Konstantin Pavlov, pavlovconst@gmail.com
5+
//------------------------------------------------------------------------------
6+
7+
// INFO ------------------------------------------------------------------------
8+
// Testbench clock generator written in System Verilog
9+
//
10+
11+
`timescale 1ns / 1ps
12+
13+
module sim_clk_gen #( parameter
14+
FREQ = 200_000_000, // in Hz
15+
PHASE = 0, // in degrees
16+
DUTY = 50, // in percentage
17+
DISTORT = 200 // in picoseconds
18+
)(
19+
input ena,
20+
output logic clk, // ideal clock
21+
output logic clkd // distorted clock
22+
);
23+
24+
real clk_pd = 1.0 / FREQ * 1e9; // convert to ns
25+
real clk_on = DUTY / 100.0 * clk_pd;
26+
real clk_off = (100.0 - DUTY) / 100.0 * clk_pd;
27+
real start_dly = clk_pd / 4 * PHASE / 90;
28+
29+
logic do_clk;
30+
31+
initial begin
32+
$display("FREQ = %0d Hz", FREQ);
33+
$display("PHASE = %0d deg", PHASE);
34+
$display("DUTY = %0d %%", DUTY);
35+
$display("DISTORT = %0d ps", DISTORT);
36+
37+
$display("PERIOD = %0.3f ns", clk_pd);
38+
$display("CLK_ON = %0.3f ns", clk_on);
39+
$display("CLK_OFF = %0.3f ns", clk_off);
40+
$display("START_DLY = %0.3f ns", start_dly);
41+
end
42+
43+
initial begin
44+
clk <= 0;
45+
do_clk <= 1;
46+
end
47+
48+
always @ (posedge ena or negedge ena) begin
49+
if (ena) begin
50+
#(start_dly) do_clk = 1;
51+
end else begin
52+
#(start_dly) do_clk = 0;
53+
end
54+
end
55+
56+
always @(posedge do_clk) begin
57+
if( do_clk ) begin
58+
clk = 1;
59+
while ( do_clk ) begin
60+
#(clk_on) clk = 0;
61+
#(clk_off) clk = 1;
62+
end
63+
clk = 0;
64+
end
65+
end
66+
67+
always @(*) begin
68+
clkd = #($urandom_range(0, DISTORT)*1ps) clk;
69+
end
70+
71+
endmodule
72+

0 commit comments

Comments
 (0)