@@ -284,15 +284,17 @@ reg [PERIOD_NS_W+FNS_W-1:0] period_ns_reg = 0, period_ns_next = 0;
284284reg [9 + CMP_FNS_W- 1 :0 ] dst_ns_capt_reg = 0 ;
285285reg [9 + CMP_FNS_W- 1 :0 ] src_ns_sync_reg = 0 ;
286286
287+ reg [FNS_W- 1 :0 ] ts_fns_lsb_reg = 0 , ts_fns_lsb_next = 0 ;
287288reg [FNS_W- 1 :0 ] ts_fns_reg = 0 , ts_fns_next = 0 ;
288289
290+ reg [8 :0 ] ts_rel_ns_lsb_reg = 0 , ts_rel_ns_lsb_next = 0 ;
289291reg [TS_NS_W- 1 :0 ] ts_rel_ns_reg = 0 , ts_rel_ns_next = 0 ;
290- reg ts_tod_step_reg = 1'b0 , ts_tod_step_next ;
292+ reg ts_rel_step_reg = 1'b0 , ts_rel_step_next ;
291293
292294reg [TS_TOD_S_W- 1 :0 ] ts_tod_s_reg = 0 , ts_tod_s_next = 0 ;
293295reg [TS_TOD_NS_W- 1 :0 ] ts_tod_ns_reg = 0 , ts_tod_ns_next = 0 ;
294296reg [8 :0 ] ts_tod_offset_ns_reg = 0 , ts_tod_offset_ns_next = 0 ;
295- reg ts_rel_step_reg = 1'b0 , ts_rel_step_next ;
297+ reg ts_tod_step_reg = 1'b0 , ts_tod_step_next ;
296298
297299reg pps_reg = 1'b0 , pps_next;
298300reg pps_str_reg = 1'b0 , pps_str_next;
@@ -641,8 +643,10 @@ assign locked = ptp_locked_reg && freq_locked_reg && dst_sync_locked_reg;
641643always @* begin
642644 period_ns_next = period_ns_reg;
643645
646+ ts_fns_lsb_next = ts_fns_lsb_reg;
644647 ts_fns_next = ts_fns_reg;
645648
649+ ts_rel_ns_lsb_next = ts_rel_ns_lsb_reg;
646650 ts_rel_ns_next = ts_rel_ns_reg;
647651 ts_rel_step_next = 1'b0 ;
648652
@@ -738,13 +742,18 @@ always @* begin
738742
739743 // PTP clock
740744
741- // shared fractional ns
742- ts_fns_next = ts_fns_reg + period_ns_reg;
745+ // shared fractional ns and relative timestamp least significant bits
746+ {ts_rel_ns_lsb_next, ts_fns_lsb_next} = ({ts_rel_ns_lsb_reg, ts_fns_lsb_reg} + period_ns_reg);
747+ ts_fns_next = ts_fns_lsb_reg;
743748
744749 // relative timestamp
745- ts_rel_ns_next = ({ts_rel_ns_reg, ts_fns_reg} + period_ns_reg) >> FNS_W ;
750+ ts_rel_ns_next[ 8 : 0 ] = ts_rel_ns_lsb_reg ;
746751
747752 if (TS_REL_EN) begin
753+ if (! ts_rel_ns_next[8 ] && ts_rel_ns_reg[8 ]) begin
754+ ts_rel_ns_next[TS_REL_NS_W- 1 :9 ] = ts_rel_ns_reg[TS_REL_NS_W- 1 :9 ] + 1 ;
755+ end
756+
748757 if (dst_update_reg && ! dst_sync_reg && dst_rel_shadow_valid_reg && (dst_load_cnt_reg == 0 )) begin
749758 // check timestamp MSBs
750759 if (dst_rel_step_shadow_reg || ts_rel_load_ts_reg) begin
@@ -774,9 +783,9 @@ always @* begin
774783 end
775784 end
776785
786+ // absolute time-of-day timestamp
777787 if (TS_TOD_EN) begin
778- // absolute time-of-day timestamp
779- ts_tod_ns_next[8 :0 ] = ts_rel_ns_next[8 :0 ] + ts_tod_offset_ns_reg;
788+ ts_tod_ns_next[8 :0 ] = ts_rel_ns_lsb_reg + ts_tod_offset_ns_reg;
780789
781790 if (ts_tod_ns_reg[TS_TOD_NS_W- 1 ]) begin
782791 pps_str_next = 1'b0 ;
929938always @(posedge clk) begin
930939 period_ns_reg <= period_ns_next;
931940
941+ ts_fns_lsb_reg <= ts_fns_lsb_next;
932942 ts_fns_reg <= ts_fns_next;
933943
944+ ts_rel_ns_lsb_reg <= ts_rel_ns_lsb_next;
934945 ts_rel_ns_reg <= ts_rel_ns_next;
935946 ts_rel_step_reg <= ts_rel_step_next;
936947
@@ -975,7 +986,9 @@ always @(posedge clk) begin
975986
976987 if (rst) begin
977988 period_ns_reg <= 0 ;
989+ ts_fns_lsb_reg <= 0 ;
978990 ts_fns_reg <= 0 ;
991+ ts_rel_ns_lsb_reg <= 0 ;
979992 ts_rel_ns_reg <= 0 ;
980993 ts_rel_step_reg <= 1'b0 ;
981994 ts_tod_s_reg <= 0 ;
0 commit comments