1
0
mirror of https://github.com/corundum/corundum.git synced 2025-01-16 08:12:53 +08:00

MAC optimizations

This commit is contained in:
Alex Forencich 2018-10-19 15:24:33 -07:00
parent 14d8819cd3
commit 5e12f97518
2 changed files with 25 additions and 9 deletions

View File

@ -126,7 +126,7 @@ lfsr #(
.STYLE("AUTO") .STYLE("AUTO")
) )
eth_crc_8 ( eth_crc_8 (
.data_in(last_cycle ? xgmii_rxd_d1[39:32] : xgmii_rxd_d0[7:0]), .data_in(xgmii_rxd_d0[7:0]),
.state_in(last_cycle ? crc_state3 : crc_state), .state_in(last_cycle ? crc_state3 : crc_state),
.data_out(), .data_out(),
.state_out(crc_next0) .state_out(crc_next0)
@ -142,7 +142,7 @@ lfsr #(
.STYLE("AUTO") .STYLE("AUTO")
) )
eth_crc_16 ( eth_crc_16 (
.data_in(last_cycle ? xgmii_rxd_d1[47:32] : xgmii_rxd_d0[15:0]), .data_in(xgmii_rxd_d0[15:0]),
.state_in(last_cycle ? crc_state3 : crc_state), .state_in(last_cycle ? crc_state3 : crc_state),
.data_out(), .data_out(),
.state_out(crc_next1) .state_out(crc_next1)
@ -158,7 +158,7 @@ lfsr #(
.STYLE("AUTO") .STYLE("AUTO")
) )
eth_crc_24 ( eth_crc_24 (
.data_in(last_cycle ? xgmii_rxd_d1[55:32] : xgmii_rxd_d0[23:0]), .data_in(xgmii_rxd_d0[23:0]),
.state_in(last_cycle ? crc_state3 : crc_state), .state_in(last_cycle ? crc_state3 : crc_state),
.data_out(), .data_out(),
.state_out(crc_next2) .state_out(crc_next2)
@ -174,7 +174,7 @@ lfsr #(
.STYLE("AUTO") .STYLE("AUTO")
) )
eth_crc_32 ( eth_crc_32 (
.data_in(last_cycle ? xgmii_rxd_d1[63:32] : xgmii_rxd_d0[31:0]), .data_in(xgmii_rxd_d0[31:0]),
.state_in(last_cycle ? crc_state3 : crc_state), .state_in(last_cycle ? crc_state3 : crc_state),
.data_out(), .data_out(),
.state_out(crc_next3) .state_out(crc_next3)
@ -423,8 +423,8 @@ always @(posedge clk) begin
xgmii_rxc_d0 <= xgmii_rxc; xgmii_rxc_d0 <= xgmii_rxc;
end else if (xgmii_rxc[4] && xgmii_rxd[39:32] == 8'hfb) begin end else if (xgmii_rxc[4] && xgmii_rxd[39:32] == 8'hfb) begin
lanes_swapped <= 1'b1; lanes_swapped <= 1'b1;
xgmii_rxd_d0 <= 64'h0707070707070707; xgmii_rxd_d0 <= {xgmii_rxd[31:0], swap_rxd};
xgmii_rxc_d0 <= 8'b11111111; xgmii_rxc_d0 <= {xgmii_rxc[3:0], swap_rxc};
end else if (lanes_swapped) begin end else if (lanes_swapped) begin
xgmii_rxd_d0 <= {xgmii_rxd[31:0], swap_rxd}; xgmii_rxd_d0 <= {xgmii_rxd[31:0], swap_rxd};
xgmii_rxc_d0 <= {xgmii_rxc[3:0], swap_rxc}; xgmii_rxc_d0 <= {xgmii_rxc[3:0], swap_rxc};
@ -433,6 +433,11 @@ always @(posedge clk) begin
xgmii_rxc_d0 <= xgmii_rxc; xgmii_rxc_d0 <= xgmii_rxc;
end end
if (state_next == STATE_LAST) begin
xgmii_rxd_d0[31:0] <= xgmii_rxd_d0[63:32];
xgmii_rxc_d0[3:0] <= xgmii_rxc_d0[7:4];
end
xgmii_rxd_d1 <= xgmii_rxd_d0; xgmii_rxd_d1 <= xgmii_rxd_d0;
xgmii_rxc_d1 <= xgmii_rxc_d0; xgmii_rxc_d1 <= xgmii_rxc_d0;

View File

@ -99,6 +99,8 @@ reg [7:0] fcs_output_txc_1;
reg [7:0] ifg_offset; reg [7:0] ifg_offset;
reg extra_cycle;
reg [15:0] frame_ptr_reg = 16'd0, frame_ptr_next; reg [15:0] frame_ptr_reg = 16'd0, frame_ptr_next;
reg [7:0] ifg_count_reg = 8'd0, ifg_count_next; reg [7:0] ifg_count_reg = 8'd0, ifg_count_next;
@ -301,6 +303,7 @@ always @* begin
fcs_output_txc_0 = 8'b11100000; fcs_output_txc_0 = 8'b11100000;
fcs_output_txc_1 = 8'b11111111; fcs_output_txc_1 = 8'b11111111;
ifg_offset = 8'd3; ifg_offset = 8'd3;
extra_cycle = 1'b0;
end end
8'bzzzzz011: begin 8'bzzzzz011: begin
fcs_output_txd_0 = {16'h07fd, ~crc_next1[31:0], input_tdata_reg[15:0]}; fcs_output_txd_0 = {16'h07fd, ~crc_next1[31:0], input_tdata_reg[15:0]};
@ -308,6 +311,7 @@ always @* begin
fcs_output_txc_0 = 8'b11000000; fcs_output_txc_0 = 8'b11000000;
fcs_output_txc_1 = 8'b11111111; fcs_output_txc_1 = 8'b11111111;
ifg_offset = 8'd2; ifg_offset = 8'd2;
extra_cycle = 1'b0;
end end
8'bzzzz0111: begin 8'bzzzz0111: begin
fcs_output_txd_0 = {8'hfd, ~crc_next2[31:0], input_tdata_reg[23:0]}; fcs_output_txd_0 = {8'hfd, ~crc_next2[31:0], input_tdata_reg[23:0]};
@ -315,6 +319,7 @@ always @* begin
fcs_output_txc_0 = 8'b10000000; fcs_output_txc_0 = 8'b10000000;
fcs_output_txc_1 = 8'b11111111; fcs_output_txc_1 = 8'b11111111;
ifg_offset = 8'd1; ifg_offset = 8'd1;
extra_cycle = 1'b0;
end end
8'bzzz01111: begin 8'bzzz01111: begin
fcs_output_txd_0 = {~crc_next3[31:0], input_tdata_reg[31:0]}; fcs_output_txd_0 = {~crc_next3[31:0], input_tdata_reg[31:0]};
@ -322,6 +327,7 @@ always @* begin
fcs_output_txc_0 = 8'b00000000; fcs_output_txc_0 = 8'b00000000;
fcs_output_txc_1 = 8'b11111111; fcs_output_txc_1 = 8'b11111111;
ifg_offset = 8'd8; ifg_offset = 8'd8;
extra_cycle = 1'b1;
end end
8'bzz011111: begin 8'bzz011111: begin
fcs_output_txd_0 = {~crc_next4[23:0], input_tdata_reg[39:0]}; fcs_output_txd_0 = {~crc_next4[23:0], input_tdata_reg[39:0]};
@ -329,6 +335,7 @@ always @* begin
fcs_output_txc_0 = 8'b00000000; fcs_output_txc_0 = 8'b00000000;
fcs_output_txc_1 = 8'b11111110; fcs_output_txc_1 = 8'b11111110;
ifg_offset = 8'd7; ifg_offset = 8'd7;
extra_cycle = 1'b1;
end end
8'bz0111111: begin 8'bz0111111: begin
fcs_output_txd_0 = {~crc_next5[15:0], input_tdata_reg[47:0]}; fcs_output_txd_0 = {~crc_next5[15:0], input_tdata_reg[47:0]};
@ -336,6 +343,7 @@ always @* begin
fcs_output_txc_0 = 8'b00000000; fcs_output_txc_0 = 8'b00000000;
fcs_output_txc_1 = 8'b11111100; fcs_output_txc_1 = 8'b11111100;
ifg_offset = 8'd6; ifg_offset = 8'd6;
extra_cycle = 1'b1;
end end
8'b01111111: begin 8'b01111111: begin
fcs_output_txd_0 = {~crc_next6[7:0], input_tdata_reg[55:0]}; fcs_output_txd_0 = {~crc_next6[7:0], input_tdata_reg[55:0]};
@ -343,6 +351,7 @@ always @* begin
fcs_output_txc_0 = 8'b00000000; fcs_output_txc_0 = 8'b00000000;
fcs_output_txc_1 = 8'b11111000; fcs_output_txc_1 = 8'b11111000;
ifg_offset = 8'd5; ifg_offset = 8'd5;
extra_cycle = 1'b1;
end end
8'b11111111: begin 8'b11111111: begin
fcs_output_txd_0 = input_tdata_reg; fcs_output_txd_0 = input_tdata_reg;
@ -350,6 +359,7 @@ always @* begin
fcs_output_txc_0 = 8'b00000000; fcs_output_txc_0 = 8'b00000000;
fcs_output_txc_1 = 8'b11110000; fcs_output_txc_1 = 8'b11110000;
ifg_offset = 8'd4; ifg_offset = 8'd4;
extra_cycle = 1'b1;
end end
default: begin default: begin
fcs_output_txd_0 = 64'd0; fcs_output_txd_0 = 64'd0;
@ -357,6 +367,7 @@ always @* begin
fcs_output_txc_0 = 8'd0; fcs_output_txc_0 = 8'd0;
fcs_output_txc_1 = 8'd0; fcs_output_txc_1 = 8'd0;
ifg_offset = 8'd0; ifg_offset = 8'd0;
extra_cycle = 1'b1;
end end
endcase endcase
end end
@ -500,7 +511,7 @@ always @* begin
frame_ptr_next = 16'd0; frame_ptr_next = 16'd0;
ifg_count_next = (ifg_delay > 8'd12 ? ifg_delay : 8'd12) - ifg_offset + (lanes_swapped ? 8'd4 : 8'd0) + deficit_idle_count_reg; ifg_count_next = (ifg_delay > 8'd12 ? ifg_delay : 8'd12) - ifg_offset + (lanes_swapped ? 8'd4 : 8'd0) + deficit_idle_count_reg;
if (fcs_output_txc_1 != 8'hff || fcs_output_txc_0 == 8'd0) begin if (extra_cycle) begin
state_next = STATE_FCS_2; state_next = STATE_FCS_2;
end else begin end else begin
state_next = STATE_IFG; state_next = STATE_IFG;
@ -652,8 +663,8 @@ always @(posedge clk) begin
end else begin end else begin
if (swap_lanes) begin if (swap_lanes) begin
lanes_swapped <= 1'b1; lanes_swapped <= 1'b1;
xgmii_txd_reg <= {xgmii_txd_next[31:0], 32'h07070707}; xgmii_txd_reg <= {xgmii_txd_next[31:0], swap_txd};
xgmii_txc_reg <= {xgmii_txc_next[3:0], 4'b1111}; xgmii_txc_reg <= {xgmii_txc_next[3:0], swap_txc};
end else begin end else begin
xgmii_txd_reg <= xgmii_txd_next; xgmii_txd_reg <= xgmii_txd_next;
xgmii_txc_reg <= xgmii_txc_next; xgmii_txc_reg <= xgmii_txc_next;