Skip to content

Commit e644ce3

Browse files
committed
Add start packet strobe timing outputs to MAC modules
1 parent a743f6f commit e644ce3

26 files changed

+207
-15
lines changed

rtl/axis_gmii_rx.v

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ module axis_gmii_rx
5858
/*
5959
* Status
6060
*/
61+
output wire start_packet,
6162
output wire error_bad_frame,
6263
output wire error_bad_fcs
6364
);
@@ -103,6 +104,7 @@ reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next;
103104
reg m_axis_tlast_reg = 1'b0, m_axis_tlast_next;
104105
reg m_axis_tuser_reg = 1'b0, m_axis_tuser_next;
105106

107+
reg start_packet_reg = 1'b0, start_packet_next;
106108
reg error_bad_frame_reg = 1'b0, error_bad_frame_next;
107109
reg error_bad_fcs_reg = 1'b0, error_bad_fcs_next;
108110

@@ -114,6 +116,7 @@ assign m_axis_tvalid = m_axis_tvalid_reg;
114116
assign m_axis_tlast = m_axis_tlast_reg;
115117
assign m_axis_tuser = m_axis_tuser_reg;
116118

119+
assign start_packet = start_packet_reg;
117120
assign error_bad_frame = error_bad_frame_reg;
118121
assign error_bad_fcs = error_bad_fcs_reg;
119122

@@ -144,6 +147,7 @@ always @* begin
144147
m_axis_tlast_next = 1'b0;
145148
m_axis_tuser_next = 1'b0;
146149

150+
start_packet_next = 1'b0;
147151
error_bad_frame_next = 1'b0;
148152
error_bad_fcs_next = 1'b0;
149153

@@ -160,6 +164,7 @@ always @* begin
160164
reset_crc = 1'b1;
161165

162166
if (gmii_rx_dv_d4 && !gmii_rx_er_d4 && gmii_rxd_d4 == ETH_SFD) begin
167+
start_packet_next = 1'b1;
163168
state_next = STATE_PAYLOAD;
164169
end else begin
165170
state_next = STATE_IDLE;
@@ -218,6 +223,7 @@ always @(posedge clk) begin
218223

219224
m_axis_tvalid_reg <= 1'b0;
220225

226+
start_packet_reg <= 1'b0;
221227
error_bad_frame_reg <= 1'b0;
222228
error_bad_fcs_reg <= 1'b0;
223229

@@ -236,6 +242,7 @@ always @(posedge clk) begin
236242

237243
m_axis_tvalid_reg <= m_axis_tvalid_next;
238244

245+
start_packet_reg <= start_packet_next;
239246
error_bad_frame_reg <= error_bad_frame_next;
240247
error_bad_fcs_reg <= error_bad_fcs_next;
241248

rtl/axis_gmii_tx.v

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ module axis_gmii_tx #
6363
/*
6464
* Configuration
6565
*/
66-
input wire [7:0] ifg_delay
66+
input wire [7:0] ifg_delay,
67+
68+
/*
69+
* Status
70+
*/
71+
output wire start_packet
6772
);
6873

6974
localparam [7:0]
@@ -99,6 +104,8 @@ reg gmii_tx_er_reg = 1'b0, gmii_tx_er_next;
99104

100105
reg s_axis_tready_reg = 1'b0, s_axis_tready_next;
101106

107+
reg start_packet_reg = 1'b0, start_packet_next;
108+
102109
reg [31:0] crc_state = 32'hFFFFFFFF;
103110
wire [31:0] crc_next;
104111

@@ -108,6 +115,8 @@ assign gmii_txd = gmii_txd_reg;
108115
assign gmii_tx_en = gmii_tx_en_reg;
109116
assign gmii_tx_er = gmii_tx_er_reg;
110117

118+
assign start_packet = start_packet_reg;
119+
111120
lfsr #(
112121
.LFSR_WIDTH(32),
113122
.LFSR_POLY(32'h4c11db7),
@@ -143,6 +152,8 @@ always @* begin
143152
gmii_tx_en_next = 1'b0;
144153
gmii_tx_er_next = 1'b0;
145154

155+
start_packet_next = 1'b0;
156+
146157
if (!clk_enable) begin
147158
// clock disabled - hold state and outputs
148159
gmii_txd_next = gmii_txd_reg;
@@ -195,6 +206,7 @@ always @* begin
195206
s_tdata_next = s_axis_tdata;
196207
end
197208
gmii_txd_next = ETH_SFD;
209+
start_packet_next = 1'b1;
198210
state_next = STATE_PAYLOAD;
199211
end else begin
200212
state_next = STATE_PREAMBLE;
@@ -351,6 +363,8 @@ always @(posedge clk) begin
351363
gmii_tx_en_reg <= 1'b0;
352364
gmii_tx_er_reg <= 1'b0;
353365

366+
start_packet_reg <= 1'b0;
367+
354368
crc_state <= 32'hFFFFFFFF;
355369
end else begin
356370
state_reg <= state_next;
@@ -362,6 +376,8 @@ always @(posedge clk) begin
362376
gmii_tx_en_reg <= gmii_tx_en_next;
363377
gmii_tx_er_reg <= gmii_tx_er_next;
364378

379+
start_packet_reg <= start_packet_next;
380+
365381
// datapath
366382
if (reset_crc) begin
367383
crc_state <= 32'hFFFFFFFF;

rtl/axis_xgmii_rx_32.v

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ module axis_xgmii_rx_32
5252
/*
5353
* Status
5454
*/
55+
output wire start_packet,
5556
output wire error_bad_frame,
5657
output wire error_bad_fcs
5758
);
@@ -94,6 +95,7 @@ reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next;
9495
reg m_axis_tlast_reg = 1'b0, m_axis_tlast_next;
9596
reg m_axis_tuser_reg = 1'b0, m_axis_tuser_next;
9697

98+
reg start_packet_reg = 1'b0, start_packet_next;
9799
reg error_bad_frame_reg = 1'b0, error_bad_frame_next;
98100
reg error_bad_fcs_reg = 1'b0, error_bad_fcs_next;
99101

@@ -120,6 +122,7 @@ assign m_axis_tvalid = m_axis_tvalid_reg;
120122
assign m_axis_tlast = m_axis_tlast_reg;
121123
assign m_axis_tuser = m_axis_tuser_reg;
122124

125+
assign start_packet = start_packet_reg;
123126
assign error_bad_frame = error_bad_frame_reg;
124127
assign error_bad_fcs = error_bad_fcs_reg;
125128

@@ -260,6 +263,7 @@ always @* begin
260263
m_axis_tlast_next = 1'b0;
261264
m_axis_tuser_next = 1'b0;
262265

266+
start_packet_next = 1'b0;
263267
error_bad_frame_next = 1'b0;
264268
error_bad_fcs_next = 1'b0;
265269

@@ -291,6 +295,7 @@ always @* begin
291295
STATE_PREAMBLE: begin
292296
// drop preamble
293297
update_crc = 1'b1;
298+
start_packet_next = 1'b1;
294299
state_next = STATE_PAYLOAD;
295300
end
296301
STATE_PAYLOAD: begin
@@ -364,6 +369,7 @@ always @(posedge clk) begin
364369

365370
m_axis_tvalid_reg <= 1'b0;
366371

372+
start_packet_reg <= 1'b0;
367373
error_bad_frame_reg <= 1'b0;
368374
error_bad_fcs_reg <= 1'b0;
369375

@@ -380,6 +386,7 @@ always @(posedge clk) begin
380386

381387
m_axis_tvalid_reg <= m_axis_tvalid_next;
382388

389+
start_packet_reg <= start_packet_next;
383390
error_bad_frame_reg <= error_bad_frame_next;
384391
error_bad_fcs_reg <= error_bad_fcs_next;
385392

rtl/axis_xgmii_rx_64.v

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ module axis_xgmii_rx_64
5252
/*
5353
* Status
5454
*/
55+
output wire start_packet_0,
56+
output wire start_packet_4,
5557
output wire error_bad_frame,
5658
output wire error_bad_fcs
5759
);
@@ -96,6 +98,8 @@ reg m_axis_tvalid_reg = 1'b0, m_axis_tvalid_next;
9698
reg m_axis_tlast_reg = 1'b0, m_axis_tlast_next;
9799
reg m_axis_tuser_reg = 1'b0, m_axis_tuser_next;
98100

101+
reg start_packet_0_reg = 1'b0;
102+
reg start_packet_4_reg = 1'b0;
99103
reg error_bad_frame_reg = 1'b0, error_bad_frame_next;
100104
reg error_bad_fcs_reg = 1'b0, error_bad_fcs_next;
101105

@@ -122,6 +126,8 @@ assign m_axis_tvalid = m_axis_tvalid_reg;
122126
assign m_axis_tlast = m_axis_tlast_reg;
123127
assign m_axis_tuser = m_axis_tuser_reg;
124128

129+
assign start_packet_0 = start_packet_0_reg;
130+
assign start_packet_4 = start_packet_4_reg;
125131
assign error_bad_frame = error_bad_frame_reg;
126132
assign error_bad_fcs = error_bad_fcs_reg;
127133

@@ -419,6 +425,8 @@ always @(posedge clk) begin
419425

420426
m_axis_tvalid_reg <= 1'b0;
421427

428+
start_packet_0_reg <= 1'b0;
429+
start_packet_4_reg <= 1'b0;
422430
error_bad_frame_reg <= 1'b0;
423431
error_bad_fcs_reg <= 1'b0;
424432

@@ -435,14 +443,18 @@ always @(posedge clk) begin
435443

436444
m_axis_tvalid_reg <= m_axis_tvalid_next;
437445

446+
start_packet_0_reg <= 1'b0;
447+
start_packet_4_reg <= 1'b0;
438448
error_bad_frame_reg <= error_bad_frame_next;
439449
error_bad_fcs_reg <= error_bad_fcs_next;
440450

441451
if (xgmii_rxc[0] && xgmii_rxd[7:0] == XGMII_START) begin
442452
lanes_swapped <= 1'b0;
453+
start_packet_0_reg <= 1'b1;
443454
xgmii_rxc_d0 <= xgmii_rxc;
444455
end else if (xgmii_rxc[4] && xgmii_rxd[39:32] == XGMII_START) begin
445456
lanes_swapped <= 1'b1;
457+
start_packet_4_reg <= 1'b1;
446458
xgmii_rxc_d0 <= {xgmii_rxc[3:0], swap_rxc};
447459
end else if (lanes_swapped) begin
448460
xgmii_rxc_d0 <= {xgmii_rxc[3:0], swap_rxc};

rtl/axis_xgmii_tx_32.v

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,12 @@ module axis_xgmii_tx_32 #
5858
/*
5959
* Configuration
6060
*/
61-
input wire [7:0] ifg_delay
61+
input wire [7:0] ifg_delay,
62+
63+
/*
64+
* Status
65+
*/
66+
output wire start_packet
6267
);
6368

6469
localparam MIN_FL_NOCRC = MIN_FRAME_LENGTH-4;
@@ -123,11 +128,15 @@ wire [31:0] crc_next3;
123128
reg [31:0] xgmii_txd_reg = {4{XGMII_IDLE}}, xgmii_txd_next;
124129
reg [3:0] xgmii_txc_reg = 4'b1111, xgmii_txc_next;
125130

131+
reg start_packet_reg = 1'b0, start_packet_next;
132+
126133
assign s_axis_tready = s_axis_tready_reg;
127134

128135
assign xgmii_txd = xgmii_txd_reg;
129136
assign xgmii_txc = xgmii_txc_reg;
130137

138+
assign start_packet = start_packet_reg;
139+
131140
lfsr #(
132141
.LFSR_WIDTH(32),
133142
.LFSR_POLY(32'h4c11db7),
@@ -278,6 +287,8 @@ always @* begin
278287
xgmii_txd_next = {4{XGMII_IDLE}};
279288
xgmii_txc_next = 4'b1111;
280289

290+
start_packet_next = 1'b0;
291+
281292
case (state_reg)
282293
STATE_IDLE: begin
283294
// idle state - wait for data
@@ -312,6 +323,7 @@ always @* begin
312323
xgmii_txd_next = {ETH_SFD, {3{ETH_PRE}}};
313324
xgmii_txc_next = 4'b0000;
314325
s_axis_tready_next = 1'b1;
326+
start_packet_next = 1'b1;
315327
state_next = STATE_PAYLOAD;
316328
end
317329
STATE_PAYLOAD: begin
@@ -519,6 +531,8 @@ always @(posedge clk) begin
519531
xgmii_txd_reg <= {4{XGMII_IDLE}};
520532
xgmii_txc_reg <= 4'b1111;
521533

534+
start_packet_reg <= 1'b0;
535+
522536
crc_state <= 32'hFFFFFFFF;
523537
end else begin
524538
state_reg <= state_next;
@@ -533,6 +547,8 @@ always @(posedge clk) begin
533547
xgmii_txd_reg <= xgmii_txd_next;
534548
xgmii_txc_reg <= xgmii_txc_next;
535549

550+
start_packet_reg <= start_packet_next;
551+
536552
// datapath
537553
if (reset_crc) begin
538554
crc_state <= 32'hFFFFFFFF;

rtl/axis_xgmii_tx_64.v

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,13 @@ module axis_xgmii_tx_64 #
5858
/*
5959
* Configuration
6060
*/
61-
input wire [7:0] ifg_delay
61+
input wire [7:0] ifg_delay,
62+
63+
/*
64+
* Status
65+
*/
66+
output wire start_packet_0,
67+
output wire start_packet_4
6268
);
6369

6470
localparam MIN_FL_NOCRC = MIN_FRAME_LENGTH-4;
@@ -132,11 +138,17 @@ wire [31:0] crc_next7;
132138
reg [63:0] xgmii_txd_reg = {8{XGMII_IDLE}}, xgmii_txd_next;
133139
reg [7:0] xgmii_txc_reg = 8'b11111111, xgmii_txc_next;
134140

141+
reg start_packet_0_reg = 1'b0, start_packet_0_next;
142+
reg start_packet_4_reg = 1'b0, start_packet_4_next;
143+
135144
assign s_axis_tready = s_axis_tready_reg;
136145

137146
assign xgmii_txd = xgmii_txd_reg;
138147
assign xgmii_txc = xgmii_txc_reg;
139148

149+
assign start_packet_0 = start_packet_0_reg;
150+
assign start_packet_4 = start_packet_4_reg;
151+
140152
lfsr #(
141153
.LFSR_WIDTH(32),
142154
.LFSR_POLY(32'h4c11db7),
@@ -390,6 +402,9 @@ always @* begin
390402
xgmii_txd_next = {8{XGMII_IDLE}};
391403
xgmii_txc_next = 8'b11111111;
392404

405+
start_packet_0_next = 1'b0;
406+
start_packet_4_next = 1'b0;
407+
393408
case (state_reg)
394409
STATE_IDLE: begin
395410
// idle state - wait for data
@@ -409,9 +424,11 @@ always @* begin
409424
if (ifg_count_reg > 8'd0) begin
410425
// need to send more idles - swap lanes
411426
swap_lanes = 1'b1;
427+
start_packet_4_next = 1'b1;
412428
end else begin
413429
// no more idles - unswap
414430
unswap_lanes = 1'b1;
431+
start_packet_0_next = 1'b1;
415432
end
416433
xgmii_txd_next = {ETH_SFD, {6{ETH_PRE}}, XGMII_START};
417434
xgmii_txc_next = 8'b00000001;
@@ -635,6 +652,9 @@ always @(posedge clk) begin
635652
xgmii_txd_reg <= {8{XGMII_IDLE}};
636653
xgmii_txc_reg <= 8'b11111111;
637654

655+
start_packet_0_reg <= 1'b0;
656+
start_packet_4_reg <= 1'b0;
657+
638658
crc_state <= 32'hFFFFFFFF;
639659

640660
lanes_swapped <= 1'b0;
@@ -648,6 +668,9 @@ always @(posedge clk) begin
648668

649669
s_axis_tready_reg <= s_axis_tready_next;
650670

671+
start_packet_0_reg <= start_packet_0_next;
672+
start_packet_4_reg <= start_packet_4_next;
673+
651674
if (swap_lanes || (lanes_swapped && !unswap_lanes)) begin
652675
lanes_swapped <= 1'b1;
653676
xgmii_txd_reg <= {xgmii_txd_next[31:0], swap_txd};

0 commit comments

Comments
 (0)