OpenCores
URL https://opencores.org/ocsvn/ha1588/ha1588/trunk

Subversion Repositories ha1588

[/] [ha1588/] [trunk/] [sim/] [rtc/] [rtc_timer_tb.v] - Blame information for rev 58

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 34 edn_walter
/*
2 38 edn_walter
 * rtc_timer_tb.v
3 34 edn_walter
 *
4 37 edn_walter
 * Copyright (c) 2012, BABY&HW. All rights reserved.
5 34 edn_walter
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA 02110-1301  USA
20
 */
21
 
22 3 ash_riple
`timescale 1ns/1ns
23
 
24
module rtc_timer_tb  ;
25 42 edn_walter
 
26
  parameter time_acc_modulo = 38'd256000000000/1000000;
27
 
28 3 ash_riple
  reg rst;
29
  reg clk;
30 38 edn_walter
  wire         adj_ld_done;
31 3 ash_riple
  wire [37:0]  time_reg_ns;
32
  wire [47:0]  time_reg_sec;
33
  reg period_ld;
34
  reg [39:0]  period_in;
35
  reg adj_ld;
36
  reg [31:0]  adj_ld_data;
37
  reg [39:0]  period_adj;
38
  reg time_ld;
39
  reg [37:0] time_reg_ns_in;
40
  reg [47:0] time_reg_sec_in;
41 15 edn_walter
  rtc
42 3 ash_riple
   DUT  (
43
      .rst (rst ) ,
44
      .clk (clk ) ,
45
      .time_ld (time_ld ) ,
46
      .time_reg_ns_in (time_reg_ns_in ) ,
47
      .time_reg_sec_in (time_reg_sec_in ) ,
48
      .time_reg_ns (time_reg_ns ) ,
49
      .time_reg_sec (time_reg_sec ) ,
50 58 edn_walter
      .time_one_pps ( ) ,
51 38 edn_walter
      .time_ptp_ns ( ) ,
52
      .time_ptp_sec ( ) ,
53 3 ash_riple
      .period_ld (period_ld ) ,
54
      .period_in (period_in ) ,
55
      .adj_ld (adj_ld ) ,
56
      .period_adj (period_adj ) ,
57 38 edn_walter
      .adj_ld_data (adj_ld_data ) ,
58
      .adj_ld_done ( ) );
59 42 edn_walter
  defparam DUT.time_acc_modulo = time_acc_modulo;
60 3 ash_riple
 
61
 
62
initial begin
63
        clk = 1'b0;
64
        forever #4  clk = !clk;
65
end
66
initial begin
67
        rst = 1'b0;
68
        @(posedge clk);
69
        rst = 1'b1;
70
        @(posedge clk);
71
        rst = 1'b0;
72
end
73
 
74
// main process
75
integer i;
76
initial begin
77
 
78
        /////////////////////////
79
        // reset default values
80
        /////////////////////////
81
 
82
        @(posedge rst);
83
        // frequency load
84
        period_ld        =  1'b0;
85
        period_in[39:32] =  8'h00;        // ns
86
        period_in[31: 0] = 32'h00000000;  // ns fraction
87
        // time load
88
        time_ld              =  1'b0;
89
        time_reg_ns_in[37:8] = 30'd0;          // ns
90
        time_reg_ns_in[ 7:0] =  8'h00;         // ns fraction
91
        time_reg_sec_in      = 48'd0;
92
        // time fine tune load
93
        adj_ld      =  1'b0;
94
        adj_ld_data = 32'd10;
95
        period_adj  = 40'h00_00000000;
96
        @(negedge rst);
97
 
98
        ////////////////////
99
        // time adjustment
100
        ////////////////////
101
 
102
        for (i=0; i<20; i=i+1) @(posedge clk);
103
        // load default period
104
        period_ld          =  1'b1;
105
        period_in[39:32]   =  8'h08;        // ns
106
        period_in[31: 0]   = 32'h00000000;  // ns fraction
107
        @(posedge clk);
108
        period_ld          =  1'b0;
109 42 edn_walter
 
110
        for (i=0; i<20; i=i+1) @(posedge clk);
111
        // load time ToD values
112
        time_ld              =  1'b1;
113
        time_reg_ns_in[37:8] = time_acc_modulo/256 - 30'd100;  // ns
114
        time_reg_ns_in[ 7:0] =  8'h00;         // ns fraction
115
        time_reg_sec_in      = 48'd10;
116
        @(posedge clk);
117
        time_ld              =  1'b0;
118 3 ash_riple
 
119
        for (i=0; i<20; i=i+1) @(posedge clk);
120
        // fine tune time difference by 0
121
        adj_ld            =  1'b1;
122 42 edn_walter
        adj_ld_data       = 32'd100;
123
        period_adj[39:32] =  8'h08;        // ns           // positive change
124 3 ash_riple
        period_adj[31: 0] = 32'h00000000;  // ns fraction
125
        @(posedge clk);
126
        adj_ld            =  1'b0;
127
 
128 42 edn_walter
        for (i=0; i<300; i=i+1) @(posedge clk);
129
 
130 3 ash_riple
        for (i=0; i<20; i=i+1) @(posedge clk);
131 42 edn_walter
        // fine tune time difference by 0
132
        adj_ld            =  1'b1;
133
        adj_ld_data       = 32'd100;
134 47 edn_walter
        period_adj[39:32] =  8'hfb;        // ns           // -5 negative change
135 42 edn_walter
        period_adj[31: 0] = 32'h00000000;  // ns fraction
136 3 ash_riple
        @(posedge clk);
137 42 edn_walter
        adj_ld            =  1'b0;
138 3 ash_riple
 
139 42 edn_walter
        for (i=0; i<300; i=i+1) @(posedge clk);
140 47 edn_walter
 
141
        for (i=0; i<20; i=i+1) @(posedge clk);
142
        // fine tune time difference by 0
143
        adj_ld            =  1'b1;
144
        adj_ld_data       = 32'd100;
145
        period_adj[39:32] =  8'hf0;        // ns           // -16 negative change
146
        period_adj[31: 0] = 32'h00000000;  // ns fraction
147
        @(posedge clk);
148
        adj_ld            =  1'b0;
149 42 edn_walter
 
150 47 edn_walter
        for (i=0; i<300; i=i+1) @(posedge clk);
151
 
152 3 ash_riple
        for (i=0; i<20; i=i+1) @(posedge clk);
153
        // fine tune frequency difference
154
        period_ld          =  1'b1;
155
        period_in[39:32]   =  8'h08;        // ns
156
        period_in[31: 0]   = 32'h10200000;  // ns fraction
157
        @(posedge clk);
158
        period_ld          =  1'b0;
159
 
160
        for (i=0; i<20; i=i+1) @(posedge clk);
161
        // fine tune time difference
162
        adj_ld            =  1'b1;
163
        adj_ld_data       = 32'd10;
164 42 edn_walter
        period_adj[39:32] =  8'h02;        // ns           // positive change
165 3 ash_riple
        period_adj[31: 0] = 32'h20800000;  // ns fraction
166
        @(posedge clk);
167
        adj_ld            =  1'b0;
168 42 edn_walter
 
169
        for (i=0; i<500; i=i+1) @(posedge clk);
170
        $stop;
171 3 ash_riple
end
172
 
173
// sec+ns watchpoint
174
wire [47:0] time_reg_sec_in_    = time_reg_sec_in[47:0];
175
wire [29:0] time_reg_ns_in_     = time_reg_ns_in[37:8];
176
wire [47:0] time_reg_sec_       = time_reg_sec[47:0];
177
wire [29:0] time_reg_ns_        = time_reg_ns[37:8];
178
wire [ 7:0] period_ns_          = period_in[39:32];
179
wire [ 7:0] period_adj_ns_      = period_adj[39:32];
180 19 edn_walter
wire        time_reg_sec_inc_   = DUT.time_acc_48s_inc;
181 3 ash_riple
// ns fraction watchpoint
182
wire [ 7:0] time_reg_ns_in_f     = time_reg_ns_in[7:0];
183
wire [ 7:0] time_reg_ns_f        = time_reg_ns[7:0];
184
wire [31:0] period_ns_f          = period_in[31:0];
185
wire [31:0] period_adj_ns_f      = period_adj[31:0];
186
 
187
// ns time incremental watchpoint
188
reg  [47:0] time_reg_sec__d1;
189
reg  [29:0] time_reg_ns__d1;
190
always @(posedge clk) begin
191
        time_reg_sec__d1 <= time_reg_sec_;
192
        time_reg_ns__d1  <= time_reg_ns_;
193
end
194 41 edn_walter
wire [29:0] time_reg_sec__delta = time_reg_sec_-time_reg_sec__d1;
195 3 ash_riple
wire [29:0] time_reg_ns__delta = (time_reg_sec__d1!=time_reg_sec_)?
196 38 edn_walter
                                (DUT.time_acc_modulo/256-(time_reg_ns__d1-time_reg_ns_)):
197 3 ash_riple
                                (time_reg_ns_-time_reg_ns__d1);
198 41 edn_walter
wire [37:0] time_acc_30n_08f_pre = DUT.time_acc_30n_08f_pre_pos - DUT.time_acc_30n_08f_pre_neg;
199 3 ash_riple
 
200
// Delta-Sigma circuit watchpoint
201
wire [23:0] time_adj_08n_32f_24f = rtc_timer_tb.DUT.time_adj_08n_32f[23:0];
202
 
203
endmodule
204
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.