Skip to content

Commit 945f22f

Browse files
committed
Add output pipeline to PTP clock module
1 parent 108c02d commit 945f22f

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

rtl/ptp_clock.v

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ module ptp_clock #
4242
parameter DRIFT_ENABLE = 1,
4343
parameter DRIFT_NS = 4'h0,
4444
parameter DRIFT_FNS = 16'h0002,
45-
parameter DRIFT_RATE = 16'h0005
45+
parameter DRIFT_RATE = 16'h0005,
46+
parameter PIPELINE_OUTPUT = 0
4647
)
4748
(
4849
input wire clk,
@@ -131,15 +132,78 @@ reg pps_reg = 0;
131132

132133
assign input_adj_active = adj_active_reg;
133134

134-
assign output_ts_96[95:48] = ts_96_s_reg;
135-
assign output_ts_96[47:46] = 2'b00;
136-
assign output_ts_96[45:16] = ts_96_ns_reg;
137-
assign output_ts_96[15:0] = FNS_WIDTH > 16 ? ts_96_fns_reg >> (FNS_WIDTH-16) : ts_96_fns_reg << (16-FNS_WIDTH);
138-
assign output_ts_64[63:16] = ts_64_ns_reg;
139-
assign output_ts_64[15:0] = FNS_WIDTH > 16 ? ts_64_fns_reg >> (FNS_WIDTH-16) : ts_64_fns_reg << (16-FNS_WIDTH);
140-
assign output_ts_step = ts_step_reg;
135+
generate
136+
137+
if (PIPELINE_OUTPUT > 0) begin
138+
139+
// pipeline
140+
(* shreg_extract = "no" *)
141+
reg [95:0] output_ts_96_reg[0:PIPELINE_OUTPUT-1];
142+
(* shreg_extract = "no" *)
143+
reg [63:0] output_ts_64_reg[0:PIPELINE_OUTPUT-1];
144+
(* shreg_extract = "no" *)
145+
reg output_ts_step_reg[0:PIPELINE_OUTPUT-1];
146+
(* shreg_extract = "no" *)
147+
reg output_pps_reg[0:PIPELINE_OUTPUT-1];
148+
149+
assign output_ts_96 = output_ts_96_reg[PIPELINE_OUTPUT-1];
150+
assign output_ts_64 = output_ts_64_reg[PIPELINE_OUTPUT-1];
151+
assign output_ts_step = output_ts_step_reg[PIPELINE_OUTPUT-1];
152+
assign output_pps = output_pps_reg[PIPELINE_OUTPUT-1];
153+
154+
integer i;
155+
156+
initial begin
157+
for (i = 0; i < PIPELINE_OUTPUT; i = i + 1) begin
158+
output_ts_96_reg[i] = 96'd0;
159+
output_ts_64_reg[i] = 64'd0;
160+
output_ts_step_reg[i] = 1'b0;
161+
output_pps_reg[i] = 1'b0;
162+
end
163+
end
164+
165+
always @(posedge clk) begin
166+
output_ts_96_reg[0][95:48] <= ts_96_s_reg;
167+
output_ts_96_reg[0][47:46] <= 2'b00;
168+
output_ts_96_reg[0][45:16] <= ts_96_ns_reg;
169+
output_ts_96_reg[0][15:0] <= {ts_96_fns_reg, 16'd0} >> FNS_WIDTH;
170+
output_ts_64_reg[0][63:16] <= ts_64_ns_reg;
171+
output_ts_64_reg[0][15:0] <= {ts_64_fns_reg, 16'd0} >> FNS_WIDTH;
172+
output_ts_step_reg[0] <= ts_step_reg;
173+
output_pps_reg[0] <= pps_reg;
174+
175+
for (i = 0; i < PIPELINE_OUTPUT-1; i = i + 1) begin
176+
output_ts_96_reg[i+1] <= output_ts_96_reg[i];
177+
output_ts_64_reg[i+1] <= output_ts_64_reg[i];
178+
output_ts_step_reg[i+1] <= output_ts_step_reg[i];
179+
output_pps_reg[i+1] <= output_pps_reg[i];
180+
end
181+
182+
if (rst) begin
183+
for (i = 0; i < PIPELINE_OUTPUT; i = i + 1) begin
184+
output_ts_96_reg[i] = 96'd0;
185+
output_ts_64_reg[i] = 64'd0;
186+
output_ts_step_reg[i] = 1'b0;
187+
output_pps_reg[i] = 1'b0;
188+
end
189+
end
190+
end
191+
192+
end else begin
193+
194+
assign output_ts_96[95:48] = ts_96_s_reg;
195+
assign output_ts_96[47:46] = 2'b00;
196+
assign output_ts_96[45:16] = ts_96_ns_reg;
197+
assign output_ts_96[15:0] = {ts_96_fns_reg, 16'd0} >> FNS_WIDTH;
198+
assign output_ts_64[63:16] = ts_64_ns_reg;
199+
assign output_ts_64[15:0] = {ts_64_fns_reg, 16'd0} >> FNS_WIDTH;
200+
assign output_ts_step = ts_step_reg;
201+
202+
assign output_pps = pps_reg;
203+
204+
end
141205

142-
assign output_pps = pps_reg;
206+
endgenerate
143207

144208
always @(posedge clk) begin
145209
ts_step_reg <= 0;

tb/ptp_clock/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export PARAM_DRIFT_ENABLE ?= 1
4242
export PARAM_DRIFT_NS ?= 0
4343
export PARAM_DRIFT_FNS ?= 2
4444
export PARAM_DRIFT_RATE ?= 5
45+
export PARAM_PIPELINE_OUTPUT ?= 0
4546

4647
ifeq ($(SIM), icarus)
4748
PLUSARGS += -fst
@@ -56,6 +57,7 @@ ifeq ($(SIM), icarus)
5657
COMPILE_ARGS += -P $(TOPLEVEL).DRIFT_NS=$(PARAM_DRIFT_NS)
5758
COMPILE_ARGS += -P $(TOPLEVEL).DRIFT_FNS=$(PARAM_DRIFT_FNS)
5859
COMPILE_ARGS += -P $(TOPLEVEL).DRIFT_RATE=$(PARAM_DRIFT_RATE)
60+
COMPILE_ARGS += -P $(TOPLEVEL).PIPELINE_OUTPUT=$(PARAM_PIPELINE_OUTPUT)
5961

6062
ifeq ($(WAVES), 1)
6163
VERILOG_SOURCES += iverilog_dump.v
@@ -74,6 +76,7 @@ else ifeq ($(SIM), verilator)
7476
COMPILE_ARGS += -GDRIFT_NS=$(PARAM_DRIFT_NS)
7577
COMPILE_ARGS += -GDRIFT_FNS=$(PARAM_DRIFT_FNS)
7678
COMPILE_ARGS += -GDRIFT_RATE=$(PARAM_DRIFT_RATE)
79+
COMPILE_ARGS += -GPIPELINE_OUTPUT=$(PARAM_PIPELINE_OUTPUT)
7780

7881
ifeq ($(WAVES), 1)
7982
COMPILE_ARGS += --trace-fst

tb/ptp_clock/test_ptp_clock.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ def test_ptp_clock(request):
367367
parameters['DRIFT_NS'] = 0x0
368368
parameters['DRIFT_FNS'] = 0x0002
369369
parameters['DRIFT_RATE'] = 0x0005
370+
parameters['PIPELINE_OUTPUT'] = 0
370371

371372
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
372373

0 commit comments

Comments
 (0)