Skip to content

Commit 65c4655

Browse files
committed
Updated tb template with clock gen module
1 parent 6d98d9d commit 65c4655

File tree

3 files changed

+97
-20
lines changed

3 files changed

+97
-20
lines changed

example_projects/testbench_template_tb/compile.tcl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
set library_file_list {
1818

1919
work {main_tb.sv
20-
main.sv
20+
sim_clk_gen.sv
2121
clk_divider.sv
2222
edge_detect.sv
2323
delay.sv}

example_projects/testbench_template_tb/main_tb.sv

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,30 @@
1515
module main_tb();
1616

1717
logic clk200;
18-
initial begin
19-
#0 clk200 = 1'b0;
20-
forever
21-
#2.5 clk200 = ~clk200;
22-
end
18+
sim_clk_gen #(
19+
.FREQ( 200_000_000 ), // in Hz
20+
.PHASE( 0 ), // in degrees
21+
.DUTY( 50 ), // in percentage
22+
.DISTORT( 10 ) // in picoseconds
23+
) clk200_gen (
24+
.ena( 1'b1 ),
25+
.clk( clk200 ),
26+
.clkd( )
27+
);
2328

2429
// external device "asynchronous" clock
25-
logic clk33a;
26-
initial begin
27-
#0 clk33a = 1'b0;
28-
forever
29-
#7 clk33a = ~clk33a;
30-
end
31-
3230
logic clk33;
33-
//assign clk33 = clk33a;
34-
always @(*) begin
35-
clk33 = #($urandom_range(0, 2000)*10ps) clk33a;
36-
end
31+
logic clk33d;
32+
sim_clk_gen #(
33+
.FREQ( 200_000_000 ), // in Hz
34+
.PHASE( 0 ), // in degrees
35+
.DUTY( 50 ), // in percentage
36+
.DISTORT( 1000 ) // in picoseconds
37+
) clk33_gen (
38+
.ena( 1'b1 ),
39+
.clk( clk33 ),
40+
.clkd( clk33d )
41+
);
3742

3843
logic rst;
3944
initial begin
@@ -138,13 +143,13 @@ module_under_test #(
138143
);
139144

140145
// emulating external divice ==================================================
141-
// that works asynchronously on clk33 clock
146+
// that works asynchronously on distorted clk33d clock
142147

143-
assign ADC1_SCLKOUT = clk33;
148+
assign ADC1_SCLKOUT = clk33d;
144149

145150
logic [15:0] test_data = 16'b1010_1100_1100_1111;
146151
logic [7:0] adc1_seq_cntr = 0;
147-
always_ff @(posedge clk33) begin
152+
always_ff @(posedge clk33d) begin
148153
if( adc1_seq_cntr[7:0]==0 && ~ADC1_nCONV ) begin
149154
ADC1_BUSY <= 1'b1;
150155
ADC1_SDOUT <= test_data[15];
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)