diff options
author | Martin Braun <martin.braun@ettus.com> | 2014-10-07 11:25:20 +0200 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2014-10-07 11:25:20 +0200 |
commit | fd3e84941de463fa1a7ebab0a69515b4bf2614cd (patch) | |
tree | 3fa721a13d41d2c0451d663a59a220a38fd5e614 /fpga/usrp3/lib/simple_gemac | |
parent | 3b66804e41891e358c790b453a7a59ec7462dba4 (diff) | |
download | uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.tar.gz uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.tar.bz2 uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.zip |
Removed copy of FPGA source files.
Diffstat (limited to 'fpga/usrp3/lib/simple_gemac')
23 files changed, 0 insertions, 2847 deletions
diff --git a/fpga/usrp3/lib/simple_gemac/.gitignore b/fpga/usrp3/lib/simple_gemac/.gitignore deleted file mode 100644 index 17f35e962..000000000 --- a/fpga/usrp3/lib/simple_gemac/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/a.out -/*.vcd -simple_gemac_wrapper_tb - diff --git a/fpga/usrp3/lib/simple_gemac/Makefile.srcs b/fpga/usrp3/lib/simple_gemac/Makefile.srcs deleted file mode 100644 index f1fe18a4a..000000000 --- a/fpga/usrp3/lib/simple_gemac/Makefile.srcs +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright 2010 Ettus Research LLC -# - -################################################## -# Simple GEMAC Sources -################################################## -SIMPLE_GEMAC_SRCS = $(abspath $(addprefix $(BASE_DIR)/../lib/simple_gemac/, \ -simple_gemac_wrapper.v \ -simple_gemac.v \ -simple_gemac_tx.v \ -simple_gemac_rx.v \ -crc.v \ -delay_line.v \ -flow_ctrl_tx.v \ -flow_ctrl_rx.v \ -address_filter.v \ -address_filter_promisc.v \ -ll8_to_txmac.v \ -rxmac_to_ll8.v \ -ll8_to_axi64.v \ -axi64_to_ll8.v \ -mdio.v \ -)) diff --git a/fpga/usrp3/lib/simple_gemac/address_filter.v b/fpga/usrp3/lib/simple_gemac/address_filter.v deleted file mode 100644 index ccae0ea20..000000000 --- a/fpga/usrp3/lib/simple_gemac/address_filter.v +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - - -module address_filter - (input clk, - input reset, - input go, - input [7:0] data, - input [47:0] address, - output match, - output done); - - reg [2:0] af_state; - - always @(posedge clk) - if(reset) - af_state <= 0; - else - if(go) - af_state <= (data == address[47:40]) ? 1 : 7; - else - case(af_state) - 1 : af_state <= (data == address[39:32]) ? 2 : 7; - 2 : af_state <= (data == address[31:24]) ? 3 : 7; - 3 : af_state <= (data == address[23:16]) ? 4 : 7; - 4 : af_state <= (data == address[15:8]) ? 5 : 7; - 5 : af_state <= (data == address[7:0]) ? 6 : 7; - 6, 7 : af_state <= 0; - endcase // case (af_state) - - assign match = (af_state==6); - assign done = (af_state==6)|(af_state==7); - -endmodule // address_filter - - diff --git a/fpga/usrp3/lib/simple_gemac/address_filter_promisc.v b/fpga/usrp3/lib/simple_gemac/address_filter_promisc.v deleted file mode 100644 index ec2364c92..000000000 --- a/fpga/usrp3/lib/simple_gemac/address_filter_promisc.v +++ /dev/null @@ -1,37 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - - -module address_filter_promisc - (input clk, - input reset, - input go, - input [7:0] data, - output match, - output done); - - reg [2:0] af_state; - - always @(posedge clk) - if(reset) - af_state <= 0; - else - if(go) - af_state <= 1;//(data[0] == 1'b0) ? 1 : 7; - else - case(af_state) - 1 : af_state <= 2; - 2 : af_state <= 3; - 3 : af_state <= 4; - 4 : af_state <= 5; - 5 : af_state <= 6; - 6, 7 : af_state <= 0; - endcase // case (af_state) - - assign match = (af_state==6); - assign done = (af_state==6)|(af_state==7); - -endmodule // address_filter_promisc diff --git a/fpga/usrp3/lib/simple_gemac/axi64_to_ll8.v b/fpga/usrp3/lib/simple_gemac/axi64_to_ll8.v deleted file mode 100644 index c82bc4fd0..000000000 --- a/fpga/usrp3/lib/simple_gemac/axi64_to_ll8.v +++ /dev/null @@ -1,49 +0,0 @@ - - -module axi64_to_ll8 - #(parameter START_BYTE=6) - (input clk, input reset, input clear, - input [63:0] axi64_tdata, input axi64_tlast, input [3:0] axi64_tuser, input axi64_tvalid, output axi64_tready, - output [7:0] ll_data, output ll_eof, output ll_src_rdy, input ll_dst_rdy); - - reg [7:0] data_int; - wire eof_int, valid_int, ready_int; - - reg [2:0] state = START_BYTE; - reg eof, done; - reg [3:0] occ; - - always @(posedge clk) - if(reset | clear) - state <= START_BYTE; - else - if(valid_int & ready_int) - if(eof_int) - state <= START_BYTE; - else - state <= state + 3'd1; - - assign valid_int = axi64_tvalid; - assign axi64_tready = ready_int & (eof_int | state == 7); - assign eof_int = axi64_tlast & (axi64_tuser[2:0] == (state + 3'd1)); - - always @* - case(state) - 0 : data_int <= axi64_tdata[63:56]; - 1 : data_int <= axi64_tdata[55:48]; - 2 : data_int <= axi64_tdata[47:40]; - 3 : data_int <= axi64_tdata[39:32]; - 4 : data_int <= axi64_tdata[31:24]; - 5 : data_int <= axi64_tdata[23:16]; - 6 : data_int <= axi64_tdata[15:8]; - 7 : data_int <= axi64_tdata[7:0]; - default : data_int <= axi64_tdata[7:0]; - endcase // case (state) - - axi_fifo_short #(.WIDTH(9)) ll8_fifo - (.clk(clk), .reset(reset), .clear(0), - .i_tdata({eof_int, data_int}), .i_tvalid(valid_int), .i_tready(ready_int), - .o_tdata({ll_eof, ll_data}), .o_tvalid(ll_src_rdy), .o_tready(ll_dst_rdy), - .space(), .occupied()); - -endmodule // axi64_to_ll8 diff --git a/fpga/usrp3/lib/simple_gemac/crc.v b/fpga/usrp3/lib/simple_gemac/crc.v deleted file mode 100644 index 3ce289f82..000000000 --- a/fpga/usrp3/lib/simple_gemac/crc.v +++ /dev/null @@ -1,71 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - -
-module crc
- (input clk,
- input reset,
- input clear,
- input [7:0] data,
- input calc,
- output [31:0] crc_out,
- output match);
-
- function[31:0] NextCRC;
- input[7:0] D;
- input[31:0] C;
- reg[31:0] NewCRC;
- begin
- NewCRC[0] = C[24]^C[30]^D[1]^D[7];
- NewCRC[1] = C[25]^C[31]^D[0]^D[6]^C[24]^C[30]^D[1]^D[7];
- NewCRC[2] = C[26]^D[5]^C[25]^C[31]^D[0]^D[6]^C[24]^C[30]^D[1]^D[7];
- NewCRC[3] = C[27]^D[4]^C[26]^D[5]^C[25]^C[31]^D[0]^D[6];
- NewCRC[4] = C[28]^D[3]^C[27]^D[4]^C[26]^D[5]^C[24]^C[30]^D[1]^D[7];
- NewCRC[5] = C[29]^D[2]^C[28]^D[3]^C[27]^D[4]^C[25]^C[31]^D[0]^D[6]^C[24]^C[30]^D[1]^D[7];
- NewCRC[6] = C[30]^D[1]^C[29]^D[2]^C[28]^D[3]^C[26]^D[5]^C[25]^C[31]^D[0]^D[6];
- NewCRC[7] = C[31]^D[0]^C[29]^D[2]^C[27]^D[4]^C[26]^D[5]^C[24]^D[7];
- NewCRC[8] = C[0]^C[28]^D[3]^C[27]^D[4]^C[25]^D[6]^C[24]^D[7];
- NewCRC[9] = C[1]^C[29]^D[2]^C[28]^D[3]^C[26]^D[5]^C[25]^D[6];
- NewCRC[10] = C[2]^C[29]^D[2]^C[27]^D[4]^C[26]^D[5]^C[24]^D[7];
- NewCRC[11] = C[3]^C[28]^D[3]^C[27]^D[4]^C[25]^D[6]^C[24]^D[7];
- NewCRC[12] = C[4]^C[29]^D[2]^C[28]^D[3]^C[26]^D[5]^C[25]^D[6]^C[24]^C[30]^D[1]^D[7];
- NewCRC[13] = C[5]^C[30]^D[1]^C[29]^D[2]^C[27]^D[4]^C[26]^D[5]^C[25]^C[31]^D[0]^D[6];
- NewCRC[14] = C[6]^C[31]^D[0]^C[30]^D[1]^C[28]^D[3]^C[27]^D[4]^C[26]^D[5];
- NewCRC[15] = C[7]^C[31]^D[0]^C[29]^D[2]^C[28]^D[3]^C[27]^D[4];
- NewCRC[16] = C[8]^C[29]^D[2]^C[28]^D[3]^C[24]^D[7];
- NewCRC[17] = C[9]^C[30]^D[1]^C[29]^D[2]^C[25]^D[6];
- NewCRC[18] = C[10]^C[31]^D[0]^C[30]^D[1]^C[26]^D[5];
- NewCRC[19] = C[11]^C[31]^D[0]^C[27]^D[4];
- NewCRC[20] = C[12]^C[28]^D[3];
- NewCRC[21] = C[13]^C[29]^D[2];
- NewCRC[22] = C[14]^C[24]^D[7];
- NewCRC[23] = C[15]^C[25]^D[6]^C[24]^C[30]^D[1]^D[7];
- NewCRC[24] = C[16]^C[26]^D[5]^C[25]^C[31]^D[0]^D[6];
- NewCRC[25] = C[17]^C[27]^D[4]^C[26]^D[5];
- NewCRC[26] = C[18]^C[28]^D[3]^C[27]^D[4]^C[24]^C[30]^D[1]^D[7];
- NewCRC[27] = C[19]^C[29]^D[2]^C[28]^D[3]^C[25]^C[31]^D[0]^D[6];
- NewCRC[28] = C[20]^C[30]^D[1]^C[29]^D[2]^C[26]^D[5];
- NewCRC[29] = C[21]^C[31]^D[0]^C[30]^D[1]^C[27]^D[4];
- NewCRC[30] = C[22]^C[31]^D[0]^C[28]^D[3];
- NewCRC[31] = C[23]^C[29]^D[2];
- NextCRC = NewCRC;
- end
- endfunction
-
- reg [31:0] crc_reg;
- always @ (posedge clk)
- if (reset | clear)
- crc_reg <= 32'hffffffff;
- else if (calc)
- crc_reg <= NextCRC(data,crc_reg);
-
- assign crc_out = ~{crc_reg[24],crc_reg[25],crc_reg[26],crc_reg[27],crc_reg[28],crc_reg[29],crc_reg[30],crc_reg[31],
- crc_reg[16],crc_reg[17],crc_reg[18],crc_reg[19],crc_reg[20],crc_reg[21],crc_reg[22],crc_reg[23],
- crc_reg[8],crc_reg[9],crc_reg[10],crc_reg[11],crc_reg[12],crc_reg[13],crc_reg[14],crc_reg[15],
- crc_reg[0],crc_reg[1],crc_reg[2],crc_reg[3],crc_reg[4],crc_reg[5],crc_reg[6],crc_reg[7] };
-
- assign match = (crc_reg == 32'hc704_dd7b);
-
-endmodule // crc
diff --git a/fpga/usrp3/lib/simple_gemac/delay_line.v b/fpga/usrp3/lib/simple_gemac/delay_line.v deleted file mode 100644 index 325182f38..000000000 --- a/fpga/usrp3/lib/simple_gemac/delay_line.v +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - - -module delay_line - #(parameter WIDTH=32) - (input clk, - input [3:0] delay, - input [WIDTH-1:0] din, - output [WIDTH-1:0] dout); - - genvar i; - generate - for (i=0;i<WIDTH;i=i+1) - begin : gen_delay - SRL16E - srl16e(.Q(dout[i]), - .A0(delay[0]),.A1(delay[1]),.A2(delay[2]),.A3(delay[3]), - .CE(1),.CLK(clk),.D(din[i])); - end - endgenerate - -endmodule // delay_line diff --git a/fpga/usrp3/lib/simple_gemac/eth_tasks.v b/fpga/usrp3/lib/simple_gemac/eth_tasks.v deleted file mode 100644 index e505948de..000000000 --- a/fpga/usrp3/lib/simple_gemac/eth_tasks.v +++ /dev/null @@ -1,161 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - - -task SendFlowCtrl; - input [15:0] fc_len; - begin - $display("Sending Flow Control, quanta = %d, time = %d", fc_len,$time); - pause_time <= fc_len; - @(posedge clk); - pause_req <= 1; - @(posedge clk); - pause_req <= 0; - $display("Sent Flow Control"); - end -endtask // SendFlowCtrl - -task SendPacket2MAC; - input tx_clk; - input [7:0] data_start; - input [31:0] data_len; - output [7:0] tx_data; - output tx_valid; - output tx_error; - input tx_ack; - reg [15:0] count; - begin - $display("Sending Packet Len=%d, %d", data_len, $time); - count <= 1; - tx_data <= data_start; - tx_error <= 0; - tx_valid <= 1; - while(~tx_ack) - @(posedge tx_clk); - $display("Packet Accepted, %d", $time); - while(count < data_len) - begin - tx_data <= tx_data + 1; - count <= count + 1; - @(posedge clk); - end - tx_valid <= 0; - @(posedge tx_clk); - end -endtask // SendPacket2MAC - -task SendPacket_to_ll8; - input [7:0] data_start; - input [15:0] data_len; -// output [7:0] tx_data; -// output tx_sof; -// output tx_eof; -// output tx_src_rdy; -// input tx_dst_rdy; - reg [15:0] count; - begin - $display("Sending Packet Len=%d, %d", data_len, $time); - count <= 2; - tx_ll_data2 <= data_start; - tx_ll_src_rdy2 <= 1; - tx_ll_sof2 <= 1; - tx_ll_eof2 <= 0; - #1; - while(count < data_len) - begin - while(~tx_ll_dst_rdy2) - @(posedge clk); - @(posedge clk); - tx_ll_data2 = tx_ll_data2 + 1; - count = count + 1; - tx_ll_sof2 <= 0; - end - tx_ll_eof2 <= 1; - while(~tx_ll_dst_rdy2) - @(posedge clk); - @(posedge clk); - tx_ll_src_rdy2 <= 0; - end -endtask // SendPacket_to_ll8 - - -task SendPacketFromFile; - input clk; - input [31:0] data_len; - output [7:0] tx_data; - output tx_valid; - output tx_error; - input tx_ack; - reg [15:0] count; - begin - $display("Sending Packet From File Len=%d, %d",data_len,$time); - $readmemh("test_packet.mem",pkt_rom ); - count = 0; - tx_data = pkt_rom[count]; - tx_error = 0; - tx_valid = 1; - while(~tx_ack) - @(posedge clk); - $display("Packet Accepted, %d",$time); - count = 1; - while(count < data_len) - begin - tx_data = pkt_rom[count]; - count = count + 1; - @(posedge clk); - end - tx_valid <= 0; - @(posedge clk); - end -endtask // SendPacketFromFile - -task Waiter; - input [31:0] wait_length; - begin - tx_ll_src_rdy2 <= 0; - repeat(wait_length) - @(posedge clk); - tx_ll_src_rdy2 <= 1; - end -endtask // Waiter - -task SendPacketFromFile_ll8; - input [31:0] data_len; - input [31:0] wait_length; - input [31:0] wait_time; - - integer count; - begin - $display("Sending Packet From File to LL8 Len=%d, %d",data_len,$time); - $readmemh("test_packet.mem",pkt_rom ); - - while(~tx_ll_dst_rdy2) - @(posedge clk); - tx_ll_data2 <= pkt_rom[0]; - tx_ll_src_rdy2 <= 1; - tx_ll_sof2 <= 1; - tx_ll_eof2 <= 0; - @(posedge clk); - - for(i=1;i<data_len-1;i=i+1) - begin - while(~tx_ll_dst_rdy2) - @(posedge clk); - tx_ll_data2 <= pkt_rom[i]; - tx_ll_sof2 <= 0; - @(posedge clk); - if(i==wait_time) - Waiter(wait_length); - end - - while(~tx_ll_dst_rdy2) - @(posedge clk); - tx_ll_eof2 <= 1; - tx_ll_data2 <= pkt_rom[data_len-1]; - @(posedge clk); - tx_ll_src_rdy2 <= 0; - end -endtask // SendPacketFromFile_ll8 diff --git a/fpga/usrp3/lib/simple_gemac/flow_ctrl_rx.v b/fpga/usrp3/lib/simple_gemac/flow_ctrl_rx.v deleted file mode 100644 index 048c26b62..000000000 --- a/fpga/usrp3/lib/simple_gemac/flow_ctrl_rx.v +++ /dev/null @@ -1,66 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - -
-// RX side of flow control -- when we are running out of RX space, send a PAUSE
-
-module flow_ctrl_rx
- (input pause_request_en, input [15:0] pause_time, input [15:0] pause_thresh,
- input rx_clk, input rx_reset, input [15:0] rx_fifo_space,
- input tx_clk, input tx_reset, output reg pause_req, output reg [15:0] pause_time_req
- );
-
- // ******************************************************************************
- // Force our TX to send a PAUSE frame because our RX is nearly full
- // ******************************************************************************
-
- // RX Clock Domain
- reg xon, xoff;
- reg [21:0] countdown;
-
- wire [15:0] pause_low_thresh = pause_thresh;
- wire [15:0] pause_hi_thresh = 16'hFFFF;
- wire [21:0] pq_reduced = {pause_time,6'd0} - 1700;
-
- always @(posedge rx_clk)
- if(rx_reset)
- xoff <= 0;
- else
- xoff <= (pause_request_en & (countdown==0) & (rx_fifo_space < pause_low_thresh));
-
- always @(posedge rx_clk)
- if(rx_reset)
- xon <= 0;
- else
- xon <= ((countdown!=0) & (rx_fifo_space > pause_hi_thresh));
-
- always @(posedge rx_clk)
- if(rx_reset)
- countdown <= 0;
- else if(xoff)
- countdown <= pq_reduced;
- else if(xon)
- countdown <= 0;
- else if(countdown != 0)
- countdown <= countdown - 1;
-
- // Cross clock domains
- wire xon_tx, xoff_tx;
- oneshot_2clk send_xon (.clk_in(rx_clk), .in(xon), .clk_out(tx_clk), .out(xon_tx));
- oneshot_2clk send_xoff (.clk_in(rx_clk), .in(xoff), .clk_out(tx_clk), .out(xoff_tx));
-
- always @(posedge tx_clk)
- if(xoff_tx)
- pause_time_req <= pause_time;
- else if(xon_tx)
- pause_time_req <= 0;
-
- always @(posedge tx_clk)
- if(tx_reset)
- pause_req <= 0;
- else
- pause_req <= xon_tx | xoff_tx;
-
-endmodule // flow_ctrl_rx
diff --git a/fpga/usrp3/lib/simple_gemac/flow_ctrl_tx.v b/fpga/usrp3/lib/simple_gemac/flow_ctrl_tx.v deleted file mode 100644 index 11c120b1c..000000000 --- a/fpga/usrp3/lib/simple_gemac/flow_ctrl_tx.v +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - -
-// TX side of flow control -- when other side sends PAUSE, we wait
-
-module flow_ctrl_tx
- (input rst,
- input tx_clk,
- //host processor
- input tx_pause_en,
- // From MAC_rx_ctrl
- input [15:0] pause_quanta,
- input pause_quanta_val,
- // MAC_tx_ctrl
- output pause_apply,
- input paused);
-
- // ******************************************************************************
- // Inhibit our TX from transmitting because they sent us a PAUSE frame
- // ******************************************************************************
-
- // Pauses are in units of 512 bit times, or 64 bytes/clock cycles, and can be
- // as big as 16 bits, so 22 bits are needed for the counter
-
- reg [15+6:0] pause_quanta_counter;
- reg pqval_d1, pqval_d2;
-
- always @(posedge tx_clk) pqval_d1 <= pause_quanta_val;
- always @(posedge tx_clk) pqval_d2 <= pqval_d1;
-
- always @ (posedge tx_clk or posedge rst)
- if (rst)
- pause_quanta_counter <= 0;
- else if (pqval_d1 & ~pqval_d2)
- pause_quanta_counter <= {pause_quanta, 6'b0};
- else if((pause_quanta_counter!=0) & paused)
- pause_quanta_counter <= pause_quanta_counter - 1;
-
- assign pause_apply = tx_pause_en & (pause_quanta_counter != 0);
-
-endmodule // flow_ctrl
diff --git a/fpga/usrp3/lib/simple_gemac/ll8_to_axi64.v b/fpga/usrp3/lib/simple_gemac/ll8_to_axi64.v deleted file mode 100644 index 778728eea..000000000 --- a/fpga/usrp3/lib/simple_gemac/ll8_to_axi64.v +++ /dev/null @@ -1,102 +0,0 @@ - -// Takes 8-bit wide data on a Local-link fifo interface and converts to 64-bit wide axi -// Parameter START_BYTE controls which byte of the 8 the first incoming byte goes into -// Use START_BYTE=6 with ethernet to nicely align the words for processing of IP packets -// Parameter LABEL specifies a value to put in the high word of the very first packet. -// This is useful for labeling packets with the port it came from so downstream knows -// how to process it. LABEL gets overwritten if START_BYTE = 0 - -module ll8_to_axi64 - #(parameter START_BYTE=6, - parameter LABEL=8'h00) - (input clk, input reset, input clear, - input [7:0] ll_data, input ll_eof, input ll_error, input ll_src_rdy, output ll_dst_rdy, - output [63:0] axi64_tdata, output axi64_tlast, output [3:0] axi64_tuser, output axi64_tvalid, input axi64_tready); - - wire error_int, eof_int; - wire [7:0] data_int; - wire valid_int, ready_int; - - axi_fifo_short #(.WIDTH(10)) ll8_fifo - (.clk(clk), .reset(reset), .clear(0), - .i_tdata({ll_error, ll_eof, ll_data}), .i_tvalid(ll_src_rdy), .i_tready(ll_dst_rdy), - .o_tdata({error_int, eof_int, data_int}), .o_tvalid(valid_int), .o_tready(ready_int), - .space(), .occupied()); - - wire [7:0] label_wire = LABEL; // Enforces parameter width - - reg [3:0] state = START_BYTE; - reg [63:0] holding; // = {label_wire, 56'h0}; - reg err, eof, done; - reg [3:0] occ; - - localparam WAIT = 4'd8; - - always @(posedge clk) - if(reset | clear) - begin - state <= START_BYTE; - holding <= {label_wire, 56'h0}; - err <= 1'b0; - eof <= 1'b0; - occ <= 3'd0; - done <= 1'b0; - end - else - if(state == WAIT) - begin - state <= START_BYTE; - done <= 1'b0; - holding <= {label_wire, 56'h0}; - end - else if(valid_int & ready_int) - begin - case(state) - 4'd0: - begin - holding[63:56] <= data_int; - holding[55:0] <= 56'h0; - end - 4'd1: holding[55:48] <= data_int; - 4'd2: holding[47:40] <= data_int; - 4'd3: holding[39:32] <= data_int; - 4'd4: holding[31:24] <= data_int; - 4'd5: holding[23:16] <= data_int; - 4'd6: holding[15:8] <= data_int; - 4'd7: holding[7:0] <= data_int; - endcase // case (state) - - err <= error_int; - eof <= eof_int; - if(error_int | eof_int) - begin - occ <= state+1; - done <= 1'b1; - state <= WAIT; - end - else if (state == 4'd7) - begin - occ <= 3'd0; - done <= 1'b1; - state <= 4'd0; - end - else - begin - occ <= 3'd0; - done <= 1'b0; - state <= state + 4'd1; - end // else: !if(state == 4'd7) - - end // if (valid_int & ready_int) - else - done <= 1'b0; - - assign axi64_tdata = holding; - assign axi64_tlast = eof; - assign axi64_tuser[3] = err; - assign axi64_tuser[2:0] = occ; - - assign ready_int = axi64_tready & (state != WAIT); - assign axi64_tvalid = done; - -endmodule // ll8_to_axi64 diff --git a/fpga/usrp3/lib/simple_gemac/ll8_to_axi64_tb.v b/fpga/usrp3/lib/simple_gemac/ll8_to_axi64_tb.v deleted file mode 100644 index 590875338..000000000 --- a/fpga/usrp3/lib/simple_gemac/ll8_to_axi64_tb.v +++ /dev/null @@ -1,95 +0,0 @@ -`timescale 1ns/1ps - -module ll8_to_axi64_tb(); - - reg clk = 0; - reg reset = 1; - - always #10 clk = ~clk; - - initial $dumpfile("ll8_to_axi64_tb.vcd"); - initial $dumpvars(0,ll8_to_axi64_tb); - - initial - begin - #1000 reset = 0; - #2000000; - $finish; - end - - wire [63:0] tdata, tdata_int; - wire [3:0] tuser, tuser_int; - wire tlast, tlast_int; - wire tvalid, tvalid_int, tready, tready_int; - - reg [7:0] ll_data; - reg ll_eof, ll_error, ll_src_rdy; - wire ll_dst_rdy; - - wire [7:0] ll_data2; - wire ll_eof2, ll_src_rdy2, ll_dst_rdy2; - - localparam RPT_COUNT = 12; - - initial - begin - ll_src_rdy <= 0; - - while(reset) - @(posedge clk); - - @(posedge clk); - - {ll_error, ll_eof, ll_data} <= { 1'b0, 1'b0, 8'hA0 }; - repeat(RPT_COUNT-1) - begin - ll_src_rdy <= 1; - @(posedge clk); - ll_data <= ll_data + 1; - end - ll_eof <= 1; - ll_data <= ll_data + 1; - @(posedge clk); - - {ll_error, ll_eof, ll_data} <= { 1'b0, 1'b0, 8'hC0 }; - repeat(RPT_COUNT-1) - begin - ll_src_rdy <= 1; - @(posedge clk); - ll_data <= ll_data + 1; - end - ll_eof <= 1; ll_error <= 1; - ll_data <= ll_data + 1; - @(posedge clk); - ll_src_rdy <= 1'b0; - - end - - ll8_to_axi64 #(.START_BYTE(6), .LABEL(8'h89)) ll8_to_axi64 - (.clk(clk), .reset(reset), .clear(1'b0), - .ll_data(ll_data), .ll_eof(ll_eof), .ll_error(ll_error), .ll_src_rdy(ll_src_rdy), .ll_dst_rdy(ll_dst_rdy), - .axi64_tdata(tdata), .axi64_tlast(tlast), .axi64_tuser(tuser), .axi64_tvalid(tvalid), .axi64_tready(tready) ); - - axi_fifo_short #(.WIDTH(69)) axi_fifo_short - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata({tlast,tuser,tdata}), .i_tvalid(tvalid), .i_tready(tready), - .o_tdata({tlast_int,tuser_int,tdata_int}), .o_tvalid(tvalid_int), .o_tready(tready_int)); - - axi64_to_ll8 #(.START_BYTE(6)) axi64_to_ll8 - (.clk(clk), .reset(reset), .clear(1'b0), - .axi64_tdata(tdata_int), .axi64_tlast(tlast_int), .axi64_tuser(tuser_int), .axi64_tvalid(tvalid_int), .axi64_tready(tready_int), - .ll_data(ll_data2), .ll_eof(ll_eof2), .ll_src_rdy(ll_src_rdy2), .ll_dst_rdy(ll_dst_rdy2) ); - - /* - always @(posedge clk) - if(ll_src_rdy2 & ll_dst_rdy2) - $display("EOF %x\tDATA %x",ll_eof2, ll_data2); - - */ - assign ll_dst_rdy2 = 1; - - always @(posedge clk) - if(tvalid_int & tready_int) - $display("TERR %x\tTUSER %x\tTLAST %x\tTDATA %x",tuser_int[3],tuser_int[2:0], tlast_int, tdata_int); - -endmodule // ll8_to_axi64_tb diff --git a/fpga/usrp3/lib/simple_gemac/ll8_to_txmac.v b/fpga/usrp3/lib/simple_gemac/ll8_to_txmac.v deleted file mode 100644 index 67729c52d..000000000 --- a/fpga/usrp3/lib/simple_gemac/ll8_to_txmac.v +++ /dev/null @@ -1,48 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - -module ll8_to_txmac - (input clk, input reset, input clear, - input [7:0] ll_data, input ll_eof, input ll_src_rdy, output ll_dst_rdy, - output [7:0] tx_data, output tx_valid, output tx_error, input tx_ack ); - - reg [2:0] xfer_state; - - localparam XFER_IDLE = 0; - localparam XFER_ACTIVE = 1; - localparam XFER_WAIT1 = 2; - localparam XFER_UNDERRUN = 3; - localparam XFER_DROP = 4; - - always @(posedge clk) - if(reset | clear) - xfer_state <= XFER_IDLE; - else - case(xfer_state) - XFER_IDLE : - if(tx_ack) - xfer_state <= XFER_ACTIVE; - XFER_ACTIVE : - if(~ll_src_rdy) - xfer_state <= XFER_UNDERRUN; - else if(ll_eof) - xfer_state <= XFER_WAIT1; - XFER_WAIT1 : - xfer_state <= XFER_IDLE; - XFER_UNDERRUN : - xfer_state <= XFER_DROP; - XFER_DROP : - if(ll_eof) - xfer_state <= XFER_IDLE; - endcase // case (xfer_state) - - assign ll_dst_rdy = (xfer_state == XFER_ACTIVE) | tx_ack | (xfer_state == XFER_DROP); - assign tx_valid = (ll_src_rdy & (xfer_state == XFER_IDLE))|(xfer_state == XFER_ACTIVE); - assign tx_data = ll_data; - assign tx_error = (xfer_state == XFER_UNDERRUN); - -endmodule // ll8_to_txmac - diff --git a/fpga/usrp3/lib/simple_gemac/mdio.v b/fpga/usrp3/lib/simple_gemac/mdio.v deleted file mode 100644 index 81fe5ba8f..000000000 --- a/fpga/usrp3/lib/simple_gemac/mdio.v +++ /dev/null @@ -1,847 +0,0 @@ -// Define MDIO to add support for clause 22 and clause 45 MDIO interface -`define MDIO -// If WB clock is 62.5MHz and max MDC spec is 2.5MHz, then divide by 25 -//`define MDC_HALF_PERIOD 13 // Closest int to 12.5 -`define MDC_HALF_PERIOD 100 - -// Registers -`define CPUREG_MDIO_DATA 8'h10 -`define CPUREG_MDIO_ADDR 8'h14 -`define CPUREG_MDIO_OP 8'h18 -`define CPUREG_MDIO_CONTROL 8'h1c -`define CPUREG_MDIO_STATUS 8'h1c -`define CPUREG_GPIO 8'h20 - - -module mdio - ( - // Wishbone Bus - input wb_clk_i, - input wb_rst_i, - input [7:0] wb_adr_i, - input [31:0] wb_dat_i, - input wb_we_i, - input wb_stb_i, - input wb_cyc_i, - output reg [31:0] wb_dat_o, - output wb_ack_o, - output reg wb_int_o, - // MDIO - output reg mdc, - output reg mdio_out, - output reg mdio_tri, - input mdio_in - ); - - // - // State Declarations - // - parameter - IDLE = 0, - PREAMBLE1 = 1, - PREAMBLE2 = 2, - PREAMBLE3 = 3, - PREAMBLE4 = 4, - PREAMBLE5 = 5, - PREAMBLE6 = 6, - PREAMBLE7 = 7, - PREAMBLE8 = 8, - PREAMBLE9 = 9, - PREAMBLE10 = 10, - PREAMBLE11 = 11, - PREAMBLE12 = 12, - PREAMBLE13 = 13, - PREAMBLE14 = 14, - PREAMBLE15 = 15, - PREAMBLE16 = 16, - PREAMBLE17 = 17, - PREAMBLE18 = 18, - PREAMBLE19 = 19, - PREAMBLE20 = 20, - PREAMBLE21 = 21, - PREAMBLE22 = 22, - PREAMBLE23 = 23, - PREAMBLE24 = 24, - PREAMBLE25 = 25, - PREAMBLE26 = 26, - PREAMBLE27 = 27, - PREAMBLE28 = 28, - PREAMBLE29 = 29, - PREAMBLE30 = 30, - PREAMBLE31 = 31, - PREAMBLE32 = 32, - START1 = 33, - C22_START2 = 34, - C45_START2 = 35, - OP1 = 36, - OP2 = 37, - PRTAD1 = 38, - PRTAD2 = 39, - PRTAD3 = 40, - PRTAD4 = 41, - PRTAD5 = 42, - DEVAD1 = 43, - DEVAD2 = 44, - DEVAD3 = 45, - DEVAD4 = 46, - DEVAD5 = 47, - TA1 = 48, - TA2 = 49, - TA3 = 50, - READ1 = 51, - READ2 = 52, - READ3 = 53, - READ4 = 54, - READ5 = 55, - READ6 = 56, - READ7 = 57, - READ8 = 58, - READ9 = 59, - READ10 = 60, - READ11 = 61, - READ12 = 62, - READ13 = 63, - READ14 = 64, - READ15 = 65, - READ16 = 66, - WRITE1 = 67, - WRITE2 = 68, - WRITE3 = 69, - WRITE4 = 70, - WRITE5 = 71, - WRITE6 = 72, - WRITE7 = 73, - WRITE8 = 74, - WRITE9 = 75, - WRITE10 = 76, - WRITE11 = 77, - WRITE12 = 78, - WRITE13 = 79, - WRITE14 = 80, - WRITE15 = 81, - WRITE16 = 82, - C45_ADDR1 = 83, - C45_ADDR2 = 84, - C45_ADDR3 = 85, - C45_ADDR4 = 86, - C45_ADDR5 = 87, - C45_ADDR6 = 88, - C45_ADDR7 = 89, - C45_ADDR8 = 90, - C45_ADDR9 = 91, - C45_ADDR10 = 92, - C45_ADDR11 = 93, - C45_ADDR12 = 94, - C45_ADDR13 = 95, - C45_ADDR14 = 96, - C45_ADDR15 = 97, - C45_ADDR16 = 98, - PREIDLE = 99; - - reg cpuack; - reg [15:0] mdio_read_data; - reg [15:0] mdio_write_data; - reg [15:0] mdio_address; - reg [12:0] mdio_operation; - reg mdio_control; - reg [7:0] mdc_clk_count; - reg mdc_falling_edge; - reg mdio_running; - reg mdio_done; - reg [7:0] state; - - - assign wb_ack_o = cpuack && wb_stb_i; - - always @(posedge wb_clk_i or posedge wb_rst_i) begin - - if (wb_rst_i == 1'b1) begin - wb_dat_o <= 32'b0; - wb_int_o <= 1'b0; - cpuack <= 1'b0; - - mdio_address <= 0; - mdio_operation <= 0; - mdio_write_data <= 0; - mdio_running <= 0; - end - else begin - - wb_int_o <= 1'b0; - cpuack <= wb_cyc_i && wb_stb_i; - // Handshake to MDIO state machine to reset running flag in status. - // Wait for falling MDC edge to prevent S/W race condition occuring - // where done flag still asserted but running flag now cleared (repeatedly). - if (mdio_done && mdc_falling_edge) - mdio_running <= 0; - - // - // Read access - // - if (wb_cyc_i && wb_stb_i && !wb_we_i) begin - - case ({wb_adr_i[7:2], 2'b0}) - - `CPUREG_MDIO_DATA: begin - wb_dat_o <= {16'b0, mdio_read_data}; - end - - `CPUREG_MDIO_STATUS: begin - wb_dat_o <= {31'b0, mdio_running}; - end - - default: begin - end - - endcase - end - - // - // Write access - // - if (wb_cyc_i && wb_stb_i && wb_we_i) begin - $display("reg write @ addr %x",({wb_adr_i[7:2], 2'b0})); - - case ({wb_adr_i[7:2], 2'b0}) - - `CPUREG_MDIO_DATA: begin - mdio_write_data <= wb_dat_i[15:0]; - end - - `CPUREG_MDIO_ADDR: begin - mdio_address <= wb_dat_i[15:0]; - end - - `CPUREG_MDIO_OP: begin - mdio_operation <= wb_dat_i[12:0]; - end - - `CPUREG_MDIO_CONTROL: begin - // Trigger mdio operation here. Cleared by state machine at end of bus transaction. - if (wb_dat_i[0]) - mdio_running <= 1; - end - - default: begin - end - - endcase - - end - - end - - end // always @ (posedge wb_clk_i or posedge wb_rst_i) - - - // - // Produce mdc clock as a signal synchronously from Wishbone clock. - // - always @(posedge wb_clk_i or posedge wb_rst_i) - if (wb_rst_i) - begin - mdc_clk_count <= 1; - mdc <= 0; - mdc_falling_edge <= 0; - end - else if (mdc_clk_count == `MDC_HALF_PERIOD) - begin - mdc_clk_count <= 1; - mdc <= ~mdc; - mdc_falling_edge <= mdc; - end - else - begin - mdc_clk_count <= mdc_clk_count + 1; - mdc_falling_edge <= 0; - end - - // - // MDIO state machine - // - always @(posedge wb_clk_i or posedge wb_rst_i) - if (wb_rst_i) - begin - mdio_tri <= 1; - mdio_out <= 0; - mdio_done <= 0; - mdio_read_data <= 0; - state <= IDLE; - end - else if (mdc_falling_edge) - // - // This is the MDIO bus controller. Use falling edge of MDC. - // - begin - // Defaults - mdio_tri <= 1; - mdio_out <= 0; - mdio_done <= 0; - - - case(state) - // IDLE. - // In Clause 22 & 45 the master of the MDIO bus is tristate during idle. - // - IDLE: begin - mdio_tri <= 1; - mdio_out <= 0; - if (mdio_running) - state <= PREAMBLE1; - end - // Preamble. All MDIO transactions begin witrh 32bits of 1 bits as a preamble. - PREAMBLE1: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE2; - end - PREAMBLE2: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE3; - end - PREAMBLE3: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE4; - end - PREAMBLE4: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE5; - end - PREAMBLE5: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE6; - end - PREAMBLE6: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE7; - end - PREAMBLE7: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE8; - end - PREAMBLE8: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE9; - end - PREAMBLE9: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE10; - end - PREAMBLE10: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE11; - end - PREAMBLE11: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE12; - end - PREAMBLE12: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE13; - end - PREAMBLE13: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE14; - end - PREAMBLE14: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE15; - end - PREAMBLE15: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE16; - end - PREAMBLE16: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE17; - end - PREAMBLE17: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE18; - end - PREAMBLE18: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE19; - end - PREAMBLE19: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE20; - end - PREAMBLE20: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE21; - end - PREAMBLE21: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE22; - end - PREAMBLE22: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE23; - end - PREAMBLE23: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE24; - end - PREAMBLE24: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE25; - end - PREAMBLE25: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE26; - end - PREAMBLE26: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE27; - end - PREAMBLE27: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE28; - end - PREAMBLE28: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE29; - end - PREAMBLE29: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE30; - end - PREAMBLE30: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE31; - end - PREAMBLE31: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= PREAMBLE32; - end - PREAMBLE32: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= START1; - end - // - // Start code for Clause 22 is 01 and Clause 45 is 00 - // - START1: begin - mdio_tri <= 0; - mdio_out <= 0; - if (mdio_operation[12]) - // Clause 45 bit set. - state <= C45_START2; - else - state <= C22_START2; - end - // - // 2nd Clause 22 start bit is a 1 - // - C22_START2: begin - mdio_tri <= 0; - mdio_out <= 1; - state <= OP1; - end - // - // 2nd Clause 45 start bit is a 0 - // - C45_START2: begin - mdio_tri <= 0; - mdio_out <= 0; - state <= OP1; - end - // - // Both Clause 22 & 45 use 2 bits for operation and are compatable. - // Note we don't screen here for illegal Clause 22 ops. - // - OP1: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[11]; - state <= OP2; - end - OP2: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[10]; - state <= PRTAD1; - end - // - // Both Clause 22 & 45 use 2 sucsessive 5 bit fields to form a hierarchical address - // though it's used slightly different between the 2 standards. - // - PRTAD1: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[9]; - state <= PRTAD2; - end - PRTAD2: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[8]; - state <= PRTAD3; - end - PRTAD3: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[7]; - state <= PRTAD4; - end - PRTAD4: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[6]; - state <= PRTAD5; - end - PRTAD5: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[5]; - state <= DEVAD1; - end - DEVAD1: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[4]; - state <= DEVAD2; - end - DEVAD2: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[3]; - state <= DEVAD3; - end - DEVAD3: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[2]; - state <= DEVAD4; - end - DEVAD4: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[1]; - state <= DEVAD5; - end - DEVAD5: begin - mdio_tri <= 0; - mdio_out <= mdio_operation[0]; - state <= TA1; - end - // - // Both Clause 22 & Clause 45 use the same turn around on the bus. - // Reads have Z as the first bit and 0 driven by the slave for the 2nd bit. - // Note that slaves drive the bus on the rising edge of MDC. - // Writes and Address cycles have 10 driven by the master. - // - TA1: begin - // Clause22 write or clause45 write or address go to state TA2 - if ((mdio_operation[12:11] == 2'b10) || (mdio_operation[12:11] == 2'b01)) - begin - mdio_tri <= 0; - mdio_out <= 1; - state <= TA2; - end - else // Read - begin - mdio_tri <= 1; - state <= TA3; - end - end - TA2: begin - mdio_tri <= 0; - mdio_out <= 0; - if (!mdio_operation[12]) // Clause 22 Write - state <= WRITE1; - else if (mdio_operation[10]) // Clause 45 Write - state <= WRITE1; - else // Clause 45 ADDRESS - state <= C45_ADDR1; - end - TA3: begin - mdio_tri <= 1; - state <= READ1; - end - // - // Clause 22 Reads and both forms of clause 45 Reads have the same bus transaction from here out. - // - READ1: begin - mdio_tri <= 1; - mdio_read_data[15] <= mdio_in; - state <= READ2; - end - READ2: begin - mdio_tri <= 1; - mdio_read_data[14] <= mdio_in; - state <= READ3; - end - READ3: begin - mdio_tri <= 1; - mdio_read_data[13] <= mdio_in; - state <= READ4; - end - READ4: begin - mdio_tri <= 1; - mdio_read_data[12] <= mdio_in; - state <= READ5; - end - READ5: begin - mdio_tri <= 1; - mdio_read_data[11] <= mdio_in; - state <= READ6; - end - READ6: begin - mdio_tri <= 1; - mdio_read_data[10] <= mdio_in; - state <= READ7; - end - READ7: begin - mdio_tri <= 1; - mdio_read_data[9] <= mdio_in; - state <= READ8; - end - READ8: begin - mdio_tri <= 1; - mdio_read_data[8] <= mdio_in; - state <= READ9; - end - READ9: begin - mdio_tri <= 1; - mdio_read_data[7] <= mdio_in; - state <= READ10; - end - READ10: begin - mdio_tri <= 1; - mdio_read_data[6] <= mdio_in; - state <= READ11; - end - READ11: begin - mdio_tri <= 1; - mdio_read_data[5] <= mdio_in; - state <= READ12; - end - READ12: begin - mdio_tri <= 1; - mdio_read_data[4] <= mdio_in; - state <= READ13; - end - READ13: begin - mdio_tri <= 1; - mdio_read_data[3] <= mdio_in; - state <= READ14; - end - READ14: begin - mdio_tri <= 1; - mdio_read_data[2] <= mdio_in; - state <= READ15; - end - READ15: begin - mdio_tri <= 1; - mdio_read_data[1] <= mdio_in; - state <= READ16; - end - READ16: begin - mdio_tri <= 1; - mdio_read_data[0] <= mdio_in; - state <= PREIDLE; - mdio_done <= 1; - end - // - // Write 16bits of data for all types of Write. - // - WRITE1:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[15]; - state <= WRITE2; - end - WRITE2:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[14]; - state <= WRITE3; - end - WRITE3:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[13]; - state <= WRITE4; - end - WRITE4:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[12]; - state <= WRITE5; - end - WRITE5:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[11]; - state <= WRITE6; - end - WRITE6:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[10]; - state <= WRITE7; - end - WRITE7:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[9]; - state <= WRITE8; - end - WRITE8:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[8]; - state <= WRITE9; - end - WRITE9:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[7]; - state <= WRITE10; - end - WRITE10:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[6]; - state <= WRITE11; - end - WRITE11:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[5]; - state <= WRITE12; - end - WRITE12:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[4]; - state <= WRITE13; - end - WRITE13:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[3]; - state <= WRITE14; - end - WRITE14:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[2]; - state <= WRITE15; - end - WRITE15:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[1]; - state <= WRITE16; - end - WRITE16:begin - mdio_tri <= 0; - mdio_out <= mdio_write_data[0]; - state <= PREIDLE; - mdio_done <= 1; - end - // - // Write 16bits of address for a Clause 45 Address transaction - // - C45_ADDR1:begin - mdio_tri <= 0; - mdio_out <= mdio_address[15]; - state <= C45_ADDR2; - end - C45_ADDR2:begin - mdio_tri <= 0; - mdio_out <= mdio_address[14]; - state <= C45_ADDR3; - end - C45_ADDR3:begin - mdio_tri <= 0; - mdio_out <= mdio_address[13]; - state <= C45_ADDR4; - end - C45_ADDR4:begin - mdio_tri <= 0; - mdio_out <= mdio_address[12]; - state <= C45_ADDR5; - end - C45_ADDR5:begin - mdio_tri <= 0; - mdio_out <= mdio_address[11]; - state <= C45_ADDR6; - end - C45_ADDR6:begin - mdio_tri <= 0; - mdio_out <= mdio_address[10]; - state <= C45_ADDR7; - end - C45_ADDR7:begin - mdio_tri <= 0; - mdio_out <= mdio_address[9]; - state <= C45_ADDR8; - end - C45_ADDR8:begin - mdio_tri <= 0; - mdio_out <= mdio_address[8]; - state <= C45_ADDR9; - end - C45_ADDR9:begin - mdio_tri <= 0; - mdio_out <= mdio_address[7]; - state <= C45_ADDR10; - end - C45_ADDR10:begin - mdio_tri <= 0; - mdio_out <= mdio_address[6]; - state <= C45_ADDR11; - end - C45_ADDR11:begin - mdio_tri <= 0; - mdio_out <= mdio_address[5]; - state <= C45_ADDR12; - end - C45_ADDR12:begin - mdio_tri <= 0; - mdio_out <= mdio_address[4]; - state <= C45_ADDR13; - end - C45_ADDR13:begin - mdio_tri <= 0; - mdio_out <= mdio_address[3]; - state <= C45_ADDR14; - end - C45_ADDR14:begin - mdio_tri <= 0; - mdio_out <= mdio_address[2]; - state <= C45_ADDR15; - end - C45_ADDR15:begin - mdio_tri <= 0; - mdio_out <= mdio_address[1]; - state <= C45_ADDR16; - end - C45_ADDR16:begin - mdio_tri <= 0; - mdio_out <= mdio_address[0]; - state <= PREIDLE; - mdio_done <= 1; - end - // - // PREIDLE allows the mdio_running bit to reset. - // - PREIDLE: begin - state <= IDLE; - end - endcase // case(state) - - end // if (mdc_falling_edge) - - -endmodule - diff --git a/fpga/usrp3/lib/simple_gemac/rxmac_to_ll8.v b/fpga/usrp3/lib/simple_gemac/rxmac_to_ll8.v deleted file mode 100644 index 4a6713397..000000000 --- a/fpga/usrp3/lib/simple_gemac/rxmac_to_ll8.v +++ /dev/null @@ -1,59 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - -module rxmac_to_ll8 - (input clk, input reset, input clear, - input [7:0] rx_data, input rx_valid, input rx_error, input rx_ack, - output [7:0] ll_data, output ll_sof, output ll_eof, output ll_error, output ll_src_rdy, input ll_dst_rdy ); - - reg [2:0] xfer_state; - - localparam XFER_IDLE = 0; - localparam XFER_ACTIVE = 1; - localparam XFER_ERROR = 2; - localparam XFER_ERROR2 = 3; - localparam XFER_OVERRUN = 4; - localparam XFER_OVERRUN2 = 5; - - assign ll_data = rx_data; - assign ll_src_rdy = ((rx_valid & (xfer_state != XFER_OVERRUN2) ) - | (xfer_state == XFER_ERROR) - | (xfer_state == XFER_OVERRUN)); - assign ll_sof = ((xfer_state==XFER_IDLE)|(xfer_state==XFER_ERROR)|(xfer_state==XFER_OVERRUN)); - assign ll_eof = (rx_ack | (xfer_state==XFER_ERROR) | (xfer_state==XFER_OVERRUN)); - assign ll_error = (xfer_state == XFER_ERROR)|(xfer_state==XFER_OVERRUN); - - always @(posedge clk) - if(reset | clear) - xfer_state <= XFER_IDLE; - else - case(xfer_state) - XFER_IDLE : - if(rx_valid) - xfer_state <= XFER_ACTIVE; - XFER_ACTIVE : - if(rx_error) - xfer_state <= XFER_ERROR; - else if(~rx_valid) - xfer_state <= XFER_IDLE; - else if(~ll_dst_rdy) - xfer_state <= XFER_OVERRUN; - XFER_ERROR : - if(ll_dst_rdy) - xfer_state <= XFER_ERROR2; - XFER_ERROR2 : - if(~rx_error) - xfer_state <= XFER_IDLE; - XFER_OVERRUN : - if(ll_dst_rdy) - xfer_state <= XFER_OVERRUN2; - XFER_OVERRUN2 : - if(~rx_valid) - xfer_state <= XFER_IDLE; - endcase // case (xfer_state) - - -endmodule // rxmac_to_ll8 diff --git a/fpga/usrp3/lib/simple_gemac/simple_gemac.v b/fpga/usrp3/lib/simple_gemac/simple_gemac.v deleted file mode 100644 index 87a739ccd..000000000 --- a/fpga/usrp3/lib/simple_gemac/simple_gemac.v +++ /dev/null @@ -1,69 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - -module simple_gemac - (input clk125, input reset, - // GMII - output GMII_GTX_CLK, output GMII_TX_EN, output GMII_TX_ER, output [7:0] GMII_TXD, - input GMII_RX_CLK, input GMII_RX_DV, input GMII_RX_ER, input [7:0] GMII_RXD, - - // Flow Control Interface - input pause_req, input [15:0] pause_time_req, input pause_respect_en, - - // Settings - input [47:0] ucast_addr, input [47:0] mcast_addr, - input pass_ucast, input pass_mcast, input pass_bcast, input pass_pause, input pass_all, - - // RX Client Interface - output rx_clk, output [7:0] rx_data, output rx_valid, output rx_error, output rx_ack, - - // TX Client Interface - output tx_clk, input [7:0] tx_data, input tx_valid, input tx_error, output tx_ack, - - output [31:0] debug - ); - - localparam SGE_IFG = 8'd12; // 12 should be the absolute minimum - - wire rst_rxclk, rst_txclk; - reset_sync reset_sync_tx (.clk(tx_clk),.reset_in(reset),.reset_out(rst_txclk)); - reset_sync reset_sync_rx (.clk(rx_clk),.reset_in(reset),.reset_out(rst_rxclk)); - - wire [15:0] pause_quanta_rcvd; - wire pause_rcvd, pause_apply, paused; - - simple_gemac_tx simple_gemac_tx - (.clk125(clk125),.reset(rst_txclk), - .GMII_GTX_CLK(GMII_GTX_CLK), .GMII_TX_EN(GMII_TX_EN), - .GMII_TX_ER(GMII_TX_ER), .GMII_TXD(GMII_TXD), - .tx_clk(tx_clk), .tx_data(tx_data), .tx_valid(tx_valid), .tx_error(tx_error), .tx_ack(tx_ack), - .ifg(SGE_IFG), .mac_addr(ucast_addr), - .pause_req(pause_req), .pause_time(pause_time_req), // We request flow control - .pause_apply(pause_apply), .paused(paused) // We respect flow control - ); - - simple_gemac_rx simple_gemac_rx - (.reset(rst_rxclk), - .GMII_RX_CLK(GMII_RX_CLK), .GMII_RX_DV(GMII_RX_DV), - .GMII_RX_ER(GMII_RX_ER), .GMII_RXD(GMII_RXD), - .rx_clk(rx_clk), .rx_data(rx_data), .rx_valid(rx_valid), .rx_error(rx_error), .rx_ack(rx_ack), - .ucast_addr(ucast_addr), .mcast_addr(mcast_addr), - .pass_ucast(pass_ucast), .pass_mcast(pass_mcast), .pass_bcast(pass_bcast), - .pass_pause(pass_pause), .pass_all(pass_all), - .pause_quanta_rcvd(pause_quanta_rcvd), .pause_rcvd(pause_rcvd), - .debug(debug) - ); - - flow_ctrl_tx flow_ctrl_tx - (.rst(rst_txclk), .tx_clk(tx_clk), - .tx_pause_en(pause_respect_en), - .pause_quanta(pause_quanta_rcvd), // 16 bit value - .pause_quanta_val(pause_rcvd), - .pause_apply(pause_apply), - .paused(paused) - ); - -endmodule // simple_gemac diff --git a/fpga/usrp3/lib/simple_gemac/simple_gemac_rx.v b/fpga/usrp3/lib/simple_gemac/simple_gemac_rx.v deleted file mode 100644 index 72b2c73d2..000000000 --- a/fpga/usrp3/lib/simple_gemac/simple_gemac_rx.v +++ /dev/null @@ -1,182 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - - -module simple_gemac_rx - (input reset, - input GMII_RX_CLK, input GMII_RX_DV, input GMII_RX_ER, input [7:0] GMII_RXD, - output rx_clk, output [7:0] rx_data, output reg rx_valid, output rx_error, output reg rx_ack, - input [47:0] ucast_addr, input [47:0] mcast_addr, - input pass_ucast, input pass_mcast, input pass_bcast, input pass_pause, input pass_all, - output reg [15:0] pause_quanta_rcvd, output pause_rcvd, - output [31:0] debug ); - - localparam RX_IDLE = 0; - localparam RX_PREAMBLE = 1; - localparam RX_FRAME = 2; - localparam RX_GOODFRAME = 3; - localparam RX_DO_PAUSE = 4; - localparam RX_ERROR = 5; - localparam RX_DROP = 6; - - localparam RX_PAUSE = 16; - localparam RX_PAUSE_CHK88 = RX_PAUSE + 5; - localparam RX_PAUSE_CHK08 = RX_PAUSE_CHK88 + 1; - localparam RX_PAUSE_CHK00 = RX_PAUSE_CHK08 + 1; - localparam RX_PAUSE_CHK01 = RX_PAUSE_CHK00 + 1; - localparam RX_PAUSE_STORE_MSB = RX_PAUSE_CHK01 + 1; - localparam RX_PAUSE_STORE_LSB = RX_PAUSE_STORE_MSB + 1; - localparam RX_PAUSE_WAIT_CRC = RX_PAUSE_STORE_LSB + 1; - - reg [7:0] rxd_d1; - reg rx_dv_d1, rx_er_d1; - assign rx_clk = GMII_RX_CLK; - - always @(posedge rx_clk) - begin - rx_dv_d1 <= GMII_RX_DV; - rx_er_d1 <= GMII_RX_ER; - rxd_d1 <= GMII_RXD; - end - - reg [7:0] rx_state; - wire [7:0] rxd_del; - wire rx_dv_del, rx_er_del; - reg go_filt; - - wire match_crc; - wire clear_crc = rx_state == RX_IDLE; - wire calc_crc = (rx_state == RX_FRAME) | rx_state[7:4]==4'h1; - - localparam DELAY = 6; - delay_line #(.WIDTH(10)) rx_delay - (.clk(rx_clk), .delay(DELAY), .din({rx_dv_d1,rx_er_d1,rxd_d1}),.dout({rx_dv_del,rx_er_del,rxd_del})); - - always @(posedge rx_clk) - if(reset) - rx_ack <= 0; - else - rx_ack <= (rx_state == RX_GOODFRAME); - - wire is_ucast, is_bcast, is_mcast, is_pause, is_any_ucast; - wire keep_packet = (pass_all & is_any_ucast) | (pass_ucast & is_ucast) | (pass_mcast & is_mcast) | - (pass_bcast & is_bcast) | (pass_pause & is_pause); - - assign rx_data = rxd_del; - assign rx_error = (rx_state == RX_ERROR); - - always @(posedge rx_clk) - if(reset) - rx_valid <= 0; - else if(keep_packet) - rx_valid <= 1; - else if((rx_state == RX_IDLE)|(rx_state == RX_ERROR)) - rx_valid <= 0; - - address_filter af_ucast (.clk(rx_clk), .reset(reset), .go(go_filt), .data(rxd_d1), - .address(ucast_addr), .match(is_ucast), .done()); - address_filter af_mcast (.clk(rx_clk), .reset(reset), .go(go_filt), .data(rxd_d1), - .address(mcast_addr), .match(is_mcast), .done()); - address_filter af_bcast (.clk(rx_clk), .reset(reset), .go(go_filt), .data(rxd_d1), - .address(48'hFFFF_FFFF_FFFF), .match(is_bcast), .done()); - address_filter af_pause (.clk(rx_clk), .reset(reset), .go(go_filt), .data(rxd_d1), - .address(48'h0180_c200_0001), .match(is_pause), .done()); - address_filter_promisc af_promisc (.clk(rx_clk), .reset(reset), .go(go_filt), .data(rxd_d1), - .match(is_any_ucast), .done()); - - always @(posedge rx_clk) - go_filt <= (rx_state==RX_PREAMBLE) & (rxd_d1 == 8'hD5); - - reg [15:0] pkt_len_ctr; - always @(posedge rx_clk) - if(reset |(rx_state == RX_IDLE)) - pkt_len_ctr <= 0; - else - pkt_len_ctr <= pkt_len_ctr + 1; - - localparam MIN_PAUSE_LEN = 71; // 6 - wire pkt_long_enough = (pkt_len_ctr >= MIN_PAUSE_LEN); - always @(posedge rx_clk) - if(reset) - rx_state <= RX_IDLE; - else - if(rx_er_d1) // | (~pkt_long_enough & ~rx_dv_d1) & (rx_state != RX_IDLE)) - rx_state <= RX_ERROR; - else - case(rx_state) - RX_IDLE : - if(rx_dv_d1) - if(rxd_d1 == 8'h55) - rx_state <= RX_PREAMBLE; - else - rx_state <= RX_ERROR; - RX_PREAMBLE : - if(~rx_dv_d1) - rx_state <= RX_ERROR; - else if(rxd_d1 == 8'hD5) - rx_state <= RX_FRAME; - else if(rxd_d1 != 8'h55) - rx_state <= RX_ERROR; - RX_FRAME : - if(is_pause) - rx_state <= RX_PAUSE; - else if(~rx_dv_d1) - if(match_crc) - rx_state <= RX_GOODFRAME; - else - rx_state <= RX_ERROR; - RX_PAUSE_CHK88 : - if(rxd_d1 != 8'h88) - rx_state <= RX_DROP; - else - rx_state <= RX_PAUSE_CHK08; - RX_PAUSE_CHK08 : - if(rxd_d1 != 8'h08) - rx_state <= RX_DROP; - else - rx_state <= RX_PAUSE_CHK00; - RX_PAUSE_CHK00 : - if(rxd_d1 != 8'h00) - rx_state <= RX_DROP; - else - rx_state <= RX_PAUSE_CHK01; - RX_PAUSE_CHK01 : - if(rxd_d1 != 8'h01) - rx_state <= RX_DROP; - else - rx_state <= RX_PAUSE_STORE_MSB; - RX_PAUSE_WAIT_CRC : - if(pkt_long_enough) - if(match_crc) - rx_state <= RX_DO_PAUSE; - else - rx_state <= RX_DROP; - RX_DO_PAUSE : - rx_state <= RX_IDLE; - RX_GOODFRAME : - rx_state <= RX_IDLE; - RX_DROP, RX_ERROR : - if(~rx_dv_d1) - rx_state <= RX_IDLE; - default - rx_state <= rx_state + 1; - endcase // case (rx_state) - - assign pause_rcvd = (rx_state == RX_DO_PAUSE); - crc crc_check(.clk(rx_clk),.reset(reset),.clear(clear_crc), - .data(rxd_d1),.calc(calc_crc),.crc_out(),.match(match_crc)); - - always @(posedge rx_clk) - if(reset) - pause_quanta_rcvd <= 0; - else if(rx_state == RX_PAUSE_STORE_MSB) - pause_quanta_rcvd[15:8] <= rxd_d1; - else if(rx_state == RX_PAUSE_STORE_LSB) - pause_quanta_rcvd[7:0] <= rxd_d1; - - assign debug = rx_state; - -endmodule // simple_gemac_rx diff --git a/fpga/usrp3/lib/simple_gemac/simple_gemac_tb.v b/fpga/usrp3/lib/simple_gemac/simple_gemac_tb.v deleted file mode 100644 index 9f4f19e6d..000000000 --- a/fpga/usrp3/lib/simple_gemac/simple_gemac_tb.v +++ /dev/null @@ -1,205 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - - -module simple_gemac_tb; -`include "eth_tasks.v" - - reg clk = 0; - reg reset = 1; - - initial #1000 reset = 0; - always #50 clk = ~clk; - - wire GMII_RX_DV, GMII_RX_ER, GMII_TX_EN, GMII_TX_ER, GMII_GTX_CLK; - wire [7:0] GMII_RXD, GMII_TXD; - - wire rx_valid, rx_error, rx_ack; - wire tx_ack, tx_valid, tx_error; - - wire [7:0] rx_data, tx_data; - - reg [15:0] pause_time; - reg pause_req = 0; - - wire GMII_RX_CLK = GMII_GTX_CLK; - - reg [7:0] FORCE_DAT_ERR = 0; - reg FORCE_ERR = 0; - - // Loopback - assign GMII_RX_DV = GMII_TX_EN; - assign GMII_RX_ER = GMII_TX_ER | FORCE_ERR; - assign GMII_RXD = GMII_TXD ^ FORCE_DAT_ERR; - - wire [47:0] ucast_addr = 48'hF1F2_F3F4_F5F6; - wire [47:0] mcast_addr = 0; - wire pass_ucast =1, pass_mcast=0, pass_bcast=1, pass_pause=0, pass_all=0; - - simple_gemac simple_gemac - (.clk125(clk), .reset(reset), - .GMII_GTX_CLK(GMII_GTX_CLK), .GMII_TX_EN(GMII_TX_EN), - .GMII_TX_ER(GMII_TX_ER), .GMII_TXD(GMII_TXD), - .GMII_RX_CLK(GMII_RX_CLK), .GMII_RX_DV(GMII_RX_DV), - .GMII_RX_ER(GMII_RX_ER), .GMII_RXD(GMII_RXD), - .pause_req(pause_req), .pause_time(pause_time), .pause_en(1), - .ucast_addr(ucast_addr), .mcast_addr(mcast_addr), - .pass_ucast(pass_ucast), .pass_mcast(pass_mcast), .pass_bcast(pass_bcast), - .pass_pause(pass_pause), .pass_all(pass_all), - .rx_clk(rx_clk), .rx_data(rx_data), - .rx_valid(rx_valid), .rx_error(rx_error), .rx_ack(rx_ack), - .tx_clk(tx_clk), .tx_data(tx_data), - .tx_valid(tx_valid), .tx_error(tx_error), .tx_ack(tx_ack) - ); - - wire rx_ll_sof, rx_ll_eof, rx_ll_src_rdy, rx_ll_dst_rdy; - wire rx_ll_sof2, rx_ll_eof2, rx_ll_src_rdy2; - reg rx_ll_dst_rdy2 = 1; - wire [7:0] rx_ll_data, rx_ll_data2; - wire rx_ll_error, rx_ll_error2; - - rxmac_to_ll8 rx_adapt - (.clk(clk), .reset(reset), .clear(0), - .rx_data(rx_data), .rx_valid(rx_valid), .rx_error(rx_error), .rx_ack(rx_ack), - .ll_data(rx_ll_data), .ll_sof(rx_ll_sof), .ll_eof(rx_ll_eof), .ll_error(rx_ll_error), - .ll_src_rdy(rx_ll_src_rdy), .ll_dst_rdy(rx_ll_dst_rdy)); - - ll8_shortfifo rx_sfifo - (.clk(clk), .reset(reset), .clear(0), - .datain(rx_ll_data), .sof_i(rx_ll_sof), .eof_i(rx_ll_eof), - .error_i(rx_ll_error), .src_rdy_i(rx_ll_src_rdy), .dst_rdy_o(rx_ll_dst_rdy), - .dataout(rx_ll_data2), .sof_o(rx_ll_sof2), .eof_o(rx_ll_eof2), - .error_o(rx_ll_error2), .src_rdy_o(rx_ll_src_rdy2), .dst_rdy_i(rx_ll_dst_rdy2)); - - wire tx_ll_sof, tx_ll_eof, tx_ll_src_rdy, tx_ll_dst_rdy; - reg tx_ll_sof2=0, tx_ll_eof2=0; - reg tx_ll_src_rdy2 = 0; - wire tx_ll_dst_rdy2; - wire [7:0] tx_ll_data; - reg [7:0] tx_ll_data2 = 0; - wire tx_ll_error; - wire tx_ll_error2 = 0; - - ll8_shortfifo tx_sfifo - (.clk(clk), .reset(reset), .clear(clear), - .datain(tx_ll_data2), .sof_i(tx_ll_sof2), .eof_i(tx_ll_eof2), - .error_i(tx_ll_error2), .src_rdy_i(tx_ll_src_rdy2), .dst_rdy_o(tx_ll_dst_rdy2), - .dataout(tx_ll_data), .sof_o(tx_ll_sof), .eof_o(tx_ll_eof), - .error_o(tx_ll_error), .src_rdy_o(tx_ll_src_rdy), .dst_rdy_i(tx_ll_dst_rdy)); - - ll8_to_txmac ll8_to_txmac - (.clk(clk), .reset(reset), .clear(clear), - .ll_data(tx_ll_data), .ll_sof(tx_ll_sof), .ll_eof(tx_ll_eof), - .ll_src_rdy(tx_ll_src_rdy), .ll_dst_rdy(tx_ll_dst_rdy), - .tx_data(tx_data), .tx_valid(tx_valid), .tx_error(tx_error), .tx_ack(tx_ack)); - - initial $dumpfile("simple_gemac_tb.vcd"); - initial $dumpvars(0,simple_gemac_tb); - - integer i; - reg [7:0] pkt_rom[0:65535]; - reg [1023:0] ROMFile; - - initial - for (i=0;i<65536;i=i+1) - pkt_rom[i] <= 8'h0; - - initial - begin - @(negedge reset); - repeat (10) - @(posedge clk); - SendFlowCtrl(16'h0007); // Send flow control - @(posedge clk); - #30000; - @(posedge clk); - SendFlowCtrl(16'h0009); // Increas flow control before it expires - #10000; - @(posedge clk); - SendFlowCtrl(16'h0000); // Cancel flow control before it expires - @(posedge clk); - - SendPacket_to_ll8(8'hAA,10); // This packet gets dropped by the filters - repeat (10) - @(posedge clk); - - SendPacketFromFile_ll8(60,0,0); // The rest are valid packets - repeat (10) - @(posedge clk); - - SendPacketFromFile_ll8(61,0,0); - repeat (10) - @(posedge clk); - SendPacketFromFile_ll8(62,0,0); - repeat (10) - @(posedge clk); - SendPacketFromFile_ll8(63,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_ll8(64,0,0); - repeat (10) - @(posedge clk); - SendPacketFromFile_ll8(59,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_ll8(58,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_ll8(100,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_ll8(200,150,30); // waiting 14 empties the fifo, 15 underruns - repeat (1) - @(posedge clk); - SendPacketFromFile_ll8(100,0,30); - #10000 $finish; - end - - // Force a CRC error - initial - begin - #90000; - @(posedge clk); - FORCE_DAT_ERR <= 8'h10; - @(posedge clk); - FORCE_DAT_ERR <= 8'h00; - end - - // Force an RX_ER error (i.e. link loss) - initial - begin - #116000; - @(posedge clk); - FORCE_ERR <= 1; - @(posedge clk); - FORCE_ERR <= 0; - end - - // Cause receive fifo to fill, causing an RX overrun - initial - begin - #126000; - @(posedge clk); - rx_ll_dst_rdy2 <= 0; - repeat (30) // Repeat of 14 fills the shortfifo, but works. 15 overflows - @(posedge clk); - rx_ll_dst_rdy2 <= 1; - end - - // Tests: Send and recv flow control, send and receive good packets, RX CRC err, RX_ER, RX overrun, TX underrun - // Still need to test: CRC errors on Pause Frames - - always @(posedge clk) - if(rx_ll_src_rdy2 & rx_ll_dst_rdy2) - begin - if(rx_ll_sof2 & ~rx_ll_eof2) - $display("RX-PKT-START %d",$time); - $display("RX-PKT SOF %d EOF %d ERR%d DAT %x",rx_ll_sof2,rx_ll_eof2,rx_ll_error2,rx_ll_data2); - if(rx_ll_eof2 & ~rx_ll_sof2) - $display("RX-PKT-END %d",$time); - end - -endmodule // simple_gemac_tb diff --git a/fpga/usrp3/lib/simple_gemac/simple_gemac_tx.v b/fpga/usrp3/lib/simple_gemac/simple_gemac_tx.v deleted file mode 100644 index 923587baa..000000000 --- a/fpga/usrp3/lib/simple_gemac/simple_gemac_tx.v +++ /dev/null @@ -1,259 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - -module simple_gemac_tx - (input clk125, input reset, - output GMII_GTX_CLK, output reg GMII_TX_EN, output reg GMII_TX_ER, output reg [7:0] GMII_TXD, - output tx_clk, input [7:0] tx_data, input tx_valid, input tx_error, output tx_ack, - input [7:0] ifg, input [47:0] mac_addr, - input pause_req, input [15:0] pause_time, - input pause_apply, output reg paused - ); - - reg tx_en_pre, tx_er_pre; - reg [7:0] txd_pre; - - assign GMII_GTX_CLK = clk125; - assign tx_clk = clk125; - - reg [7:0] tx_state; - reg [7:0] ifg_ctr; - reg [15:0] frame_len_ctr; - reg [7:0] pause_ctr, pause_dat; - - wire in_ifg = (ifg_ctr != 0); - - wire [31:0] crc_out; - - localparam TX_IDLE = 0; - localparam TX_PREAMBLE = 1; - localparam TX_SOF_DEL = TX_PREAMBLE + 7; - localparam TX_FIRSTBYTE = TX_SOF_DEL + 1; - localparam TX_IN_FRAME = TX_FIRSTBYTE + 1; - localparam TX_IN_FRAME_2 = TX_IN_FRAME + 1; - localparam TX_PAD = TX_IN_FRAME_2 + 1; - localparam TX_CRC_0 = 16; - localparam TX_CRC_1 = TX_CRC_0 + 1; - localparam TX_CRC_2 = TX_CRC_0 + 2; - localparam TX_CRC_3 = TX_CRC_0 + 3; - localparam TX_ERROR = 32; - localparam TX_PAUSE = 55; - localparam TX_PAUSE_SOF = TX_PAUSE + 7; - localparam TX_PAUSE_FIRST = TX_PAUSE_SOF + 1; - localparam TX_PAUSE_END = TX_PAUSE_SOF + 18; - - localparam MIN_FRAME_LEN = 64 + 8 - 4; // Min frame length includes preamble but not CRC - localparam MAX_FRAME_LEN = 8192; // How big are the jumbo frames we want to handle? - always @(posedge tx_clk) - if(reset |(tx_state == TX_IDLE)) - frame_len_ctr <= 0; - else - frame_len_ctr <= frame_len_ctr + 1; - - reg send_pause; - reg [15:0] pause_time_held; - - always @(posedge tx_clk) - if(reset) - send_pause <= 0; - else if(pause_req) - send_pause <= 1; - else if(tx_state == TX_PAUSE) - send_pause <= 0; - - always @(posedge tx_clk) - if(pause_req) - pause_time_held <= pause_time; - - always @(posedge tx_clk) - if(reset) - tx_state <= TX_IDLE; - else - case(tx_state) - TX_IDLE : - if(~in_ifg) - if(send_pause) - tx_state <= TX_PAUSE; - else if(tx_valid & ~pause_apply) - tx_state <= TX_PREAMBLE; - TX_FIRSTBYTE : - if(tx_error) - tx_state <= TX_ERROR; // underrun - else if(~tx_valid) - tx_state <= TX_PAD; - else - tx_state <= TX_IN_FRAME; - TX_IN_FRAME : - if(tx_error) - tx_state <= TX_ERROR; // underrun - else if(~tx_valid) - tx_state <= TX_PAD; - else if(frame_len_ctr == MIN_FRAME_LEN - 1) - tx_state <= TX_IN_FRAME_2; - TX_IN_FRAME_2 : - if(tx_error) - tx_state <= TX_ERROR; // underrun - else if(~tx_valid) - tx_state <= TX_CRC_0; - TX_PAD : - if(frame_len_ctr == MIN_FRAME_LEN) - tx_state <= TX_CRC_0; - TX_CRC_3 : - tx_state <= TX_IDLE; - TX_ERROR : - tx_state <= TX_IDLE; - TX_PAUSE_END : - tx_state <= TX_PAD; - default : - tx_state <= tx_state + 1; - endcase // case (tx_state) - - always @(posedge tx_clk) - if(reset) - begin - tx_en_pre <= 0; - tx_er_pre <= 0; - txd_pre <= 0; - end - else - casex(tx_state) - TX_IDLE : - begin - tx_en_pre <= 0; - tx_er_pre <= 0; - txd_pre <= 0; - end - TX_PREAMBLE, TX_PAUSE : - begin - txd_pre <= 8'h55; - tx_en_pre <= 1; - end - TX_SOF_DEL, TX_PAUSE_SOF : - txd_pre <= 8'hD5; - TX_FIRSTBYTE, TX_IN_FRAME, TX_IN_FRAME_2 : - txd_pre <= tx_valid ? tx_data : 0; - TX_ERROR : - begin - tx_er_pre <= 1; - txd_pre <= 0; - end - TX_CRC_3 : - tx_en_pre <= 0; - TX_PAD : - txd_pre <= 0; - TX_PAUSE_FIRST, 8'b01xx_xxxx : // In Pause Frame - txd_pre <= pause_dat; - endcase // case (tx_state) - - localparam SGE_FLOW_CTRL_ADDR = 48'h01_80_C2_00_00_01; - always @(posedge tx_clk) - case(tx_state) - TX_PAUSE_SOF : - pause_dat <= SGE_FLOW_CTRL_ADDR[47:40]; // Note everything must be 1 cycle early - TX_PAUSE_SOF + 1: - pause_dat <= SGE_FLOW_CTRL_ADDR[39:32]; - TX_PAUSE_SOF + 2: - pause_dat <= SGE_FLOW_CTRL_ADDR[31:24]; - TX_PAUSE_SOF + 3: - pause_dat <= SGE_FLOW_CTRL_ADDR[23:16]; - TX_PAUSE_SOF + 4: - pause_dat <= SGE_FLOW_CTRL_ADDR[15:8]; - TX_PAUSE_SOF + 5: - pause_dat <= SGE_FLOW_CTRL_ADDR[7:0]; - TX_PAUSE_SOF + 6: - pause_dat <= mac_addr[47:40]; - TX_PAUSE_SOF + 7: - pause_dat <= mac_addr[39:32]; - TX_PAUSE_SOF + 8: - pause_dat <= mac_addr[31:24]; - TX_PAUSE_SOF + 9: - pause_dat <= mac_addr[23:16]; - TX_PAUSE_SOF + 10: - pause_dat <= mac_addr[15:8]; - TX_PAUSE_SOF + 11: - pause_dat <= mac_addr[7:0]; - TX_PAUSE_SOF + 12: - pause_dat <= 8'h88; // Type = 8808 = MAC ctrl frame - TX_PAUSE_SOF + 13: - pause_dat <= 8'h08; - TX_PAUSE_SOF + 14: - pause_dat <= 8'h00; // Opcode = 0001 = PAUSE - TX_PAUSE_SOF + 15: - pause_dat <= 8'h01; - TX_PAUSE_SOF + 16: - pause_dat <= pause_time_held[15:8]; - TX_PAUSE_SOF + 17: - pause_dat <= pause_time_held[7:0]; - endcase // case (tx_state) - - wire start_ifg = (tx_state == TX_CRC_3); - always @(posedge tx_clk) - if(reset) - ifg_ctr <= 100; - else if(start_ifg) - ifg_ctr <= ifg; - else if(ifg_ctr != 0) - ifg_ctr <= ifg_ctr - 1; - - wire clear_crc = (tx_state == TX_IDLE); - - wire calc_crc = - (tx_state==TX_IN_FRAME) | - (tx_state==TX_IN_FRAME_2) | - (tx_state==TX_PAD) | - (tx_state[6]); - - crc crc(.clk(tx_clk), .reset(reset), .clear(clear_crc), - .data(txd_pre), .calc(calc_crc), .crc_out(crc_out)); - - assign tx_ack = (tx_state == TX_FIRSTBYTE); - - always @(posedge tx_clk) - begin - GMII_TX_EN <= tx_en_pre; - GMII_TX_ER <= tx_er_pre; - case(tx_state) - TX_CRC_0 : - GMII_TXD <= crc_out[31:24]; - TX_CRC_1 : - GMII_TXD <= crc_out[23:16]; - TX_CRC_2 : - GMII_TXD <= crc_out[15:8]; - TX_CRC_3 : - GMII_TXD <= crc_out[7:0]; - default : - GMII_TXD <= txd_pre; - endcase // case (tx_state) - end - - // report that we are paused only when we get back to IDLE - always @(posedge tx_clk) - if(reset) - paused <= 0; - else if(~pause_apply) - paused <= 0; - else if(tx_state == TX_IDLE) - paused <= 1; - -endmodule // simple_gemac_tx - -// Testing code -/* - reg [7:0] crc_ctr; - reg calc_crc_d1; - always @(posedge tx_clk) - calc_crc_d1 <= calc_crc; - - always @(posedge tx_clk) - if(reset) - crc_ctr <= 0; - else if(calc_crc) - crc_ctr <= crc_ctr+1; - else if(calc_crc_d1) - $display("CRC COUNT = %d",crc_ctr); - else - crc_ctr <= 0; -*/ diff --git a/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper.build b/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper.build deleted file mode 100755 index 14e8500b3..000000000 --- a/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper.build +++ /dev/null @@ -1 +0,0 @@ -iverilog -Wimplict -Wportbind -y ../fifo/ -y ../models/ -y . -y miim -y ../control -y ../coregen/ -y ../control_lib/ -o simple_gemac_wrapper_tb simple_gemac_wrapper_tb.v diff --git a/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper.v b/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper.v deleted file mode 100644 index 47fe37b8e..000000000 --- a/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper.v +++ /dev/null @@ -1,182 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - -module simple_gemac_wrapper - #(parameter RX_FLOW_CTRL=0, - parameter PORTNUM=8'd0) - (input clk125, input reset, - // GMII - output GMII_GTX_CLK, output GMII_TX_EN, output GMII_TX_ER, output [7:0] GMII_TXD, - input GMII_RX_CLK, input GMII_RX_DV, input GMII_RX_ER, input [7:0] GMII_RXD, - - // Client FIFO Interfaces - input sys_clk, - output [63:0] rx_tdata, output [3:0] rx_tuser, output rx_tlast, output rx_tvalid, input rx_tready, - input [63:0] tx_tdata, input [3:0] tx_tuser, input tx_tlast, input tx_tvalid, output tx_tready, - - - // Wishbone Bus - input wb_clk_i, - input wb_rst_i, - input [7:0] wb_adr_i, - input [31:0] wb_dat_i, - input wb_we_i, - input wb_stb_i, - input wb_cyc_i, - output [31:0] wb_dat_o, - output wb_ack_o, - output wb_int_o, - - // MDIO - output mdc, - input mdio_out, - output mdio_tri, - output mdio_in, - - // Debug - output [31:0] debug_rx, - output [31:0] debug_tx -); - - wire clear = 0; - wire [7:0] rx_data, tx_data; - wire tx_clk, tx_valid, tx_error, tx_ack; - wire rx_clk, rx_valid, rx_error, rx_ack; - - wire pause_req; - wire pause_request_en, pause_respect_en; - wire [15:0] pause_time, pause_thresh, pause_time_req, rx_fifo_space; - - wire [31:0] debug_state; - - wire tx_reset, rx_reset; - reset_sync reset_sync_tx (.clk(tx_clk),.reset_in(reset),.reset_out(tx_reset)); - reset_sync reset_sync_rx (.clk(rx_clk),.reset_in(reset),.reset_out(rx_reset)); - - simple_gemac simple_gemac - (.clk125(clk125), .reset(reset), - .GMII_GTX_CLK(GMII_GTX_CLK), .GMII_TX_EN(GMII_TX_EN), - .GMII_TX_ER(GMII_TX_ER), .GMII_TXD(GMII_TXD), - .GMII_RX_CLK(GMII_RX_CLK), .GMII_RX_DV(GMII_RX_DV), - .GMII_RX_ER(GMII_RX_ER), .GMII_RXD(GMII_RXD), - .pause_req(RX_FLOW_CTRL ? pause_req : 1'b0), .pause_time_req(RX_FLOW_CTRL ? pause_time_req : 16'd0), - .pause_respect_en(pause_respect_en), - .ucast_addr(48'h0), .mcast_addr(48'h0), - .pass_ucast(1'b0), .pass_mcast(1'b0), .pass_bcast(1'b0), - .pass_pause(1'b0), .pass_all(1'b1), - .rx_clk(rx_clk), .rx_data(rx_data), - .rx_valid(rx_valid), .rx_error(rx_error), .rx_ack(rx_ack), - .tx_clk(tx_clk), .tx_data(tx_data), - .tx_valid(tx_valid), .tx_error(tx_error), .tx_ack(tx_ack), - .debug(debug_state) - ); - - assign pause_respect_en = 1'b0; - assign pause_request_en = 1'b0; - - // ///////////////////////////////////////////////////////////////////////////////////// - // RX FIFO Chain - wire rx_ll_eof, rx_ll_error, rx_ll_src_rdy, rx_ll_dst_rdy; - wire [7:0] rx_ll_data; - - wire [63:0] rx_tdata_int; - wire [3:0] rx_tuser_int; - wire rx_tlast_int, rx_tvalid_int, rx_tready_int; - - rxmac_to_ll8 rxmac_to_ll8 - (.clk(rx_clk), .reset(rx_reset), .clear(0), - .rx_data(rx_data), .rx_valid(rx_valid), .rx_error(rx_error), .rx_ack(rx_ack), - .ll_data(rx_ll_data), .ll_sof(), .ll_eof(rx_ll_eof), .ll_error(rx_ll_error), // ignore sof - .ll_src_rdy(rx_ll_src_rdy), .ll_dst_rdy(rx_ll_dst_rdy)); - - ll8_to_axi64 #(.START_BYTE(6), .LABEL(PORTNUM)) ll8_to_axi64 - (.clk(rx_clk), .reset(rx_reset), .clear(0), - .ll_data(rx_ll_data), .ll_eof(rx_ll_eof), .ll_error(rx_ll_error), .ll_src_rdy(rx_ll_src_rdy), .ll_dst_rdy(rx_ll_dst_rdy), - .axi64_tdata(rx_tdata_int), .axi64_tlast(rx_tlast_int), .axi64_tuser(rx_tuser_int), - .axi64_tvalid(rx_tvalid_int), .axi64_tready(rx_tready_int)); - - axi64_8k_2clk_fifo rxfifo_2clk - (.s_aresetn(~rx_reset), - .s_aclk(rx_clk), .s_axis_tvalid(rx_tvalid_int), .s_axis_tready(rx_tready_int), - .s_axis_tdata(rx_tdata_int), .s_axis_tlast(rx_tlast_int), .s_axis_tuser(rx_tuser_int), - .axis_wr_data_count(), - - .m_aclk(sys_clk), .m_axis_tvalid(rx_tvalid), .m_axis_tready(rx_tready), - .m_axis_tdata(rx_tdata), .m_axis_tlast(rx_tlast), .m_axis_tuser(rx_tuser), - .axis_rd_data_count() ); - - // ///////////////////////////////////////////////////////////////////////////////////// - // TX FIFO Chain - wire tx_ll_eof, tx_ll_src_rdy, tx_ll_dst_rdy; - wire [7:0] tx_ll_data; - - wire [63:0] tx_tdata_int; - wire [3:0] tx_tuser_int; - wire tx_tlast_int, tx_tvalid_int, tx_tready_int; - - axi64_8k_2clk_fifo txfifo_2clk - (.s_aresetn(~tx_reset), - .s_aclk(sys_clk), .s_axis_tvalid(tx_tvalid), .s_axis_tready(tx_tready), - .s_axis_tdata(tx_tdata), .s_axis_tlast(tx_tlast), .s_axis_tuser(tx_tuser), - .axis_wr_data_count(), - - .m_aclk(tx_clk), .m_axis_tvalid(tx_tvalid_int), .m_axis_tready(tx_tready_int), - .m_axis_tdata(tx_tdata_int), .m_axis_tlast(tx_tlast_int), .m_axis_tuser(tx_tuser_int), - .axis_rd_data_count() ); - - axi64_to_ll8 #(.START_BYTE(6)) axi64_to_ll8 - (.clk(tx_clk), .reset(tx_reset), .clear(0), - .axi64_tdata(tx_tdata_int), .axi64_tlast(tx_tlast_int), .axi64_tuser(tx_tuser_int), - .axi64_tvalid(tx_tvalid_int), .axi64_tready(tx_tready_int), - .ll_data(tx_ll_data), .ll_eof(tx_ll_eof), .ll_src_rdy(tx_ll_src_rdy), .ll_dst_rdy(tx_ll_dst_rdy)); - - ll8_to_txmac ll8_to_txmac - (.clk(tx_clk), .reset(tx_reset), .clear(clear), - .ll_data(tx_ll_data), .ll_eof(tx_ll_eof), .ll_src_rdy(tx_ll_src_rdy), .ll_dst_rdy(tx_ll_dst_rdy), - .tx_data(tx_data), .tx_valid(tx_valid), .tx_error(tx_error), .tx_ack(tx_ack)); - - // ///////////////////////////////////////////////////////////////////////////////////// - // Flow Control - generate - if(RX_FLOW_CTRL==1) - flow_ctrl_rx flow_ctrl_rx - (.pause_request_en(pause_request_en), .pause_time(pause_time), .pause_thresh(pause_thresh), - .rx_clk(rx_clk), .rx_reset(rx_reset), .rx_fifo_space(rx_fifo_space), - .tx_clk(tx_clk), .tx_reset(tx_reset), .pause_req(pause_req), .pause_time_req(pause_time_req)); - endgenerate - - assign debug_tx = { { tx_ll_data }, - { 1'b0, tx_ll_eof, tx_ll_src_rdy, tx_ll_dst_rdy, 4'b0 }, - { tx_valid, tx_error, tx_ack, 5'b0}, - { tx_data} }; - assign debug_rx = { { rx_ll_data }, - { rx_ll_error, rx_ll_eof, rx_ll_src_rdy, rx_ll_dst_rdy, 4'b0 }, - { rx_valid, rx_error, rx_ack, 5'b0}, - { rx_data} }; - - // - // Wishbone MDIO controller - // - mdio mdio_gige_inst - ( - .wb_clk_i(wb_clk_i), - .wb_rst_i(wb_rst_i), - .wb_adr_i(wb_adr_i), - .wb_dat_i(wb_dat_i), - .wb_we_i(wb_we_i), - .wb_stb_i(wb_stb_i), - .wb_cyc_i(wb_cyc_i), - .wb_dat_o(wb_dat_o), - .wb_ack_o(wb_ack_o), - .wb_int_o(wb_int_o), - .mdc(mdc), - .mdio_out(mdio_in), // Switch sense of in and out here for master and slave. - .mdio_tri(mdio_tri), - .mdio_in(mdio_out) // Switch sense of in and out here for master and slave. - ); - -endmodule // simple_gemac_wrapper - diff --git a/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper_tb.v b/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper_tb.v deleted file mode 100644 index 2b9f38772..000000000 --- a/fpga/usrp3/lib/simple_gemac/simple_gemac_wrapper_tb.v +++ /dev/null @@ -1,210 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// - - - - -module simple_gemac_wrapper_tb; -`include "eth_tasks_f36.v" - - reg reset = 1; - initial #1000 reset = 0; - wire wb_rst = reset; - - reg eth_clk = 0; - always #50 eth_clk = ~eth_clk; - - reg wb_clk = 0; - always #173 wb_clk = ~wb_clk; - - reg sys_clk = 0; - always #77 sys_clk = ~ sys_clk; - - wire GMII_RX_DV, GMII_RX_ER, GMII_TX_EN, GMII_TX_ER, GMII_GTX_CLK; - wire [7:0] GMII_RXD, GMII_TXD; - - wire rx_valid, rx_error, rx_ack; - wire tx_ack, tx_valid, tx_error; - - wire [7:0] rx_data, tx_data; - - wire GMII_RX_CLK = GMII_GTX_CLK; - - reg [7:0] FORCE_DAT_ERR = 0; - reg FORCE_ERR = 0; - - // Loopback - assign GMII_RX_DV = GMII_TX_EN; - assign GMII_RX_ER = GMII_TX_ER | FORCE_ERR; - assign GMII_RXD = GMII_TXD ^ FORCE_DAT_ERR; - - - wire [31:0] wb_dat_o; - reg [31:0] wb_dat_i; - reg [7:0] wb_adr; - reg wb_stb=0, wb_cyc=0, wb_we=0; - wire wb_ack; - - reg [35:0] tx_f36_data=0; - reg tx_f36_src_rdy = 0; - wire tx_f36_dst_rdy; - wire [35:0] rx_f36_data; - wire rx_f36_src_rdy; - wire rx_f36_dst_rdy = 1; - - simple_gemac_wrapper simple_gemac_wrapper - (.clk125(eth_clk), .reset(reset), - .GMII_GTX_CLK(GMII_GTX_CLK), .GMII_TX_EN(GMII_TX_EN), - .GMII_TX_ER(GMII_TX_ER), .GMII_TXD(GMII_TXD), - .GMII_RX_CLK(GMII_RX_CLK), .GMII_RX_DV(GMII_RX_DV), - .GMII_RX_ER(GMII_RX_ER), .GMII_RXD(GMII_RXD), - - .sys_clk(sys_clk), .rx_f36_data(rx_f36_data), .rx_f36_src_rdy(rx_f36_src_rdy), .rx_f36_dst_rdy(rx_f36_dst_rdy), - .tx_f36_data(tx_f36_data), .tx_f36_src_rdy(tx_f36_src_rdy), .tx_f36_dst_rdy(tx_f36_dst_rdy), - - .wb_clk(wb_clk), .wb_rst(wb_rst), .wb_stb(wb_stb), .wb_cyc(wb_cyc), .wb_ack(wb_ack), .wb_we(wb_we), - .wb_adr(wb_adr), .wb_dat_i(wb_dat_i), .wb_dat_o(wb_dat_o), - - .mdio(), .mdc(), - .debug() ); - - initial $dumpfile("simple_gemac_wrapper_tb.vcd"); - initial $dumpvars(0,simple_gemac_wrapper_tb); - - integer i; - reg [7:0] pkt_rom[0:65535]; - reg [1023:0] ROMFile; - - initial - for (i=0;i<65536;i=i+1) - pkt_rom[i] <= 8'h0; - - initial - begin - @(negedge reset); - repeat (10) - @(posedge wb_clk); - WishboneWR(0,6'b111101); - WishboneWR(4,16'hA0B0); - WishboneWR(8,32'hC0D0_A1B1); - WishboneWR(12,16'h0000); - WishboneWR(16,32'h0000_0000); - - @(posedge eth_clk); - SendFlowCtrl(16'h0007); // Send flow control - @(posedge eth_clk); - #30000; - @(posedge eth_clk); - SendFlowCtrl(16'h0009); // Increase flow control before it expires - #10000; - @(posedge eth_clk); - SendFlowCtrl(16'h0000); // Cancel flow control before it expires - @(posedge eth_clk); - - repeat (1000) - @(posedge sys_clk); - SendPacket_to_fifo36(32'hA0B0C0D0,10); // This packet gets dropped by the filters - repeat (1000) - @(posedge sys_clk); - - SendPacket_to_fifo36(32'hAABBCCDD,100); // This packet gets dropped by the filters - repeat (10) - @(posedge sys_clk); -/* - SendPacketFromFile_f36(60,0,0); // The rest are valid packets - repeat (10) - @(posedge clk); - - SendPacketFromFile_f36(61,0,0); - repeat (10) - @(posedge clk); - SendPacketFromFile_f36(62,0,0); - repeat (10) - @(posedge clk); - SendPacketFromFile_f36(63,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_f36(64,0,0); - repeat (10) - @(posedge clk); - SendPacketFromFile_f36(59,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_f36(58,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_f36(100,0,0); - repeat (1) - @(posedge clk); - SendPacketFromFile_f36(200,150,30); // waiting 14 empties the fifo, 15 underruns - repeat (1) - @(posedge clk); - SendPacketFromFile_f36(100,0,30); - */ - #100000 $finish; - end - - // Force a CRC error - initial - begin - #90000; - @(posedge eth_clk); - FORCE_DAT_ERR <= 8'h10; - @(posedge eth_clk); - FORCE_DAT_ERR <= 8'h00; - end - - // Force an RX_ER error (i.e. link loss) - initial - begin - #116000; - @(posedge eth_clk); - FORCE_ERR <= 1; - @(posedge eth_clk); - FORCE_ERR <= 0; - end -/* - // Cause receive fifo to fill, causing an RX overrun - initial - begin - #126000; - @(posedge clk); - rx_ll_dst_rdy2 <= 0; - repeat (30) // Repeat of 14 fills the shortfifo, but works. 15 overflows - @(posedge clk); - rx_ll_dst_rdy2 <= 1; - end - */ - // Tests: Send and recv flow control, send and receive good packets, RX CRC err, RX_ER, RX overrun, TX underrun - // Still need to test: CRC errors on Pause Frames, MDIO, wishbone - - task WishboneWR; - input [7:0] adr; - input [31:0] value; - begin - wb_adr <= adr; - wb_dat_i <= value; - wb_stb <= 1; - wb_cyc <= 1; - wb_we <= 1; - while (~wb_ack) - @(posedge wb_clk); - @(posedge wb_clk); - wb_stb <= 0; - wb_cyc <= 0; - wb_we <= 0; - end - endtask // WishboneWR - /* - always @(posedge clk) - if(rx_ll_src_rdy2 & rx_ll_dst_rdy2) - begin - if(rx_ll_sof2 & ~rx_ll_eof2) - $display("RX-PKT-START %d",$time); - $display("RX-PKT SOF %d EOF %d ERR%d DAT %x",rx_ll_sof2,rx_ll_eof2,rx_ll_error2,rx_ll_data2); - if(rx_ll_eof2 & ~rx_ll_sof2) - $display("RX-PKT-END %d",$time); - end - */ -endmodule // simple_gemac_wrapper_tb diff --git a/fpga/usrp3/lib/simple_gemac/test_packet.mem b/fpga/usrp3/lib/simple_gemac/test_packet.mem deleted file mode 100644 index 7f41d3e42..000000000 --- a/fpga/usrp3/lib/simple_gemac/test_packet.mem +++ /dev/null @@ -1,66 +0,0 @@ -ff -ff -ff -ff -ff -ff -08 -00 -07 -5c -2e -e4 -08 -06 -00 -01 -08 -04 -06 -02 -00 -01 -08 -00 -07 -5c -2e -e4 -03 -64 -00 -00 -00 -00 -00 -00 -02 -64 -00 -3a -f3 -5c -4f -12 -01 -10 -00 -01 -00 -00 -00 -00 -00 -00 -20 -41 -42 -41 -08 -00 -AA -BB -CC -DD -EE -FF |