diff options
Diffstat (limited to 'fpga/usrp3/lib/axi')
-rw-r--r-- | fpga/usrp3/lib/axi/Makefile.srcs | 17 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_chdr_header_trigger.v | 40 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_chdr_test_pattern.v | 314 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_defs.v | 34 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_dma_master.v | 538 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_dma_master_tb.v | 165 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_dram_fifo.v | 816 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_dram_fifo_tb.v | 421 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_embed_tlast.v | 128 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_extract_tlast.v | 149 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_fast_extract_tlast.v | 187 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_fast_fifo.v | 102 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi/axi_lite_slave.v | 42 |
13 files changed, 0 insertions, 2953 deletions
diff --git a/fpga/usrp3/lib/axi/Makefile.srcs b/fpga/usrp3/lib/axi/Makefile.srcs deleted file mode 100644 index 26d2e0fee..000000000 --- a/fpga/usrp3/lib/axi/Makefile.srcs +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright 2012-2013 Ettus Research LLC -# - -################################################## -# FIFO Sources -################################################## -AXI_SRCS = $(abspath $(addprefix $(BASE_DIR)/../lib/axi/, \ -axi_dma_master.v \ -axi_dram_fifo.v \ -axi_embed_tlast.v \ -axi_extract_tlast.v \ -axi_chdr_test_pattern.v \ -axi_fast_fifo.v \ -axi_fast_extract_tlast.v \ -axi_chdr_header_trigger.v \ -)) diff --git a/fpga/usrp3/lib/axi/axi_chdr_header_trigger.v b/fpga/usrp3/lib/axi/axi_chdr_header_trigger.v deleted file mode 100644 index e8dee3675..000000000 --- a/fpga/usrp3/lib/axi/axi_chdr_header_trigger.v +++ /dev/null @@ -1,40 +0,0 @@ - -// Copyright 2014 Ettus Research LLC - - -module axi_chdr_header_trigger - #( - parameter WIDTH=64, - parameter SID=0 - ) - (input clk, input reset, input clear, - input [WIDTH-1:0] i_tdata, input i_tlast, input i_tvalid, input i_tready, - output trigger - ); - - - reg state; - localparam IDLE = 0; - localparam RUN = 1; - - - always @(posedge clk) - if(reset | clear) - state <= IDLE; - else - case (state) - IDLE : - if(i_tvalid && i_tready) - state <= RUN; - - RUN : - if(i_tready && i_tvalid && i_tlast) - state <= IDLE; - - default : - state <= IDLE; - endcase // case (state) - - assign trigger = i_tvalid && i_tready && (state == IDLE) && (i_tdata[15:0] != SID); - -endmodule // axi_chdr_header_trigger diff --git a/fpga/usrp3/lib/axi/axi_chdr_test_pattern.v b/fpga/usrp3/lib/axi/axi_chdr_test_pattern.v deleted file mode 100644 index 7d25f3008..000000000 --- a/fpga/usrp3/lib/axi/axi_chdr_test_pattern.v +++ /dev/null @@ -1,314 +0,0 @@ -// -// Synthesizable test pattern generators and checkers -// for CHDR that can be used to test transparent blocks -// (FIFOs, switches, etc) -// - -//`define MTU 8192 -`define MTU 1536 - -module axi_chdr_test_pattern - ( - input clk, - input reset, - - // - // CHDR friendly AXI stream input - // - output reg [63:0] i_tdata, - output reg i_tlast, - output reg i_tvalid, - input wire i_tready, - // - // CHDR friendly AXI Stream output - // - input wire [63:0] o_tdata, - input wire o_tlast, - input wire o_tvalid, - output reg o_tready, - // - // Test flags - // - input start, - input [15:0] control, - output reg fail, - output reg done - ); - - wire [7:0] bist_rx_delay = control[7:0]; - wire [7:0] bist_tx_delay = control[15:8]; - - - reg [15:0] tx_count, rx_count; - reg [15:0] tx_data, rx_data; - reg [7:0] tx_delay, rx_delay; - - - localparam TX_IDLE = 0; - localparam TX_START = 1; - localparam TX_ACTIVE = 2; - localparam TX_GAP = 3; - localparam TX_DONE = 4; - localparam TX_WAIT = 5; - - localparam RX_IDLE = 0; - localparam RX_ACTIVE = 1; - localparam RX_FAIL = 2; - localparam RX_DONE = 3; - localparam RX_WAIT = 4; - - reg [2:0] tx_state, rx_state; - - // - // Transmitter - // - always @(posedge clk) - if (reset) - begin - tx_delay <= 0; - tx_count <= 8; - tx_data <= 0; - i_tdata <= 64'h0; - i_tlast <= 1'b0; - i_tvalid <= 1'b0; - tx_state <= TX_IDLE; - end - else - begin - case(tx_state) - TX_IDLE: begin - tx_delay <= 0; - i_tdata <= 64'h0; - i_tlast <= 1'b0; - i_tvalid <= 1'b0; - tx_data <= 0; - tx_count <= 4; - // Run whilst start asserted. - if (start) begin - tx_state <= TX_START; - // ....Go back to initialized state if start deasserted. - end else begin - tx_state <= TX_IDLE; - end - end // case: TX_IDLE - - // - // START signal is asserted. - // Now need to start transmiting a packet. - // - TX_START: begin - // At the next clock edge drive first beat of new packet onto HDR bus. - i_tlast <= 1'b0; - i_tvalid <= 1'b1; - tx_data <= tx_data + 4; - // i_tdata <= {tx_data,tx_data+16'd1,tx_data+16'd2,tx_data+16'd3}; - i_tdata <= {4{(tx_data[2]?16'hffff:16'h0000)^tx_data[15:0]}}; - tx_state <= TX_ACTIVE; - - end - - // - // Valid data is (already) being driven onto the CHDR bus. - // i_tlast may also be driven asserted if current data count has reached EOP. - // Watch i_tready to see when it's consumed. - // When packets are consumed increment data counter or transition state if - // EOP has sucsesfully concluded. - // - TX_ACTIVE: begin - i_tvalid <= 1'b1; // Always assert tvalid - if (i_tready) begin - -// i_tdata <= {tx_data,tx_data+16'd1,tx_data+16'd2,tx_data+16'd3}; - i_tdata <= {4{(tx_data[2]?16'hffff:16'h0000)^tx_data[15:0]}}; - // Will this next beat be the last in a packet? - if (tx_data == tx_count) begin - tx_data <= 0; - i_tlast <= 1'b1; - tx_state <= TX_GAP; - end else begin - tx_data <= tx_data + 4; - i_tlast <= 1'b0; - tx_state <= TX_ACTIVE; - end - end else begin - // Keep driving all CHDR bus signals as-is until i_tready is asserted. - tx_state <= TX_ACTIVE; - end - end // case: TX_ACTIVE - // - // Force an inter-packet gap between packets in a BIST sequence where tvalid is driven low. - // As we leave this state check if all packets in BIST sequence have been generated yet, - // and if so go to done state. - // - TX_GAP: begin - if (i_tready) begin - i_tvalid <= 1'b0; - i_tdata <= 64'h0; - i_tlast <= 1'b0; - tx_count <= tx_count + 4; - - if (tx_count < `MTU) begin - tx_state <= TX_WAIT; - tx_delay <= bist_tx_delay; - end else - tx_state <= TX_DONE; - end else begin // if (i_tready) - tx_state <= TX_GAP; - end - end // case: TX_GAP - // - // Simulate inter packet gap in real UHD system - TX_WAIT: begin - if (tx_delay == 0) - tx_state <= TX_START; - else begin - tx_delay <= tx_delay - 1; - tx_state <= TX_WAIT; - end - end - - // - // Complete test pattern BIST sequence has been transmitted. Sit in this - // state indefinately if START is taken low, which re-inits the whole BIST solution. - // - TX_DONE: begin - if (!start) begin - tx_state <= TX_DONE; - end else begin - tx_state <= TX_IDLE; - end - i_tvalid <= 1'b0; - i_tdata <= 64'd0; - i_tlast <= 1'b0; - - end - endcase // case (tx_state) - end - - // - // Receiver - // - always @(posedge clk) - if (reset) - begin - rx_delay <= 0; - rx_count <= 0; - rx_data <= 0; - o_tready <= 1'b0; - rx_state <= RX_IDLE; - fail <= 1'b0; - done <= 1'b0; - - end - else begin - case (rx_state) - RX_IDLE: begin - rx_delay <= 0; - o_tready <= 1'b0; - rx_data <= 0; - rx_count <= 4; - fail <= 1'b0; - done <= 1'b0; - // Not accepting data whilst Idle, - // switch to active when packet arrives - if (o_tvalid) begin - o_tready <= 1'b1; - rx_state <= RX_ACTIVE; - end else - rx_state <= RX_IDLE; - end - - RX_ACTIVE: begin - o_tready <= 1'b1; - if (o_tvalid) -// if (o_tdata != {rx_data,rx_data+16'd1,rx_data+16'd2,rx_data+16'd3}) - if (o_tdata != {4{(rx_data[2]?16'hffff:16'h0000)^rx_data[15:0]}}) - begin - $display("o_tdata: %x != expected: %x @ time: %d",o_tdata, -// {rx_data,rx_data+16'd1,rx_data+16'd2,rx_data+16'd3}, - {4{(rx_data[2]?16'hffff:16'h0000)^rx_data[15:0]}}, - $time); - rx_state <= RX_FAIL; - end - else - // Should last be asserted? - if (rx_data == rx_count) - // ...last not asserted when it should be! - if (~(o_tlast===1)) begin - $display("o_tlast not asserted when it should be @ time: %d",$time); - rx_state <= RX_FAIL; - end else begin - // End of packet, set up to RX next - rx_data <= 0; - rx_count <= rx_count + 4; - rx_delay <= bist_rx_delay; - if (rx_count == `MTU) begin - rx_state <= RX_DONE; - end else begin - rx_state <= RX_WAIT; - end - o_tready <= 1'b0; - end - else - // ...last asserted when it should not be! - if (~(o_tlast===0)) begin - $display("o_tlast asserted when it should not be @ time: %d",$time); - rx_state <= RX_FAIL; - end else begin - // Still in packet body - rx_data <= rx_data + 4; - rx_delay <= bist_rx_delay; - rx_state <= RX_WAIT; - o_tready <= 1'b0; - end - else - // Nothing to do this cycle - rx_state <= RX_ACTIVE; - end // case: RX_ACTIVE - - // To simulate the radio consuming samples at a steady rate set by the decimation - // have a programable delay here - RX_WAIT: begin - if (rx_delay == 0) begin - rx_state <= RX_ACTIVE; - o_tready <= 1'b1; - end else begin - rx_delay <= rx_delay - 1; - rx_state <= RX_WAIT; - end - end - - - RX_FAIL: begin - o_tready <= 1'b0; - done <= 1'b1; - fail <= 1'b1; - // If start is deasserted allow BIST logic to reset and rearm - if (start) - rx_state <= RX_FAIL; - else - rx_state <= RX_IDLE; - - end - - RX_DONE: begin - o_tready <= 1'b0; - done <= 1'b1; - fail <= 1'b0; - // If start is asserted allow BIST logic to reset, rearm & restart - if (!start) - rx_state <= RX_DONE; - else - rx_state <= RX_IDLE; - - end - - endcase // case (rx_state) - end - - - -endmodule - - - diff --git a/fpga/usrp3/lib/axi/axi_defs.v b/fpga/usrp3/lib/axi/axi_defs.v deleted file mode 100644 index 5162c20ba..000000000 --- a/fpga/usrp3/lib/axi/axi_defs.v +++ /dev/null @@ -1,34 +0,0 @@ -// -// AXI4 Burst enumeration -// -`define AXI4_BURST_FIXED 2'b00 -`define AXI4_BURST_INCR 2'b01 -`define AXI4_BURST_WRAP 2'b10 -`define AXI4_BURST_RSVD 2'b11 -// -// AXI4 response code enumeration -// -`define AXI4_RESP_OKAY 2'b00 -`define AXI4_RESP_EXOKAY 2'b01 -`define AXI4_RESP_SLVERR 2'b10 -`define AXI4_RESP_DECERR 2'b11 -// -// AXI4 lock enumeration -// -`define AXI4_LOCK_NORMAL 1'b0 -`define AXI4_LOCK_EXCLUSIVE 1'b1 -// -// AXI4 memory attrubutes -// -`define AXI4_CACHE_ALLOCATE 4'h8 -`define AXI4_CACHE_OTHER_ALLOCATE 4'h4 -`define AXI4_CACHE_MODIFIABLE 4'h2 -`define AXI4_CACHE_BUFFERABLE 4'h1 -// -// AXI4 PROT attributes -// -`define AXI4_PROT_PRIVILEDGED 3'h1 -`define AXI4_PROT_NON_SECURE 3'h2 -`define AXI4_PROT_INSTRUCTION 3'h4 - - diff --git a/fpga/usrp3/lib/axi/axi_dma_master.v b/fpga/usrp3/lib/axi/axi_dma_master.v deleted file mode 100644 index 8222019de..000000000 --- a/fpga/usrp3/lib/axi/axi_dma_master.v +++ /dev/null @@ -1,538 +0,0 @@ - -`include "axi_defs.v" - -`define DEBUG if (1) - -module axi_dma_master - ( - input aclk, // Global AXI clock - input areset, // Global AXI reset - // - // AXI Write address channel - // - output [0 : 0] m_axi_awid, // Write address ID. This signal is the identification tag for the write address signals - output reg [31 : 0] m_axi_awaddr, // Write address. The write address gives the address of the first transfer in a write burst - output reg [7 : 0] m_axi_awlen, // Burst length. The burst length gives the exact number of transfers in a burst. - output [2 : 0] m_axi_awsize, // Burst size. This signal indicates the size of each transfer in the burst. - output [1 : 0] m_axi_awburst, // Burst type. The burst type and the size information, determine how the address is calculated - output [0 : 0] m_axi_awlock, // Lock type. Provides additional information about the atomic characteristics of the transfer. - output [3 : 0] m_axi_awcache, // Memory type. This signal indicates how transactions are required to progress - output [2 : 0] m_axi_awprot, // Protection type. This signal indicates the privilege and security level of the transaction - output [3 : 0] m_axi_awqos, // Quality of Service, QoS. The QoS identifier sent for each write transaction - output [3 : 0] m_axi_awregion, // Region identifier. Permits a single physical interface on a slave to be re-used. - output [0 : 0] m_axi_awuser, // User signal. Optional User-defined signal in the write address channel. - output reg m_axi_awvalid, // Write address valid. This signal indicates that the channel is signaling valid write addr - input m_axi_awready, // Write address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Write data channel. - // - output [63 : 0] m_axi_wdata, // Write data - output [7 : 0] m_axi_wstrb, // Write strobes. This signal indicates which byte lanes hold valid data. - output reg m_axi_wlast, // Write last. This signal indicates the last transfer in a write burst - output [0 : 0] m_axi_wuser, // User signal. Optional User-defined signal in the write data channel. - output m_axi_wvalid, // Write valid. This signal indicates that valid write data and strobes are available. - input m_axi_wready, // Write ready. This signal indicates that the slave can accept the write data. - // - // AXI Write response channel signals - // - input [0 : 0] m_axi_bid, // Response ID tag. This signal is the ID tag of the write response. - input [1 : 0] m_axi_bresp, // Write response. This signal indicates the status of the write transaction. - input [0 : 0] m_axi_buser, // User signal. Optional User-defined signal in the write response channel. - input m_axi_bvalid, // Write response valid. This signal indicates that the channel is signaling a valid response - output reg m_axi_bready, // Response ready. This signal indicates that the master can accept a write response - // - // AXI Read address channel - // - output [0 : 0] m_axi_arid, // Read address ID. This signal is the identification tag for the read address group of signals - output reg [31 : 0] m_axi_araddr, // Read address. The read address gives the address of the first transfer in a read burst - output reg [7 : 0] m_axi_arlen, // Burst length. This signal indicates the exact number of transfers in a burst. - output [2 : 0] m_axi_arsize, // Burst size. This signal indicates the size of each transfer in the burst. - output [1 : 0] m_axi_arburst, // Burst type. The burst type and the size information determine how the address for each transfer - output [0 : 0] m_axi_arlock, // Lock type. This signal provides additional information about the atomic characteristics - output [3 : 0] m_axi_arcache, // Memory type. This signal indicates how transactions are required to progress - output [2 : 0] m_axi_arprot, // Protection type. This signal indicates the privilege and security level of the transaction - output [3 : 0] m_axi_arqos, // Quality of Service, QoS. QoS identifier sent for each read transaction. - output [3 : 0] m_axi_arregion, // Region identifier. Permits a single physical interface on a slave to be re-used - output [0 : 0] m_axi_aruser, // User signal. Optional User-defined signal in the read address channel. - output reg m_axi_arvalid, // Read address valid. This signal indicates that the channel is signaling valid read addr - input m_axi_arready, // Read address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Read data channel - // - input [0 : 0] m_axi_rid, // Read ID tag. This signal is the identification tag for the read data group of signals - input [63 : 0] m_axi_rdata, // Read data. - input [1 : 0] m_axi_rresp, // Read response. This signal indicates the status of the read transfer - input m_axi_rlast, // Read last. This signal indicates the last transfer in a read burst. - input [0 : 0] m_axi_ruser, // User signal. Optional User-defined signal in the read data channel. - input m_axi_rvalid, // Read valid. This signal indicates that the channel is signaling the required read data. - output m_axi_rready, // Read ready. This signal indicates that the master can accept the read data and response - // - // DMA interface for Write transaction - // - input [31:0] write_addr, // Byte address for start of write transaction (should be 64bit alligned) - input [7:0] write_count, // Count of 64bit words to write. (minus one) - input write_ctrl_valid, - output reg write_ctrl_ready, - input [63:0] write_data, - input write_data_valid, - output write_data_ready, - // - // DMA interface for Read - // - input [31:0] read_addr, // Byte address for start of read transaction (should be 64bit alligned) - input [7:0] read_count, // Count of 64bit words to read. - input read_ctrl_valid, - output reg read_ctrl_ready, - output [63:0] read_data, - output read_data_valid, - input read_data_ready, - // - // Debug Bus - // - output [31:0] debug - - ); - - - localparam AW_IDLE = 0; - localparam WAIT_AWREADY = 1; - localparam WAIT_BVALID = 2; - localparam AW_ERROR = 3; - - reg [1:0] write_addr_state; - reg [7:0] write_data_count; // Count write transfers. - reg enable_data_write; - - localparam DW_IDLE = 0; - localparam DW_RUN = 1; - localparam DW_LAST = 2; - - reg [1:0] write_data_state; - - localparam AR_IDLE = 0; - localparam WAIT_ARREADY = 1; - localparam WAIT_READ_DONE = 2; - localparam AR_ERROR = 3; - - reg [1:0] read_addr_state; - - localparam DR_IDLE = 0; - localparam DR_RUN = 1; - localparam DR_WAIT_ERROR = 2; - localparam DR_ERROR = 3; - - reg [1:0] read_data_state; - reg [7:0] read_data_count; - reg enable_data_read; - - /////////////////////////// - // DEBUG - /////////////////////////// - assign debug= {24'h0,write_addr_state[1:0],write_data_state[1:0],read_addr_state[1:0],read_data_state[1:0]}; - - - // - // - // - - - - - ///////////////////////////////////////////////////////////////////////////////// - // - // AXI Write address channel - // - ///////////////////////////////////////////////////////////////////////////////// - assign m_axi_awid = 1'b0; - assign m_axi_awsize = 3'h3; // 8 bytes. - assign m_axi_awburst = `AXI4_BURST_INCR; - assign m_axi_awlock = `AXI4_LOCK_NORMAL; - assign m_axi_awcache = `AXI4_CACHE_ALLOCATE | `AXI4_CACHE_OTHER_ALLOCATE | `AXI4_CACHE_MODIFIABLE | `AXI4_CACHE_BUFFERABLE; - assign m_axi_awprot = `AXI4_PROT_NON_SECURE; - assign m_axi_awqos = 4'h0; - assign m_axi_awregion = 4'h0; - assign m_axi_awuser = 1'b0; - - - // - // AXI Write address state machine - // - always @(posedge aclk) - if (areset) begin - write_ctrl_ready <= 1'b0; - write_addr_state <= AW_IDLE; - m_axi_awaddr[31:0] <= 32'h0; - m_axi_awlen[7:0] <= 8'h0; - m_axi_awvalid <= 1'b0; - m_axi_bready <= 1'b0; - end else - case (write_addr_state) - // - // AW_IDLE - // We are ready to accept a new write transaction. - // - AW_IDLE: begin - // Premptively accept new write transaction since we are idle. - write_ctrl_ready <= 1'b1; - // No need to be waiting for a response while idle. - m_axi_bready <= 1'b0; - // If we are offered a new transaction then..... - if (write_ctrl_valid) begin - // Drive all the relevent AXI4 write address channel signals next cycle. - m_axi_awaddr[31:0] <= write_addr[31:0]; - m_axi_awlen[7:0] <= {write_count}; - m_axi_awvalid <= 1'b1; - // If the AXI4 write channel is pre-emptively accepting the transaction... - if (m_axi_awready == 1'b1) begin - // ...go straight to looking for a transaction response... - `DEBUG $display("WRITE TRANSACTION: ADDR: %x LEN: %x @ time %d",write_addr[31:0],write_count,$time); - write_addr_state <= WAIT_BVALID; - m_axi_bready <= 1'b1; - end else begin - // ...otherwise wait to get the transaction accepted. - write_addr_state <= WAIT_AWREADY; - end - end - end - // - // WAIT_AWREADY - // Waiting for AXI4 slave to accept new write transaction. - // - WAIT_AWREADY: begin - write_ctrl_ready <= 1'b0; - // If the AXI4 write channel is accepting the transaction... - if (m_axi_awready == 1'b1) begin - // ...go to looking for a transaction response... - write_addr_state <= WAIT_BVALID; - m_axi_bready <= 1'b1; - `DEBUG $display("WRITE TRANSACTION: ADDR: %x LEN: %x @ time %d",m_axi_awaddr[31:0],m_axi_awlen[7:0],$time); - end else begin - // ...otherwise wait to get the trasaction accepted. - write_addr_state <= WAIT_AWREADY; - end - end // case: WAIT_AWREADY - // - // WAIT_BVALID - // Write transaction has been accepted, now waiting for a response to signal it's sucsesful. - // Ignoring ID tag for the moment - // - WAIT_BVALID: begin - write_ctrl_ready <= 1'b0; - m_axi_awvalid <= 1'b0; - // Wait for response channel to signal how write transaction went down.... - if (m_axi_bvalid == 1'b1) begin - if ((m_axi_bresp == `AXI4_RESP_OKAY) || (m_axi_bresp == `AXI4_RESP_EXOKAY)) begin - // ....it went well, we are ready to start something new. - write_addr_state <= AW_IDLE; - m_axi_bready <= 1'b0; - write_ctrl_ready <= 1'b1; // Ready to run again as soon as we hit idle. - end else if ((m_axi_bresp == `AXI4_RESP_SLVERR) || (m_axi_bresp == `AXI4_RESP_DECERR)) begin - // ....things got ugly, retreat to an error stat and wait for intervention. - write_addr_state <= AW_ERROR; - m_axi_bready <= 1'b0; - end - end else begin - write_addr_state <= WAIT_BVALID; - m_axi_bready <= 1'b1; - end - end // case: WAIT_BVALID - // - // AW_ERROR - // Something bad happened, going to need external intervention to restore a safe state. - // - AW_ERROR: begin - write_ctrl_ready <= 1'b0; - write_addr_state <= AW_ERROR; - m_axi_awaddr[31:0] <= 32'h0; - m_axi_awlen[7:0] <= 8'h0; - m_axi_awvalid <= 1'b0; - m_axi_bready <= 1'b0; - end - endcase // case(write_addr_state) - - ///////////////////////////////////////////////////////////////////////////////// - // - // AXI Write data channel - // - ///////////////////////////////////////////////////////////////////////////////// - assign m_axi_wstrb = 8'hff; - assign m_axi_wuser = 1'b0; - - // - // AXI Write data state machine - // - always @(posedge aclk) - if (areset) begin - write_data_state <= AW_IDLE; - write_data_count <= 1; - enable_data_write <= 1'b0; - m_axi_wlast <= 1'b0; - - end else - case (write_data_state) - // - // DW_IDLE - // Sit in this state until presented with the control details of a new write transaction. - // - DW_IDLE: begin - write_data_count <= 1; - m_axi_wlast <= 1'b0; - - if (write_ctrl_valid && write_ctrl_ready) begin - enable_data_write <= 1'b1; - if (write_count[7:0] == 8'h0) begin - // Single transfer transaction - write_data_state <= DW_LAST; - m_axi_wlast <= 1'b1; - end else begin - write_data_state <= DW_RUN; - end - end else begin - write_data_state <= DW_IDLE; - end - end - // - // DW_RUN - // - DW_RUN : begin - enable_data_write <= 1'b1; - m_axi_wlast <= 1'b0; - - if (write_data_valid && m_axi_wready) begin - // Single write transfer - write_data_count <= write_data_count + 1; - - if (write_data_count == m_axi_awlen[7:0]) begin - write_data_state <= DW_LAST; - m_axi_wlast <= 1'b1; - end else begin - write_data_state <= DW_RUN; - end - end else begin - write_data_state <= DW_RUN; - end - end - // - // DW_LAST - // - DW_LAST: begin - if (write_data_valid && m_axi_wready) begin - enable_data_write <= 1'b0; - write_data_state <= DW_IDLE; - m_axi_wlast <= 1'b0; - end else begin - enable_data_write <= 1'b1; - write_data_state <= DW_LAST; - m_axi_wlast <= 1'b1; - end - end // case: DW_LAST - // - default: - write_data_state <= DW_IDLE; - - endcase // case(write_data_state) - - - assign m_axi_wdata = write_data; - assign m_axi_wvalid = enable_data_write && write_data_valid; - assign write_data_ready = enable_data_write && m_axi_wready; - - ///////////////////////////////////////////////////////////////////////////////// - // - // AXI Read address channel - // - ///////////////////////////////////////////////////////////////////////////////// - assign m_axi_arid = 1'b0; - assign m_axi_arsize = 3'h3; // 8 bytes - assign m_axi_arburst = `AXI4_BURST_INCR; - assign m_axi_arlock = `AXI4_LOCK_NORMAL; - assign m_axi_arcache = `AXI4_CACHE_ALLOCATE | `AXI4_CACHE_OTHER_ALLOCATE | `AXI4_CACHE_MODIFIABLE | `AXI4_CACHE_BUFFERABLE; - assign m_axi_arprot = `AXI4_PROT_NON_SECURE; - assign m_axi_arqos = 4'h0; - assign m_axi_arregion = 4'h0; - assign m_axi_aruser = 1'b0; - - - // - // AXI Read address state machine - // - always @(posedge aclk) - if (areset) begin - read_ctrl_ready <= 1'b0; - read_addr_state <= AR_IDLE; - m_axi_araddr[31:0] <= 32'h0; - m_axi_arlen[7:0] <= 8'h0; - m_axi_arvalid <= 1'b0; - end else - case (read_addr_state) - // - // AR_IDLE - // We are ready to accept a new read transaction. - // - AR_IDLE: begin - // Premptively accept new read transaction since we are idle. - read_ctrl_ready <= 1'b1; - // If we are offered a new transaction then..... - if (read_ctrl_valid) begin - // Drive all the relevent AXI4 read address channel signals next cycle. - m_axi_araddr[31:0] <= read_addr[31:0]; - m_axi_arlen[7:0] <= {read_count}; - m_axi_arvalid <= 1'b1; - // If the AXI4 read channel is pre-emptively accepting the transaction... - if (m_axi_arready == 1'b1) begin - // ...go straight to looking for the transaction to complete - `DEBUG $display("READ TRANSACTION: ADDR: %x LEN: %x @ time %d",read_addr[31:0],read_count,$time); - read_addr_state <= WAIT_READ_DONE; - end else begin - // ...otherwise wait to get the transaction accepted. - read_addr_state <= WAIT_ARREADY; - end - end - end - // - // WAIT_ARREADY - // Waiting for AXI4 slave to accept new read transaction. - // - WAIT_ARREADY: begin - read_ctrl_ready <= 1'b0; - // If the AXI4 read channel is accepting the transaction... - if (m_axi_arready == 1'b1) begin - // ...go to looking for the transaction to complete... - read_addr_state <= WAIT_READ_DONE; - `DEBUG $display("READ TRANSACTION: ADDR: %x LEN: %x @ time %d",m_axi_araddr[31:0],m_axi_arlen[7:0],$time); - end else begin - // ...otherwise wait to get the trasaction accepted. - read_addr_state <= WAIT_ARREADY; - end - end // case: WAIT_ARREADY - // - // WAIT_READ_DONE - // Read transaction has been accepted, now waiting for the data transfer to complete - // Ignoring ID tag for the moment - // - WAIT_READ_DONE: begin - read_ctrl_ready <= 1'b0; - m_axi_arvalid <= 1'b0; - // Wait for read transaction to complete - if (read_data_state == DR_IDLE) begin - // ....it went well, we are ready to start something new. - read_addr_state <= AR_IDLE; - read_ctrl_ready <= 1'b1; // Ready to run again as soon as we hit idle. - end else if (read_data_state == DR_ERROR) begin - // ....things got ugly, retreat to an error stat and wait for intervention. - read_addr_state <= AR_ERROR; - end else begin - read_addr_state <= WAIT_READ_DONE; - end - end // case: WAIT_BVALID - // - // AR_ERROR - // Something bad happened, going to need external intervention to restore a safe state. - // - AR_ERROR: begin - read_ctrl_ready <= 1'b0; - read_addr_state <= AR_ERROR; - m_axi_araddr[31:0] <= 32'h0; - m_axi_arlen[7:0] <= 8'h0; - m_axi_arvalid <= 1'b0; - end - endcase // case(read_addr_state) - - ///////////////////////////////////////////////////////////////////////////////// - // - // AXI Read data channel - // - ///////////////////////////////////////////////////////////////////////////////// - - - // - // AXI Read data state machine - // - always @(posedge aclk) - if (areset) begin - read_data_state <= AR_IDLE; - read_data_count <= 0; - enable_data_read <= 1'b0; - - end else - case (read_data_state) - // - // DR_IDLE - // Sit in this state until presented with the control details of a new read transaction. - // - DR_IDLE: begin - read_data_count <= 0; - - if (read_ctrl_valid && read_ctrl_ready) begin - enable_data_read <= 1'b1; - read_data_state <= DR_RUN; - end else begin - read_data_state <= DR_IDLE; - end - end - // - // DR_RUN - // Sit here counting read transfers. If any have error's shift to error state. - // - DR_RUN : begin - enable_data_read <= 1'b1; - - if (read_data_ready && m_axi_rvalid) begin - // Single read transfer - read_data_count <= read_data_count + 1; - if ((m_axi_rresp == `AXI4_RESP_SLVERR) || (m_axi_rresp == `AXI4_RESP_DECERR)) begin - if (m_axi_rlast) begin - read_data_state <= DR_ERROR; - end else begin - read_data_state <= DR_WAIT_ERROR; - end - end else if (m_axi_rlast) begin // Implicitly good response signalled this transfer. - if (read_data_count == m_axi_arlen[7:0]) begin - read_data_state <= DR_IDLE; - end else begin - read_data_state <= DR_ERROR; - end - end else begin - read_data_state <= DR_RUN; - end - end else begin - read_data_state <= DR_RUN; - end - end - // - // DR_WAIT_ERROR - // Something bad happened, wait for last signalled in this burst - // - DR_WAIT_ERROR: begin - if (read_data_ready && m_axi_rvalid && m_axi_rlast) begin - enable_data_read <= 1'b0; - read_data_state <= DR_ERROR; - end else begin - enable_data_read <= 1'b1; - read_data_state <= DR_WAIT_ERROR; - end - end // case: DR_WAIT_ERROR - // - // DR_ERROR - // Something bad happened, going to need external intervention to restore a safe state. - // - DR_ERROR: begin - enable_data_read <= 1'b0; - read_data_state <= DR_ERROR; - end // case: DR_ERROR - - - endcase // case(read_data_state) - - - assign read_data = m_axi_rdata; - assign m_axi_rready = enable_data_read && read_data_ready; - assign read_data_valid = enable_data_read && m_axi_rvalid; - -endmodule // axi_dma_master - - - - - -
\ No newline at end of file diff --git a/fpga/usrp3/lib/axi/axi_dma_master_tb.v b/fpga/usrp3/lib/axi/axi_dma_master_tb.v deleted file mode 100644 index 75894fe1a..000000000 --- a/fpga/usrp3/lib/axi/axi_dma_master_tb.v +++ /dev/null @@ -1,165 +0,0 @@ -module axi_dma_master_tb; - - - - wire aclk; // Global AXI clock - wire aresetn; // Global AXI reset, active low. - // - // AXI Write address channel - // - wire [0 : 0] m_axi_awid; // Write address ID. This signal is the identification tag for the write address signals - wire [31 : 0] m_axi_awaddr; // Write address. The write address gives the address of the first transfer in a write burst - wire [7 : 0] m_axi_awlen; // Burst length. The burst length gives the exact number of transfers in a burst. - wire [2 : 0] m_axi_awsize; // Burst size. This signal indicates the size of each transfer in the burst. - wire [1 : 0] m_axi_awburst; // Burst type. The burst type and the size information, determine how the address is calculated - wire [0 : 0] m_axi_awlock; // Lock type. Provides additional information about the atomic characteristics of the transfer. - wire [3 : 0] m_axi_awcache; // Memory type. This signal indicates how transactions are required to progress - wire [2 : 0] m_axi_awprot; // Protection type. This signal indicates the privilege and security level of the transaction - wire [3 : 0] m_axi_awqos; // Quality of Service, QoS. The QoS identifier sent for each write transaction - wire [3 : 0] m_axi_awregion; // Region identifier. Permits a single physical interface on a slave to be re-used. - wire [0 : 0] m_axi_awuser; // User signal. Optional User-defined signal in the write address channel. - wire m_axi_awvalid; // Write address valid. This signal indicates that the channel is signaling valid write addr - wire m_axi_awready; // Write address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Write data channel. - // - wire [63 : 0] m_axi_wdata; // Write data - wire [7 : 0] m_axi_wstrb; // Write strobes. This signal indicates which byte lanes hold valid data. - wire m_axi_wlast; // Write last. This signal indicates the last transfer in a write burst - wire [0 : 0] m_axi_wuser; // User signal. Optional User-defined signal in the write data channel. - wire m_axi_wvalid; // Write valid. This signal indicates that valid write data and strobes are available. - wire m_axi_wready; // Write ready. This signal indicates that the slave can accept the write data. - // - // AXI Write response channel signals - // - wire [0 : 0] m_axi_bid; // Response ID tag. This signal is the ID tag of the write response. - wire [1 : 0] m_axi_bresp; // Write response. This signal indicates the status of the write transaction. - wire [0 : 0] m_axi_buser; // User signal. Optional User-defined signal in the write response channel. - wire m_axi_bvalid; // Write response valid. This signal indicates that the channel is signaling a valid response - wire m_axi_bready; // Response ready. This signal indicates that the master can accept a write response - // - // AXI Read address channel - // - wire [0 : 0] m_axi_arid; // Read address ID. This signal is the identification tag for the read address group of signals - wire [31 : 0] m_axi_araddr; // Read address. The read address gives the address of the first transfer in a read burst - wire [7 : 0] m_axi_arlen; // Burst length. This signal indicates the exact number of transfers in a burst. - wire [2 : 0] m_axi_arsize; // Burst size. This signal indicates the size of each transfer in the burst. - wire [1 : 0] m_axi_arburst; // Burst type. The burst type and the size information determine how the address for each transfer - wire [0 : 0] m_axi_arlock; // Lock type. This signal provides additional information about the atomic characteristics - wire [3 : 0] m_axi_arcache; // Memory type. This signal indicates how transactions are required to progress - wire [2 : 0] m_axi_arprot; // Protection type. This signal indicates the privilege and security level of the transaction - wire [3 : 0] m_axi_arqos; // Quality of Service, QoS. QoS identifier sent for each read transaction. - wire [3 : 0] m_axi_arregion; // Region identifier. Permits a single physical interface on a slave to be re-used - wire [0 : 0] m_axi_aruser; // User signal. Optional User-defined signal in the read address channel. - wire m_axi_arvalid; // Read address valid. This signal indicates that the channel is signaling valid read addr - wire m_axi_arready; // Read address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Read data channel - // - wire [0 : 0] m_axi_rid; // Read ID tag. This signal is the identification tag for the read data group of signals - wire [63 : 0] m_axi_rdata; // Read data. - wire [1 : 0] m_axi_rresp; // Read response. This signal indicates the status of the read transfer - wire m_axi_rlast; // Read last. This signal indicates the last transfer in a read burst. - wire [0 : 0] m_axi_ruser; // User signal. Optional User-defined signal in the read data channel. - wire m_axi_rvalid; // Read valid. This signal indicates that the channel is signaling the required read data. - wire m_axi_rready; // Read ready. This signal indicates that the master can accept the read data and response - // - // DMA interface for Write transaction - // - wire [31:0] write_addr; // Byte address for start of write transaction (should be 64bit alligned) - wire [3:0] write_count; // Count of 64 words to write. - wire write_ctrl_valid; - wire write_ctrl_ready; - wire [63:0] write_data; - wire write_data_valid; - wire write_data_ready; - // - // DMA interface for Read - // - wire [31:0] read_addr; // Byte address for start of read transaction (should be 64bit alligned) - wire [3:0] read_count; // Count of 64 words to read. - wire read_ctrl_valid; - wire read_ctrl_ready; - wire [63:0] read_data; - wire read_data_valid; - wire read_data_ready; - - - - axi_dma_master axi_dma_master_i1 - ( - .aclk(s_aclk), // input s_aclk - .aresetn(s_aresetn), // input s_aresetn - // - .s_axi_awid(s_axi_awid), // input [0 : 0] s_axi_awid - .s_axi_awaddr(s_axi_awaddr), // input [31 : 0] s_axi_awaddr - .s_axi_awlen(s_axi_awlen), // input [7 : 0] s_axi_awlen - .s_axi_awsize(s_axi_awsize), // input [2 : 0] s_axi_awsize - .s_axi_awburst(s_axi_awburst), // input [1 : 0] s_axi_awburst - .s_axi_awvalid(s_axi_awvalid), // input s_axi_awvalid - .s_axi_awready(s_axi_awready), // output s_axi_awready - // - .s_axi_wdata(s_axi_wdata), // input [63 : 0] s_axi_wdata - .s_axi_wstrb(s_axi_wstrb), // input [7 : 0] s_axi_wstrb - .s_axi_wlast(s_axi_wlast), // input s_axi_wlast - .s_axi_wvalid(s_axi_wvalid), // input s_axi_wvalid - .s_axi_wready(s_axi_wready), // output s_axi_wready - // - .s_axi_bid(s_axi_bid), // output [0 : 0] s_axi_bid - .s_axi_bresp(s_axi_bresp), // output [1 : 0] s_axi_bresp - .s_axi_bvalid(s_axi_bvalid), // output s_axi_bvalid - .s_axi_bready(s_axi_bready), // input s_axi_bready - // - .s_axi_arid(s_axi_arid), // input [0 : 0] s_axi_arid - .s_axi_araddr(s_axi_araddr), // input [31 : 0] s_axi_araddr - .s_axi_arlen(s_axi_arlen), // input [7 : 0] s_axi_arlen - .s_axi_arsize(s_axi_arsize), // input [2 : 0] s_axi_arsize - .s_axi_arburst(s_axi_arburst), // input [1 : 0] s_axi_arburst - .s_axi_arvalid(s_axi_arvalid), // input s_axi_arvalid - .s_axi_arready(s_axi_arready), // output s_axi_arready - // - .s_axi_rid(s_axi_rid), // output [0 : 0] s_axi_rid - .s_axi_rdata(s_axi_rdata), // output [63 : 0] s_axi_rdata - .s_axi_rresp(s_axi_rresp), // output [1 : 0] s_axi_rresp - .s_axi_rlast(s_axi_rlast), // output s_axi_rlast - .s_axi_rvalid(s_axi_rvalid), // output s_axi_rvalid - .s_axi_rready(s_axi_rready) // input s_axi_rready - ); - - - axi4_bram_1kx64 axi4_bram_1kx64_i1 - ( - .s_aclk(s_aclk), // input s_aclk - .s_aresetn(s_aresetn), // input s_aresetn - .s_axi_awid(s_axi_awid), // input [0 : 0] s_axi_awid - .s_axi_awaddr(s_axi_awaddr), // input [31 : 0] s_axi_awaddr - .s_axi_awlen(s_axi_awlen), // input [7 : 0] s_axi_awlen - .s_axi_awsize(s_axi_awsize), // input [2 : 0] s_axi_awsize - .s_axi_awburst(s_axi_awburst), // input [1 : 0] s_axi_awburst - .s_axi_awvalid(s_axi_awvalid), // input s_axi_awvalid - .s_axi_awready(s_axi_awready), // output s_axi_awready - .s_axi_wdata(s_axi_wdata), // input [63 : 0] s_axi_wdata - .s_axi_wstrb(s_axi_wstrb), // input [7 : 0] s_axi_wstrb - .s_axi_wlast(s_axi_wlast), // input s_axi_wlast - .s_axi_wvalid(s_axi_wvalid), // input s_axi_wvalid - .s_axi_wready(s_axi_wready), // output s_axi_wready - .s_axi_bid(s_axi_bid), // output [0 : 0] s_axi_bid - .s_axi_bresp(s_axi_bresp), // output [1 : 0] s_axi_bresp - .s_axi_bvalid(s_axi_bvalid), // output s_axi_bvalid - .s_axi_bready(s_axi_bready), // input s_axi_bready - .s_axi_arid(s_axi_arid), // input [0 : 0] s_axi_arid - .s_axi_araddr(s_axi_araddr), // input [31 : 0] s_axi_araddr - .s_axi_arlen(s_axi_arlen), // input [7 : 0] s_axi_arlen - .s_axi_arsize(s_axi_arsize), // input [2 : 0] s_axi_arsize - .s_axi_arburst(s_axi_arburst), // input [1 : 0] s_axi_arburst - .s_axi_arvalid(s_axi_arvalid), // input s_axi_arvalid - .s_axi_arready(s_axi_arready), // output s_axi_arready - .s_axi_rid(s_axi_rid), // output [0 : 0] s_axi_rid - .s_axi_rdata(s_axi_rdata), // output [63 : 0] s_axi_rdata - .s_axi_rresp(s_axi_rresp), // output [1 : 0] s_axi_rresp - .s_axi_rlast(s_axi_rlast), // output s_axi_rlast - .s_axi_rvalid(s_axi_rvalid), // output s_axi_rvalid - .s_axi_rready(s_axi_rready) // input s_axi_rready - ); - -endmodule // axi_dma_master_tb diff --git a/fpga/usrp3/lib/axi/axi_dram_fifo.v b/fpga/usrp3/lib/axi/axi_dram_fifo.v deleted file mode 100644 index 52626123e..000000000 --- a/fpga/usrp3/lib/axi/axi_dram_fifo.v +++ /dev/null @@ -1,816 +0,0 @@ - -// -// There are various obligations put on this code not present in regular BRAM based FIFO's -// -// 1) Bursts are way more efficient, use local small FIFO's to interact with DRAM -// 2) Never cross a 4KByte address boundry within a single transaction, this is an AXI4 rule. -// 3) 2^SIZE must be greater than 4KB so that the 4KByte page protection also deals with FIFO wrap corner case. -// -module axi_dram_fifo - // NOTE: SIZE is log2 of size of FIFO buffer in bytes. i.e 13 for 8KBytes which is 1kx64 - #(parameter BASE=0, SIZE=16, TIMEOUT=64) - ( - input bus_clk, - input bus_reset, - input clear, - input dram_clk, - input dram_reset, - // - // AXI Write address channel - // - output [0 : 0] m_axi_awid, // Write address ID. This signal is the identification tag for the write address signals - output [31 : 0] m_axi_awaddr, // Write address. The write address gives the address of the first transfer in a write burst - output [7 : 0] m_axi_awlen, // Burst length. The burst length gives the exact number of transfers in a burst. - output [2 : 0] m_axi_awsize, // Burst size. This signal indicates the size of each transfer in the burst. - output [1 : 0] m_axi_awburst, // Burst type. The burst type and the size information, determine how the address is calculated - output [0 : 0] m_axi_awlock, // Lock type. Provides additional information about the atomic characteristics of the transfer. - output [3 : 0] m_axi_awcache, // Memory type. This signal indicates how transactions are required to progress - output [2 : 0] m_axi_awprot, // Protection type. This signal indicates the privilege and security level of the transaction - output [3 : 0] m_axi_awqos, // Quality of Service, QoS. The QoS identifier sent for each write transaction - output [3 : 0] m_axi_awregion, // Region identifier. Permits a single physical interface on a slave to be re-used. - output [0 : 0] m_axi_awuser, // User signal. Optional User-defined signal in the write address channel. - output m_axi_awvalid, // Write address valid. This signal indicates that the channel is signaling valid write addr - input m_axi_awready, // Write address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Write data channel. - // - output [63 : 0] m_axi_wdata, // Write data - output [7 : 0] m_axi_wstrb, // Write strobes. This signal indicates which byte lanes hold valid data. - output m_axi_wlast, // Write last. This signal indicates the last transfer in a write burst - output [0 : 0] m_axi_wuser, // User signal. Optional User-defined signal in the write data channel. - output m_axi_wvalid, // Write valid. This signal indicates that valid write data and strobes are available. - input m_axi_wready, // Write ready. This signal indicates that the slave can accept the write data. - // - // AXI Write response channel signals - // - input [0 : 0] m_axi_bid, // Response ID tag. This signal is the ID tag of the write response. - input [1 : 0] m_axi_bresp, // Write response. This signal indicates the status of the write transaction. - input [0 : 0] m_axi_buser, // User signal. Optional User-defined signal in the write response channel. - input m_axi_bvalid, // Write response valid. This signal indicates that the channel is signaling a valid response - output m_axi_bready, // Response ready. This signal indicates that the master can accept a write response - // - // AXI Read address channel - // - output [0 : 0] m_axi_arid, // Read address ID. This signal is the identification tag for the read address group of signals - output [31 : 0] m_axi_araddr, // Read address. The read address gives the address of the first transfer in a read burst - output [7 : 0] m_axi_arlen, // Burst length. This signal indicates the exact number of transfers in a burst. - output [2 : 0] m_axi_arsize, // Burst size. This signal indicates the size of each transfer in the burst. - output [1 : 0] m_axi_arburst, // Burst type. The burst type and the size information determine how the address for each transfer - output [0 : 0] m_axi_arlock, // Lock type. This signal provides additional information about the atomic characteristics - output [3 : 0] m_axi_arcache, // Memory type. This signal indicates how transactions are required to progress - output [2 : 0] m_axi_arprot, // Protection type. This signal indicates the privilege and security level of the transaction - output [3 : 0] m_axi_arqos, // Quality of Service, QoS. QoS identifier sent for each read transaction. - output [3 : 0] m_axi_arregion, // Region identifier. Permits a single physical interface on a slave to be re-used - output [0 : 0] m_axi_aruser, // User signal. Optional User-defined signal in the read address channel. - output m_axi_arvalid, // Read address valid. This signal indicates that the channel is signaling valid read addr - input m_axi_arready, // Read address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Read data channel - // - input [0 : 0] m_axi_rid, // Read ID tag. This signal is the identification tag for the read data group of signals - input [63 : 0] m_axi_rdata, // Read data. - input [1 : 0] m_axi_rresp, // Read response. This signal indicates the status of the read transfer - input m_axi_rlast, // Read last. This signal indicates the last transfer in a read burst. - input [0 : 0] m_axi_ruser, // User signal. Optional User-defined signal in the read data channel. - input m_axi_rvalid, // Read valid. This signal indicates that the channel is signaling the required read data. - output m_axi_rready, // Read ready. This signal indicates that the master can accept the read data and response - // - // CHDR friendly AXI stream input - // - input [63:0] i_tdata, - input i_tlast, - input i_tvalid, - output i_tready, - // - // CHDR friendly AXI Stream output - // - output [63:0] o_tdata, - output o_tlast, - output o_tvalid, - input o_tready, - // - // - // - input [15:0] supress_threshold, - input supress_enable, - // - // Debug Bus - // - output [197:0] debug - ); - - // - // We are only solving for width 64bits here, since it's our standard CHDR quanta - // - localparam WIDTH=64; - - // - // Input side declarations - // - localparam INPUT_IDLE = 0; - localparam INPUT1 = 1; - localparam INPUT2 = 2; - localparam INPUT3 = 3; - localparam INPUT4 = 4; - localparam INPUT5 = 5; - localparam INPUT6 = 6; - - reg [2:0] input_state; - reg input_timeout_triggered; - reg input_timeout_reset; - reg [8:0] input_timeout_count; - reg [31:0] write_addr; - reg write_ctrl_valid; - wire write_ctrl_ready; - reg [7:0] write_count; - reg update_write; - wire [63:0] write_data; - wire write_data_valid; - wire write_data_ready; - - // - // Output side declarations - // - localparam OUTPUT_IDLE = 0; - localparam OUTPUT1 = 1; - localparam OUTPUT2 = 2; - localparam OUTPUT3 = 3; - localparam OUTPUT4 = 4; - localparam OUTPUT5 = 5; - localparam OUTPUT6 = 6; - - reg [2:0] output_state; - reg output_timeout_triggered; - reg output_timeout_reset; - reg [8:0] output_timeout_count; - reg [31:0] read_addr; - reg read_ctrl_valid; - wire read_ctrl_ready; - reg [7:0] read_count; - reg update_read; - wire [63:0] read_data; - wire read_data_valid; - wire read_data_ready; - - // Track main FIFO active size. - reg [SIZE-3:0] space, occupied; - wire [11:0] input_page_boundry, output_page_boundry; - - - // - // Buffer input in FIFO's. Embeded tlast signal using ESCape code. - // - wire [WIDTH-1:0] i_tdata_i0; - wire i_tvalid_i0, i_tready_i0, i_tlast_i0; - - wire [WIDTH-1:0] i_tdata_i1; - wire i_tvalid_i1, i_tready_i1; - - wire [WIDTH-1:0] i_tdata_i2; - wire i_tvalid_i2, i_tready_i2; - - wire [WIDTH-1:0] i_tdata_input; - wire i_tvalid_input, i_tready_input; - wire [15:0] space_input, occupied_input; - reg [15:0] space_input_reg; - reg supress_reads; - - /////////////////////////// - // DEBUG - /////////////////////////// - wire [31:0] debug_axi_dma_master; - - //assign debug = {18'h0, input_state[2:0], output_state[2:0], debug_axi_dma_master[7:0]}; - - /////////////////////////////////////////////////////////////////////////////// - - wire write_in, read_in, empty_in, full_in; - assign i_tready = ~full_in; - assign write_in = i_tvalid & i_tready; - assign i_tvalid_i0 = ~empty_in; - assign read_in = i_tvalid_i0 & i_tready_i0; - wire [6:0] discard_i0; - - fifo_short_2clk fifo_short_2clk_i0 - (.rst(bus_reset), - .wr_clk(bus_clk), - .din({7'h0,i_tlast,i_tdata}), // input [71 : 0] din - .wr_en(write_in), // input wr_en - .full(full_in), // output full - .wr_data_count(), // output [9 : 0] wr_data_count - - .rd_clk(dram_clk), // input rd_clk - .dout({discard_i0,i_tlast_i0,i_tdata_i0}), // output [71 : 0] dout - .rd_en(read_in), // input rd_en - .empty(empty_in), // output empty - .rd_data_count() // output [9 : 0] rd_data_count - ); - - axi_embed_tlast axi_embed_tlast_i - ( - .clk(dram_clk), - .reset(dram_reset), - .clear(clear), - // - .i_tdata(i_tdata_i0), - .i_tlast(i_tlast_i0), - .i_tvalid(i_tvalid_i0), - .i_tready(i_tready_i0), - // - .o_tdata(i_tdata_i1), - .o_tvalid(i_tvalid_i1), - .o_tready(i_tready_i1) - ); - - - axi_fast_fifo #(.WIDTH(WIDTH)) fast_fifo_i0 - ( - .clk(dram_clk), - .reset(dram_reset), - .clear(clear), - // - .i_tdata(i_tdata_i1), - .i_tvalid(i_tvalid_i1), - .i_tready(i_tready_i1), - // - .o_tdata(i_tdata_i2), - .o_tvalid(i_tvalid_i2), - .o_tready(i_tready_i2) - ); - - axi_fifo #(.WIDTH(WIDTH),.SIZE(12)) fifo_i1 - ( - .clk(dram_clk), - .reset(dram_reset), - .clear(clear), - // - .i_tdata(i_tdata_i2), - .i_tvalid(i_tvalid_i2), - .i_tready(i_tready_i2), - // - .o_tdata(i_tdata_input), - .o_tvalid(i_tvalid_input), - .o_tready(i_tready_input), - // - .space(space_input), - .occupied(occupied_input) - ); - - // - // Monitor occupied_input to deduce when DRAM FIFO is running short of bandwidth and there is a danger of backpressure - // passing upstream of the DRAM FIFO. - // In this situation supress read requests to the DRAM FIFO so that more bandwidth is available to writes. - // - - - always @(posedge dram_clk) - begin - space_input_reg <= space_input; - if ((space_input_reg < supress_threshold[15:0]) && supress_enable) - supress_reads <= 1'b1; - else - supress_reads <= 1'b0; - end - - // - // Buffer output in 32entry FIFO's. Extract embeded tlast signal. - // - wire [WIDTH-1:0] o_tdata_output; - wire o_tvalid_output, o_tready_output; - wire [15:0] space_output, occupied_output; - - wire [WIDTH-1:0] o_tdata_i0; - wire o_tvalid_i0, o_tready_i0; - - wire [WIDTH-1:0] o_tdata_i1; - wire o_tvalid_i1, o_tready_i1, o_tlast_i1; - - wire [WIDTH-1:0] o_tdata_i2; - wire o_tvalid_i2, o_tready_i2, o_tlast_i2; - - wire [WIDTH-1:0] o_tdata_i3; - wire o_tvalid_i3, o_tready_i3, o_tlast_i3; - - wire checksum_error; - - - axi_fifo #(.WIDTH(WIDTH),.SIZE(9)) fifo_i2 - ( - .clk(dram_clk), - .reset(dram_reset), - .clear(clear), - // - .i_tdata(o_tdata_output), - .i_tvalid(o_tvalid_output), - .i_tready(o_tready_output), - // - .o_tdata(o_tdata_i0), - .o_tvalid(o_tvalid_i0), - .o_tready(o_tready_i0), - // - .space(space_output), - .occupied(occupied_output) - ); - - // Place FLops straight after SRAM read access for timing. - axi_fast_fifo #(.WIDTH(WIDTH)) fast_fifo_i1 - ( - .clk(dram_clk), - .reset(dram_reset), - .clear(clear), - // - .i_tdata(o_tdata_i0), - .i_tvalid(o_tvalid_i0), - .i_tready(o_tready_i0), - // - .o_tdata(o_tdata_i1), - .o_tvalid(o_tvalid_i1), - .o_tready(o_tready_i1 && ~supress_reads) - ); - - // More pipeline flops to meet timing - axi_fast_fifo #(.WIDTH(WIDTH)) fast_fifo_i2 - ( - .clk(dram_clk), - .reset(dram_reset), - .clear(clear), - // - .i_tdata(o_tdata_i1), - .i_tvalid(o_tvalid_i1 && ~supress_reads), - .i_tready(o_tready_i1), - // - .o_tdata(o_tdata_i2), - .o_tvalid(o_tvalid_i2), - .o_tready(o_tready_i2) - ); - - axi_fast_extract_tlast axi_fast_extract_tlast_i0 - ( - .clk(dram_clk), - .reset(dram_reset), - .clear(clear), - // - .i_tdata(o_tdata_i2), - .i_tvalid(o_tvalid_i2), - .i_tready(o_tready_i2), - // - .o_tdata(o_tdata_i3), - .o_tlast(o_tlast_i3), - .o_tvalid(o_tvalid_i3), - .o_tready(o_tready_i3) - // - // .checksum_error_reg(checksum_error) - ); - - - wire write_out, read_out, empty_out, full_out; - assign o_tready_i3 = ~full_out; - assign write_out = o_tvalid_i3 & o_tready_i3; - assign o_tvalid = ~empty_out; - assign read_out = o_tvalid & o_tready; - wire [6:0] discard_i1; - - fifo_short_2clk fifo_short_2clk_i1 - ( - .rst(bus_reset), - .wr_clk(dram_clk), - .din({7'h0,o_tlast_i3,o_tdata_i3}), // input [71 : 0] din - .wr_en(write_out), // input wr_en - .full(full_out), // output full - .wr_data_count(), // output [9 : 0] wr_data_count - - .rd_clk(bus_clk), // input rd_clk - .dout({discard_i1,o_tlast,o_tdata}), // output [71 : 0] dout - .rd_en(read_out), // input rd_en - .empty(empty_out), // output empty - .rd_data_count() // output [9 : 0] rd_data_count - ); - - // - // Simple input timeout counter for now. - // Timeout count only increments when there is some data waiting to be written. - // - always @(posedge dram_clk) - if (dram_reset | clear) begin - input_timeout_count <= 0; - input_timeout_triggered <= 1'b0; - end else if (input_timeout_reset) begin - input_timeout_count <= 0; - input_timeout_triggered <= 1'b0; - end else if (input_timeout_count == TIMEOUT) begin - input_timeout_triggered <= 1'b1; - end else if (input_state == INPUT_IDLE) begin - input_timeout_count <= input_timeout_count + (occupied_input != 0); - end - - - // - // Wait for 16 entries in input FIFO to trigger DRAM write burst. - // Timeout can also trigger burst so fragments of data are not left to rot in the input FIFO. - // Also if enough data is present in the input FIFO to complete a burst upto the edge - // of a 4KByte page then immediately start the burst. - // - always @(posedge dram_clk) - if (dram_reset | clear) begin - input_state <= INPUT_IDLE; - write_addr[31:SIZE] <= BASE >> SIZE; - write_addr[SIZE-1:0] <= 0; - input_timeout_reset <= 1'b0; - write_ctrl_valid <= 1'b0; - write_count <= 8'd0; - update_write <= 1'b0; - end else - case (input_state) - // - // INPUT_IDLE. - // To start an input transfer to DRAM need: - // 1) Space in the DRAM FIFO - // and either - // 2) 256 entrys in the input FIFO - // or - // 3) Timeout waiting for more data. - // - INPUT_IDLE: begin - write_ctrl_valid <= 1'b0; - update_write <= 1'b0; - if (space > 255) begin // Space in the DRAM FIFO - if (occupied_input > 255) begin // 256 or more entrys in input FIFO - input_state <= INPUT1; - input_timeout_reset <= 1'b1; - end else if (input_timeout_triggered) begin // input FIFO timeout waiting for new data. - input_state <= INPUT2; - input_timeout_reset <= 1'b1; - end else begin - input_timeout_reset <= 1'b0; - input_state <= INPUT_IDLE; - end - end else begin - input_timeout_reset <= 1'b0; - input_state <= INPUT_IDLE; - end - end - // - // INPUT1. - // Caused by input FIFO reaching 256 entries. - // Request write burst of lesser of: - // 1) Entrys until page boundry crossed - // 2) 256. - // - INPUT1: begin - write_count <= (input_page_boundry < 255) ? input_page_boundry[7:0] : 8'd255; - write_ctrl_valid <= 1'b1; - if (write_ctrl_ready) - input_state <= INPUT4; // Pre-emptive ACK - else - input_state <= INPUT3; // Wait for ACK - end - // - // INPUT2. - // Caused by timeout of input FIFO. (occupied_input was implicitly less than 256 last cycle) - // Request write burst of lesser of: - // 1) Entries until page boundry crossed - // 2) Entries in input FIFO - // - INPUT2: begin - write_count <= (input_page_boundry < ({3'h0,occupied_input[8:0]} - 12'd1)) ? input_page_boundry[7:0] : (occupied_input[8:0] - 7'd1); - write_ctrl_valid <= 1'b1; - if (write_ctrl_ready) - input_state <= INPUT4; // Pre-emptive ACK - else - input_state <= INPUT3; // Wait for ACK - end - // - // INPUT3. - // Wait in this state for AXI4_DMA engine to accept transaction. - // - INPUT3: begin - if (write_ctrl_ready) begin - write_ctrl_valid <= 1'b0; - input_state <= INPUT4; // ACK - end else begin - write_ctrl_valid <= 1'b1; - input_state <= INPUT3; // Wait for ACK - end - end - // - // INPUT4. - // Wait here until write_ctrl_ready_deasserts. - // This is important as the next time it asserts we know that a write response was receieved. - INPUT4: begin - write_ctrl_valid <= 1'b0; - if (!write_ctrl_ready) - input_state <= INPUT5; // Move on - else - input_state <= INPUT4; // Wait for deassert - end - // - // INPUT5. - // Transaction has been accepted by AXI4 DMA engine. Now we wait for the re-assertion - // of write_ctrl_ready which signals that the AXI4 DMA engine has receieved a response - // for the whole write transaction and we assume that this means it is commited to DRAM. - // We are now free to update write_addr pointer and go back to idle state. - // - INPUT5: begin - write_ctrl_valid <= 1'b0; - if (write_ctrl_ready) begin - write_addr[SIZE-1:0] <= write_addr[SIZE-1:0] + ((write_count + 1) << 3); - input_state <= INPUT6; - update_write <= 1'b1; - end else begin - input_state <= INPUT5; - end - end - // - // INPUT6: - // Need to let space update before looking if there's more to do. - // - INPUT6: begin - input_state <= INPUT_IDLE; - update_write <= 1'b0; - end - // Ass covering. - default: input_state <= INPUT_IDLE; - - endcase // case(input_state) - - - // - // Simple output timeout counter for now - // - always @(posedge dram_clk) - if (dram_reset | clear) begin - output_timeout_count <= 0; - output_timeout_triggered <= 1'b0; - end else if (output_timeout_reset) begin - output_timeout_count <= 0; - output_timeout_triggered <= 1'b0; - end else if (output_timeout_count == TIMEOUT) begin - output_timeout_triggered <= 1'b1; - end else if (output_state == OUTPUT_IDLE) begin - output_timeout_count <= output_timeout_count + (occupied != 0 ); - end - - - // - // Wait for 64 entries in main FIFO to trigger DRAM read burst. - // Timeout can also trigger burst so fragments of data are not left to rot in the main FIFO. - // Also if enough data is present in the main FIFO to complete a burst upto the edge - // of a 4KByte page then immediately start the burst. - // - always @(posedge dram_clk) - if (dram_reset | clear) begin - output_state <= OUTPUT_IDLE; - read_addr[31:SIZE] <= BASE >> SIZE; - read_addr[SIZE-1:0] <= 0; - output_timeout_reset <= 1'b0; - read_ctrl_valid <= 1'b0; - read_count <= 8'd0; - update_read <= 1'b0; - end else - case (output_state) - // - // OUTPUT_IDLE. - // To start an output tranfer from DRAM - // 1) Space in the small output FIFO - // and either - // 2) 256 entrys in the DRAM FIFO - // or - // 3) Timeout waiting for more data. - // - OUTPUT_IDLE: begin - read_ctrl_valid <= 1'b0; - update_read <= 1'b0; - if (space_output > 255) begin // Space in the output FIFO. - if (occupied > 255) begin // 64 or more entrys in main FIFO - output_state <= OUTPUT1; - output_timeout_reset <= 1'b1; - end else if (output_timeout_triggered) begin // output FIFO timeout waiting for new data. - output_state <= OUTPUT2; - output_timeout_reset <= 1'b1; - end else begin - output_timeout_reset <= 1'b0; - output_state <= OUTPUT_IDLE; - end - end else begin - output_timeout_reset <= 1'b0; - output_state <= OUTPUT_IDLE; - end - end // case: OUTPUT_IDLE - // - // OUTPUT1. - // Caused by main FIFO reaching 256 entries. - // Request read burst of lesser of lesser of: - // 1) Entrys until page boundry crossed - // 2) 256. - // - OUTPUT1: begin - read_count <= (output_page_boundry < 255) ? output_page_boundry : 8'd255; - read_ctrl_valid <= 1'b1; - if (read_ctrl_ready) - output_state <= OUTPUT4; // Pre-emptive ACK - else - output_state <= OUTPUT3; // Wait for ACK - end - // - // OUTPUT2. - // Caused by timeout of main FIFO - // Request read burst of lesser of: - // 1) Entries until page boundry crossed - // 2) Entries in main FIFO - // - OUTPUT2: begin - read_count <= (output_page_boundry < (occupied - 1)) ? output_page_boundry : (occupied - 1); - read_ctrl_valid <= 1'b1; - if (read_ctrl_ready) - output_state <= OUTPUT4; // Pre-emptive ACK - else - output_state <= OUTPUT3; // Wait for ACK - end - // - // OUTPUT3. - // Wait in this state for AXI4_DMA engine to accept transaction. - // - OUTPUT3: begin - if (read_ctrl_ready) begin - read_ctrl_valid <= 1'b0; - output_state <= OUTPUT4; // ACK - end else begin - read_ctrl_valid <= 1'b1; - output_state <= OUTPUT3; // Wait for ACK - end - end - // - // OUTPUT4. - // Wait here unitl read_ctrl_ready_deasserts. - // This is important as the next time it asserts we know that a read response was receieved. - OUTPUT4: begin - read_ctrl_valid <= 1'b0; - if (!read_ctrl_ready) - output_state <= OUTPUT5; // Move on - else - output_state <= OUTPUT4; // Wait for deassert - end - // - // OUTPUT5. - // Transaction has been accepted by AXI4 DMA engine. Now we wait for the re-assertion - // of read_ctrl_ready which signals that the AXI4 DMA engine has receieved a last signal and good response - // for the whole read transaction. - // We are now free to update read_addr pointer and go back to idle state. - // - OUTPUT5: begin - read_ctrl_valid <= 1'b0; - if (read_ctrl_ready) begin - read_addr[SIZE-1:0] <= read_addr[SIZE-1:0] + ((read_count + 1) << 3); - output_state <= OUTPUT6; - update_read <= 1'b1; - - end else begin - output_state <= OUTPUT5; - end - end // case: OUTPUT5 - // - // OUTPUT6. - // Need to get occupied value updated before checking if there's more to do. - // - OUTPUT6: begin - update_read <= 1'b0; - output_state <= OUTPUT_IDLE; - end - // Ass covering. - default: output_state <= OUTPUT_IDLE; - - endcase // case(output_state) - - // - // Calculate number of entries remaining until next 4KB page boundry is crossed minus 1. - // Note, units of calculation are 64bit wide words. Address is always 64bit alligned. - // - assign input_page_boundry = {write_addr[31:12],9'h1ff} - write_addr[31:3]; - assign output_page_boundry = {read_addr[31:12],9'h1ff} - read_addr[31:3]; - - // - // Count number of used entries in main DRAM FIFO. - // Note that this is expressed in units of 64bit wide words. - // - always @(posedge dram_clk) - if (dram_reset | clear) - occupied <= 0; - else - occupied <= occupied + (update_write ? write_count + 1 : 0) - (update_read ? read_count + 1 : 0); - - always @(posedge dram_clk) - if (dram_reset | clear) - space <= (1 << SIZE-3) - 'd64; // Subtract 64 from space to make allowance for read/write reordering in DRAM controller confuing pointer math. - else - space <= space - (update_write ? write_count + 1 : 0) + (update_read ? read_count + 1 : 0); - - // - // Instamce of axi_dma_master - // - - - axi_dma_master axi_dma_master_i - ( - .aclk(dram_clk), // input aclk - .areset(dram_reset | clear), // input aresetn - // Write control - .m_axi_awid(m_axi_awid), // input [0 : 0] m_axi_awid - .m_axi_awaddr(m_axi_awaddr), // input [31 : 0] m_axi_awaddr - .m_axi_awlen(m_axi_awlen), // input [7 : 0] m_axi_awlen - .m_axi_awsize(m_axi_awsize), // input [2 : 0] m_axi_awsize - .m_axi_awburst(m_axi_awburst), // input [1 : 0] m_axi_awburst - .m_axi_awvalid(m_axi_awvalid), // input m_axi_awvalid - .m_axi_awready(m_axi_awready), // output m_axi_awready - .m_axi_awlock(m_axi_awlock), - .m_axi_awcache(m_axi_awcache), - .m_axi_awprot(m_axi_awprot), - .m_axi_awqos(m_axi_awqos), - .m_axi_awregion(m_axi_awregion), - .m_axi_awuser(m_axi_awuser), - // Write Data - .m_axi_wdata(m_axi_wdata), // input [63 : 0] m_axi_wdata - .m_axi_wstrb(m_axi_wstrb), // input [7 : 0] m_axi_wstrb - .m_axi_wlast(m_axi_wlast), // input m_axi_wlast - .m_axi_wvalid(m_axi_wvalid), // input m_axi_wvalid - .m_axi_wready(m_axi_wready), // output m_axi_wready - .m_axi_wuser(), - // Write Response - .m_axi_bid(m_axi_bid), // output [0 : 0] m_axi_bid - .m_axi_bresp(m_axi_bresp), // output [1 : 0] m_axi_bresp - .m_axi_bvalid(m_axi_bvalid), // output m_axi_bvalid - .m_axi_bready(m_axi_bready), // input m_axi_bready - .m_axi_buser(), - // Read Control - .m_axi_arid(m_axi_arid), // input [0 : 0] m_axi_arid - .m_axi_araddr(m_axi_araddr), // input [31 : 0] m_axi_araddr - .m_axi_arlen(m_axi_arlen), // input [7 : 0] m_axi_arlen - .m_axi_arsize(m_axi_arsize), // input [2 : 0] m_axi_arsize - .m_axi_arburst(m_axi_arburst), // input [1 : 0] m_axi_arburst - .m_axi_arvalid(m_axi_arvalid), // input m_axi_arvalid - .m_axi_arready(m_axi_arready), // output m_axi_arready - .m_axi_arlock(m_axi_arlock), - .m_axi_arcache(m_axi_arcache), - .m_axi_arprot(m_axi_arprot), - .m_axi_arqos(m_axi_arqos), - .m_axi_arregion(m_axi_arregion), - .m_axi_aruser(m_axi_aruser), - // Read Data - .m_axi_rid(m_axi_rid), // output [0 : 0] m_axi_rid - .m_axi_rdata(m_axi_rdata), // output [63 : 0] m_axi_rdata - .m_axi_rresp(m_axi_rresp), // output [1 : 0] m_axi_rresp - .m_axi_rlast(m_axi_rlast), // output m_axi_rlast - .m_axi_rvalid(m_axi_rvalid), // output m_axi_rvalid - .m_axi_rready(m_axi_rready), // input m_axi_rready - .m_axi_ruser(), - // - // DMA interface for Write transaction - // - .write_addr(write_addr), // Byte address for start of write transaction (should be 64bit alligned) - .write_count(write_count), // Count of 64bit words to write. - .write_ctrl_valid(write_ctrl_valid), - .write_ctrl_ready(write_ctrl_ready), - .write_data(i_tdata_input), - .write_data_valid(i_tvalid_input), - .write_data_ready(i_tready_input), - // - // DMA interface for Read - // - .read_addr(read_addr), // Byte address for start of read transaction (should be 64bit alligned) - .read_count(read_count), // Count of 64bit words to read. - .read_ctrl_valid(read_ctrl_valid), - .read_ctrl_ready(read_ctrl_ready), - .read_data(o_tdata_output), - .read_data_valid(o_tvalid_output), - .read_data_ready(o_tready_output), - // - // Debug - // - .debug(debug_axi_dma_master) - ); - - // - // Debug - // - assign debug = { checksum_error, - /*debug_axi_dma_master[7:0]*/ - input_timeout_triggered, // 195 - input_state[2:0], // 194-192 - output_timeout_triggered, // 191 - output_state[2:0], // 190-188 - space_output[15:0], // 187-172 - occupied[21:0], // 171-150 - occupied_input[15:0], // 149-134 - - i_tvalid_i0, // 133 - i_tready_i0, // 132 - i_tlast_i0, // 131 - i_tdata_i0[63:0],// 130-67 - o_tvalid_i1, // 66 - o_tready_i1, // 65 - o_tlast_i1, // 64 - o_tdata_i1[63:0] // 63-0 - }; - - - endmodule // axi_dram_fifo - diff --git a/fpga/usrp3/lib/axi/axi_dram_fifo_tb.v b/fpga/usrp3/lib/axi/axi_dram_fifo_tb.v deleted file mode 100644 index d8d53815a..000000000 --- a/fpga/usrp3/lib/axi/axi_dram_fifo_tb.v +++ /dev/null @@ -1,421 +0,0 @@ -module axi_dram_fifo_tb; - - - - reg clk; // Global AXI clock - reg reset; // Global reset, active high. - reg clear; - wire aresetn; // Global AXI reset, active low. - // - // AXI Write address channel - // - wire [0 : 0] axi_awid; // Write address ID. This signal is the identification tag for the write address signals - wire [31 : 0] axi_awaddr; // Write address. The write address gives the address of the first transfer in a write burst - wire [7 : 0] axi_awlen; // Burst length. The burst length gives the exact number of transfers in a burst. - wire [2 : 0] axi_awsize; // Burst size. This signal indicates the size of each transfer in the burst. - wire [1 : 0] axi_awburst; // Burst type. The burst type and the size information, determine how the address is calculated - wire [0 : 0] axi_awlock; // Lock type. Provides additional information about the atomic characteristics of the transfer. - wire [3 : 0] axi_awcache; // Memory type. This signal indicates how transactions are required to progress - wire [2 : 0] axi_awprot; // Protection type. This signal indicates the privilege and security level of the transaction - wire [3 : 0] axi_awqos; // Quality of Service, QoS. The QoS identifier sent for each write transaction - wire [3 : 0] axi_awregion; // Region identifier. Permits a single physical interface on a slave to be re-used. - wire [0 : 0] axi_awuser; // User signal. Optional User-defined signal in the write address channel. - wire axi_awvalid; // Write address valid. This signal indicates that the channel is signaling valid write addr - wire axi_awready; // Write address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Write data channel. - // - wire [63 : 0] axi_wdata; // Write data - wire [7 : 0] axi_wstrb; // Write strobes. This signal indicates which byte lanes hold valid data. - wire axi_wlast; // Write last. This signal indicates the last transfer in a write burst - wire [0 : 0] axi_wuser; // User signal. Optional User-defined signal in the write data channel. - wire axi_wvalid; // Write valid. This signal indicates that valid write data and strobes are available. - wire axi_wready; // Write ready. This signal indicates that the slave can accept the write data. - // - // AXI Write response channel signals - // - wire [0 : 0] axi_bid; // Response ID tag. This signal is the ID tag of the write response. - wire [1 : 0] axi_bresp; // Write response. This signal indicates the status of the write transaction. - wire [0 : 0] axi_buser; // User signal. Optional User-defined signal in the write response channel. - wire axi_bvalid; // Write response valid. This signal indicates that the channel is signaling a valid response - wire axi_bready; // Response ready. This signal indicates that the master can accept a write response - // - // AXI Read address channel - // - wire [0 : 0] axi_arid; // Read address ID. This signal is the identification tag for the read address group of signals - wire [31 : 0] axi_araddr; // Read address. The read address gives the address of the first transfer in a read burst - wire [7 : 0] axi_arlen; // Burst length. This signal indicates the exact number of transfers in a burst. - wire [2 : 0] axi_arsize; // Burst size. This signal indicates the size of each transfer in the burst. - wire [1 : 0] axi_arburst; // Burst type. The burst type and the size information determine how the address for each transfer - wire [0 : 0] axi_arlock; // Lock type. This signal provides additional information about the atomic characteristics - wire [3 : 0] axi_arcache; // Memory type. This signal indicates how transactions are required to progress - wire [2 : 0] axi_arprot; // Protection type. This signal indicates the privilege and security level of the transaction - wire [3 : 0] axi_arqos; // Quality of Service, QoS. QoS identifier sent for each read transaction. - wire [3 : 0] axi_arregion; // Region identifier. Permits a single physical interface on a slave to be re-used - wire [0 : 0] axi_aruser; // User signal. Optional User-defined signal in the read address channel. - wire axi_arvalid; // Read address valid. This signal indicates that the channel is signaling valid read addr - wire axi_arready; // Read address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Read data channel - // - wire [0 : 0] axi_rid; // Read ID tag. This signal is the identification tag for the read data group of signals - wire [63 : 0] axi_rdata; // Read data. - wire [1 : 0] axi_rresp; // Read response. This signal indicates the status of the read transfer - wire axi_rlast; // Read last. This signal indicates the last transfer in a read burst. - wire [0 : 0] axi_ruser; // User signal. Optional User-defined signal in the read data channel. - wire axi_rvalid; // Read valid. This signal indicates that the channel is signaling the required read data. - wire axi_rready; // Read ready. This signal indicates that the master can accept the read data and response - - // - // CHDR friendly AXI stream input - // - wire [63:0] i_tdata; - wire i_tlast; - wire i_tvalid; - wire i_tready; - // - // CHDR friendly AXI Stream output - // - wire [63:0] o_tdata; - wire o_tlast; - wire o_tvalid; - wire o_tready; - - // - // These registers optionaly used - // to drive nets through procedural assignments in test bench. - // These drivers default to tri-stated. - // - - reg [63:0] i_tdata_r; - reg i_tlast_r; - reg i_tvalid_r; - reg o_tready_r; - - assign i_tdata = i_tdata_r; - assign i_tlast = i_tlast_r; - assign i_tvalid = i_tvalid_r; - assign o_tready = o_tready_r; - - initial - begin - i_tdata_r <= 64'hzzzz_zzzz_zzzz_zzzz; - i_tlast_r <= 1'bz; - i_tvalid_r <= 1'bz; - o_tready_r <= 1'bz; - end - - - - axi_dram_fifo - #(.SIZE(13)) - axi_dram_fifo_i1 - ( - .bus_clk(clk), // input s_aclk - .bus_reset(reset), // input s_aresetn - .clear(clear), - .dram_clk(clk), // input s_aclk - .dram_reset(reset), // input s_aresetn - // Write control - .m_axi_awid(axi_awid), // input [0 : 0] s_axi_awid - .m_axi_awaddr(axi_awaddr), // input [31 : 0] s_axi_awaddr - .m_axi_awlen(axi_awlen), // input [7 : 0] s_axi_awlen - .m_axi_awsize(axi_awsize), // input [2 : 0] s_axi_awsize - .m_axi_awburst(axi_awburst), // input [1 : 0] s_axi_awburst - .m_axi_awvalid(axi_awvalid), // input s_axi_awvalid - .m_axi_awready(axi_awready), // output s_axi_awready - .m_axi_awlock(), - .m_axi_awcache(), - .m_axi_awprot(), - .m_axi_awqos(), - .m_axi_awregion(), - .m_axi_awuser(), - // Write Data - .m_axi_wdata(axi_wdata), // input [63 : 0] s_axi_wdata - .m_axi_wstrb(axi_wstrb), // input [7 : 0] s_axi_wstrb - .m_axi_wlast(axi_wlast), // input s_axi_wlast - .m_axi_wvalid(axi_wvalid), // input s_axi_wvalid - .m_axi_wready(axi_wready), // output s_axi_wready - .m_axi_wuser(), - // Write Response - .m_axi_bid(axi_bid), // output [0 : 0] s_axi_bid - .m_axi_bresp(axi_bresp), // output [1 : 0] s_axi_bresp - .m_axi_bvalid(axi_bvalid), // output s_axi_bvalid - .m_axi_bready(axi_bready), // input s_axi_bready - .m_axi_buser(), - // Read Control - .m_axi_arid(axi_arid), // input [0 : 0] s_axi_arid - .m_axi_araddr(axi_araddr), // input [31 : 0] s_axi_araddr - .m_axi_arlen(axi_arlen), // input [7 : 0] s_axi_arlen - .m_axi_arsize(axi_arsize), // input [2 : 0] s_axi_arsize - .m_axi_arburst(axi_arburst), // input [1 : 0] s_axi_arburst - .m_axi_arvalid(axi_arvalid), // input s_axi_arvalid - .m_axi_arready(axi_arready), // output s_axi_arready - .m_axi_arlock(), - .m_axi_arcache(), - .m_axi_arprot(), - .m_axi_arqos(), - .m_axi_arregion(), - .m_axi_aruser(), - // Read Data - .m_axi_rid(axi_rid), // output [0 : 0] s_axi_rid - .m_axi_rdata(axi_rdata), // output [63 : 0] s_axi_rdata - .m_axi_rresp(axi_rresp), // output [1 : 0] s_axi_rresp - .m_axi_rlast(axi_rlast), // output s_axi_rlast - .m_axi_rvalid(axi_rvalid), // output s_axi_rvalid - .m_axi_rready(axi_rready), // input s_axi_rready - .m_axi_ruser(), - // CHDR in - .i_tdata(i_tdata), - .i_tlast(i_tlast), - .i_tvalid(i_tvalid), - .i_tready(i_tready), - // CHDR out - .o_tdata(o_tdata), - .o_tlast(o_tlast), - .o_tvalid(o_tvalid), - .o_tready(o_tready), - // - .supress_threshold(16'h0), - .supress_enable(1'b0) - ); - - - axi4_bram_1kx64 axi4_bram_1kx64_i1 - ( - .s_aclk(clk), // input s_aclk - .s_aresetn(aresetn), // input s_aresetn - .s_axi_awid(axi_awid), // input [0 : 0] s_axi_awid - .s_axi_awaddr(axi_awaddr), // input [31 : 0] s_axi_awaddr - .s_axi_awlen(axi_awlen), // input [7 : 0] s_axi_awlen - .s_axi_awsize(axi_awsize), // input [2 : 0] s_axi_awsize - .s_axi_awburst(axi_awburst), // input [1 : 0] s_axi_awburst - .s_axi_awvalid(axi_awvalid), // input s_axi_awvalid - .s_axi_awready(axi_awready), // output s_axi_awready - .s_axi_wdata(axi_wdata), // input [63 : 0] s_axi_wdata - .s_axi_wstrb(axi_wstrb), // input [7 : 0] s_axi_wstrb - .s_axi_wlast(axi_wlast), // input s_axi_wlast - .s_axi_wvalid(axi_wvalid), // input s_axi_wvalid - .s_axi_wready(axi_wready), // output s_axi_wready - .s_axi_bid(axi_bid), // output [0 : 0] s_axi_bid - .s_axi_bresp(axi_bresp), // output [1 : 0] s_axi_bresp - .s_axi_bvalid(axi_bvalid), // output s_axi_bvalid - .s_axi_bready(axi_bready), // input s_axi_bready - .s_axi_arid(axi_arid), // input [0 : 0] s_axi_arid - .s_axi_araddr(axi_araddr), // input [31 : 0] s_axi_araddr - .s_axi_arlen(axi_arlen), // input [7 : 0] s_axi_arlen - .s_axi_arsize(axi_arsize), // input [2 : 0] s_axi_arsize - .s_axi_arburst(axi_arburst), // input [1 : 0] s_axi_arburst - .s_axi_arvalid(axi_arvalid), // input s_axi_arvalid - .s_axi_arready(axi_arready), // output s_axi_arready - .s_axi_rid(axi_rid), // output [0 : 0] s_axi_rid - .s_axi_rdata(axi_rdata), // output [63 : 0] s_axi_rdata - .s_axi_rresp(axi_rresp), // output [1 : 0] s_axi_rresp - .s_axi_rlast(axi_rlast), // output s_axi_rlast - .s_axi_rvalid(axi_rvalid), // output s_axi_rvalid - .s_axi_rready(axi_rready) // input s_axi_rready - ); - - - // - // - // - - - task send_ramp; - input [31:0] burst_count; - input [31:0] len; - input [31:0] sid; - - reg [31:0] data; - reg [11:0] seqno; - - begin - seqno = 0; - data = 0; - send_packet(len, data, 0, seqno, (burst_count==1), 0, sid); - seqno = seqno + 1; - data <= data + len; - - if(burst_count > 2) - repeat (burst_count - 2) - begin - send_packet(len, data, 64'h0, seqno, 0, 0, sid); - seqno = seqno + 1; - data <= data + len; - end - if(burst_count > 1) - send_packet(len, data, 64'h0, seqno, 1, 0, sid); - end - endtask // send_ramp - - - task send_dc; - input [31:0] burst_count; - input [31:0] len; - input [31:0] sid; - - reg [31:0] data; - reg [11:0] seqno; - - begin - seqno = 0; - data = 1 << 14; - send_packet(len, data, 0, seqno, (burst_count==1), 0, sid); - seqno = seqno + 1; - - - if(burst_count > 2) - repeat (burst_count - 2) - begin - send_packet(len, data, 64'h0, seqno, 0, 0, sid); - seqno = seqno + 1; - - end - if(burst_count > 1) - send_packet(len, data, 64'h0, seqno, 1, 0, sid); - end - endtask // send_ramp - - - task send_burst; - input [31:0] burst_count; - input [31:0] len; - input [31:0] start_data; - input [63:0] send_time; - input [11:0] start_seqnum; - input send_at; - input [31:0] sid; - - reg [11:0] seqno; - - begin - seqno = start_seqnum; - send_packet(len, {seqno,start_data[15:0]}, send_time, seqno, (burst_count==1), send_at, sid); - seqno = seqno + 1; - - if(burst_count > 2) - repeat (burst_count - 2) - begin - send_packet(len, {seqno,start_data[15:0]}, 64'h0, seqno, 0, 0, sid); - seqno = seqno + 1; - end - if(burst_count > 1) - send_packet(len, {seqno,start_data[15:0]}, 64'h0, seqno, 1, 0, sid); - end - endtask // send_burst - - task send_packet; - input [31:0] len; - input [31:0] start_data; - input [63:0] send_time; - input [11:0] pkt_seqnum; - input eob; - input send_at; - input [31:0] sid; - - reg [31:0] samp0, samp1; - - - begin - // Send a packet - samp0 <= start_data; - samp1 <= start_data + 1; - @(posedge clk); - - i_tlast_r <= 0; - i_tdata_r <= { 1'b0, 1'b0 /*trl*/, send_at, eob, pkt_seqnum, len[15:0]+16'd2+send_at+send_at, sid }; - i_tvalid_r <= 1; - @(posedge clk) - if(send_at) - begin - i_tdata_r <= send_time; - @(posedge clk); - end - - repeat (len[31:1]+len[0]-1) - begin - i_tdata_r <= {samp0,samp1}; - samp0 <= samp0 + 2; - samp1 <= samp1 + 2; - @(posedge clk); - end - - i_tdata_r <= {samp0,samp1}; - i_tlast_r <= 1'b1; - @(posedge clk); - i_tvalid_r <= 0; - @(posedge clk); - end - endtask // send_packet - - task send_raw_packet; - input [31:0] len; - - reg [63:0] data; - - begin - data = 0; - @(posedge clk); - repeat (len-1) begin - i_tlast_r <= 0; - i_tdata_r <= data; - i_tvalid_r <= 1; - @(posedge clk); - while (~i_tready) @(posedge clk); - data = data + 1; - end - i_tlast_r <= 1; - i_tdata_r <= data; - i_tvalid_r <= 1; - @(posedge clk); - while (~i_tready) @(posedge clk); - i_tvalid_r <= 0; - @(posedge clk); - end - endtask // send_raw_packet - - task receive_raw_packet; - input [31:0] len; - output fail; - reg [63:0] data; - - begin - data = 0; - fail = 0; - - @(posedge clk); - repeat (len-1) begin - o_tready_r <= 1; - @(posedge clk); - while (~o_tvalid) @(posedge clk); - //$display("Data = %d, o_tdata = %d, o_tlast = %d",data,o_tdata,o_tlast); - - fail = fail || (data !== o_tdata); - fail = fail || ~(o_tlast === 0); - data = data + 1; - - end - o_tready_r <= 1; - @(posedge clk); - while (~o_tvalid) @(posedge clk); - //$display("Data = %d, o_tdata = %d, o_tlast = %d",data,o_tdata,o_tlast); - fail = fail || (data !== o_tdata); - fail = fail || ~(o_tlast === 1); - o_tready_r <= 0; - @(posedge clk); - if (fail) $display("receive_raw_packet size %d failed",len); - - end - endtask // receive_raw_packet - - - - assign aresetn = ~reset; - - // - // Bring in a simulation script here - // - `include "simulation_script.v" - -endmodule // axi_dram_fifo_tb diff --git a/fpga/usrp3/lib/axi/axi_embed_tlast.v b/fpga/usrp3/lib/axi/axi_embed_tlast.v deleted file mode 100644 index 065f59fd4..000000000 --- a/fpga/usrp3/lib/axi/axi_embed_tlast.v +++ /dev/null @@ -1,128 +0,0 @@ -// -// AXI stream neds N+1 bits to transmit packets of N bits so that the LAST bit can be represented. -// LAST occurs relatively infrequently and can be synthesized by using an in-band ESC code to generate -// a multi-word sequence to encode it (and the escape character when it appears as data input). -// -// 0x1234567887654321 with last becomes -// 0xDEADBEEFFEEDCAFE 0x0000000000000001 0x1234567887654321 -// -// 0xDEADBEEFFEEDCAFE with last becomes -// 0xDEADBEEFFEEDCAFE 0x0000000000000001 0xDEADBEEFFEEDCAFE -// -// 0xDEADBEEFFEEDCAFE without last becomes -// 0xDEADBEEFFEEDCAFE 0x0000000000000000 0xDEADBEEFFEEDCAFE -// - -module axi_embed_tlast - #(parameter WIDTH=64) - ( - input clk, - input reset, - input clear, - // - input [WIDTH-1:0] i_tdata, - input i_tlast, - input i_tvalid, - output i_tready, - // - output reg [WIDTH-1:0] o_tdata, - output o_tvalid, - input o_tready - - ); - - localparam PASS = 0; - localparam ZERO = 1; - localparam ONE = 2; - localparam ESCAPE = 3; - - localparam IDLE = 0; - localparam LAST = 1; - localparam ESC = 2; - localparam FINISH = 3; - - reg [1:0] state, next_state; - - reg [1:0] select; - - reg [31:0] checksum; - - always @(posedge clk) - if (reset | clear) begin - checksum <= 0; - end else if (i_tready && i_tvalid && i_tlast) begin - checksum <= 0; - end else if (i_tready && i_tvalid) begin - checksum <= checksum + i_tdata[31:0] + i_tdata[63:32]; - end - - always @(posedge clk) - if (reset | clear) begin - state <= IDLE; - end else begin if (o_tready) - state <= next_state; - end - - always @(*) begin - case(state) - IDLE: begin - if (i_tlast && i_tvalid) - begin - next_state = LAST; - select = ESCAPE; - end - else if ((i_tdata == 64'hDEADBEEFFEEDCAFE) && i_tvalid) - begin - next_state = ESC; - select = ESCAPE; - end - else - begin - next_state = IDLE; - select = PASS; - end - end // case: IDLE - // - // - LAST: begin - select = ONE; - next_state = FINISH; - end - // - // - ESC: begin - select = ZERO; - next_state = FINISH; - end - // - // - FINISH: begin - select = PASS; - if (i_tvalid) - next_state = IDLE; - else - next_state = FINISH; - end - endcase // case(state) - end // always @ (*) - - // - // Muxes - // - always @* - begin - case(select) - PASS: o_tdata = i_tdata; - ZERO: o_tdata = 0; - ONE: o_tdata = {checksum[31:0],32'h1}; - ESCAPE: o_tdata = 64'hDEADBEEFFEEDCAFE; - endcase // case(select) - end - - assign o_tvalid = (select == PASS) ? i_tvalid : 1'b1; - assign i_tready = (select == PASS) ? o_tready : 1'b0; - -endmodule // axi_embed_tlast - - - diff --git a/fpga/usrp3/lib/axi/axi_extract_tlast.v b/fpga/usrp3/lib/axi/axi_extract_tlast.v deleted file mode 100644 index 16d6d17c2..000000000 --- a/fpga/usrp3/lib/axi/axi_extract_tlast.v +++ /dev/null @@ -1,149 +0,0 @@ -// -// AXI stream neds N+1 bits to transmit packets of N bits so that the LAST bit can be represented. -// LAST occurs relatively infrequently and can be synthesized by using an in-band ESC code to generate -// a multi-word sequence to encode it (and the escape character when it appears as data input). -// -// 0x1234567887654321 with last becomes -// 0xDEADBEEFFEEDCAFE 0x0000000000000001 0x1234567887654321 -// -// 0xDEADBEEFFEEDCAFE with last becomes -// 0xDEADBEEFFEEDCAFE 0x0000000000000001 0xDEADBEEFFEEDCAFE -// -// 0xDEADBEEFFEEDCAFE without last becomes -// 0xDEADBEEFFEEDCAFE 0x0000000000000000 0xDEADBEEFFEEDCAFE -// - -module axi_extract_tlast - #(parameter WIDTH=64) - ( - input clk, - input reset, - input clear, - // - input [WIDTH-1:0] i_tdata, - input i_tvalid, - output reg i_tready, - // - output [WIDTH-1:0] o_tdata, - output reg o_tlast, - output reg o_tvalid, - input o_tready, - // - output reg checksum_error_reg - - ); - - reg [1:0] state, next_state; - - localparam IDLE = 0; - localparam EXTRACT1 = 1; - localparam EXTRACT2 = 2; - localparam EXTRACT3 = 3; - - assign o_tdata = i_tdata; - - reg [31:0] checksum, old_checksum; - reg checksum_error; - - - always @(posedge clk) - if (reset | clear) begin - checksum <= 0; - old_checksum <= 0; - end else if (o_tready && i_tvalid && o_tlast) begin - checksum <= 0; - old_checksum <= 0; - end else if (i_tready && i_tvalid && (state == IDLE)) begin - checksum <= checksum + i_tdata[31:0] + i_tdata[63:32]; - old_checksum <= checksum; - end - - always @(posedge clk) - checksum_error_reg <= checksum_error; - - always @(posedge clk) - if (reset | clear) begin - state <= IDLE; - end else begin - state <= next_state; - end - - always @(*) begin - checksum_error = 0; - case(state) - // - // Search for Escape sequence "0xDEADBEEFFEEDCAFE" - // If ESC found don't pass data downstream but transition to next state. - // else pass data downstream. - // - IDLE: begin - o_tlast = 1'b0; - if ((i_tdata == 64'hDEADBEEFFEEDCAFE) && i_tvalid) - begin - next_state = EXTRACT1; - o_tvalid = 1'b0; - i_tready = 1'b1; - end - else - begin - next_state = IDLE; - o_tvalid = i_tvalid; - i_tready = o_tready; - end // else: !if((i_tdata == 'hDEADBEEFFEEDCAFE) && i_tvalid) - end // case: IDLE - // - // Look at next data. If it's a 0x1 then o_tlast should be asserted with next data word. - // if it's 0x0 then it signals emulation of the Escape code in the original data stream - // and we should just pass the next data word through unchanged with no o_tlast indication. - // - EXTRACT1: begin - o_tvalid = 1'b0; - i_tready = 1'b1; - o_tlast = 1'b0; - if (i_tvalid) begin - if (i_tdata[31:0] == 'h1) - begin - if (old_checksum != i_tdata[63:32]) - checksum_error = 1'b1; - next_state = EXTRACT2; - end - else // We assume emulation and don't look for illegal codes. - begin - next_state = EXTRACT3; - end // else: !if(i_tdata == 'h1) - end else begin // if (i_tvalid) - next_state = EXTRACT1; - end // else: !if(i_tvalid) - end // case: EXTRACT1 - // - // Assert o_tlast with data word. - // - EXTRACT2: begin - o_tvalid = i_tvalid; - i_tready = o_tready; - o_tlast = 1'b1; - if (i_tvalid & o_tready) - next_state = IDLE; - else - next_state = EXTRACT2; - end - // - // Emulation, don't assert o_tlast with dataword. - // - EXTRACT3: begin - o_tvalid = i_tvalid; - i_tready = o_tready; - o_tlast = 1'b0; - if (i_tvalid & o_tready) - next_state = IDLE; - else - next_state = EXTRACT2; - end - endcase // case(state) - end - - - -endmodule // axi_extract_tlast - -
\ No newline at end of file diff --git a/fpga/usrp3/lib/axi/axi_fast_extract_tlast.v b/fpga/usrp3/lib/axi/axi_fast_extract_tlast.v deleted file mode 100644 index d4f3dd26c..000000000 --- a/fpga/usrp3/lib/axi/axi_fast_extract_tlast.v +++ /dev/null @@ -1,187 +0,0 @@ -// -// Ultra fast critical path FIFO. -// Only 2 entrys but no combinatorial feed through paths -// - - -module axi_fast_extract_tlast - #(parameter WIDTH=64) - ( - input clk, - input reset, - input clear, - // - input [WIDTH-1:0] i_tdata, - input i_tvalid, - output reg i_tready, - // - output [WIDTH-1:0] o_tdata, - output o_tlast, - output reg o_tvalid, - input o_tready - ); - - reg [WIDTH:0] data_reg1, data_reg2; - - reg [1:0] fifo_state; - - localparam EMPTY = 0; - localparam HALF = 1; - localparam FULL = 2; - - reg [1:0] extract_state; - - localparam IDLE = 0; - localparam EXTRACT1 = 1; - localparam EXTRACT2 = 2; - localparam EXTRACT3 = 3; - - - always @(posedge clk) - if (reset | clear) begin - fifo_state <= EMPTY; - end else begin - case (fifo_state) - // Nothing in either register. - // Upstream can always push data to us. - // Downstream has nothing to take from us. - EMPTY: begin - if ((extract_state == IDLE) && (i_tdata == 64'hDEADBEEFFEEDCAFE) && i_tvalid) begin - // Embeded escpae code received. - extract_state <= EXTRACT1; - i_tready <= 1'b1; - o_tvalid <= 1'b0; - fifo_state <= EMPTY; - end else if ((extract_state == EXTRACT1) && i_tvalid) begin - // Now work out if its a genuine embeded tlast or emulation. - i_tready <= 1'b1; - o_tvalid <= 1'b0; - fifo_state <= EMPTY; - if (i_tdata[31:0] == 'h1) begin - extract_state <= EXTRACT2; - end else begin - extract_state <= EXTRACT3; - end - end else if ((extract_state == EXTRACT2) && i_tvalid) begin - // Extract tlast. - data_reg1 <= {1'b1,i_tdata}; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - fifo_state <= HALF; - extract_state <= IDLE; - end else if (i_tvalid) begin - // Get here both for normal data and for EXTRACT3 emulation data. - data_reg1 <= {1'b0,i_tdata}; - fifo_state <= HALF; - extract_state <= IDLE; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end else begin - // Nothing to do. - fifo_state <= EMPTY; - i_tready <= 1'b1; - o_tvalid <= 1'b0; - end - end - // First Register Full. - // Upstream can always push data to us. - // Downstream can always read from us. - HALF: begin - if ((extract_state == IDLE) && (i_tdata == 64'hDEADBEEFFEEDCAFE) && i_tvalid) begin - // Embeded escpae code received. - extract_state <= EXTRACT1; - if (o_tready) begin - // If meanwhile we get read then go empty... - i_tready <= 1'b1; - o_tvalid <= 1'b0; - fifo_state <= EMPTY; - end else begin - // ...else stay half full. - fifo_state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end - end else if ((extract_state == EXTRACT1) && i_tvalid) begin - // Now work out if its a genuine embeded tlast or emulation. - if (i_tdata[31:0] == 'h1) begin - extract_state <= EXTRACT2; - end else begin - extract_state <= EXTRACT3; - end - if (o_tready) begin - // If meanwhile we get read then go empty... - i_tready <= 1'b1; - o_tvalid <= 1'b0; - fifo_state <= EMPTY; - end else begin - // ...else stay half full. - fifo_state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end - end else if ((extract_state == EXTRACT2) && i_tvalid) begin - // Extract tlast. - data_reg1 <= {1'b1,i_tdata}; - extract_state <= IDLE; - if (o_tready) begin - // We get read and writen same cycle... - i_tready <= 1'b1; - o_tvalid <= 1'b1; - fifo_state <= HALF; - end else begin - // ...or we get written and go full. - data_reg2 <= data_reg1; - i_tready <= 1'b0; - o_tvalid <= 1'b1; - fifo_state <= FULL; - end - end else if (i_tvalid) begin - // Get here both for normal data and for EXTRACT3 emulation data. - data_reg1 <= {1'b0,i_tdata}; - extract_state <= IDLE; - if (o_tready) begin - // We get read and writen same cycle... - fifo_state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end else begin - // ...or we get written and go full. - data_reg2 <= data_reg1; - i_tready <= 1'b0; - o_tvalid <= 1'b1; - fifo_state <= FULL; - end - end else if (o_tready) begin // if (i_tvalid) - // Only getting read this cycle so go empty - fifo_state <= EMPTY; - i_tready <= 1'b1; - o_tvalid <= 1'b0; - end else begin - // Absolutley nothing happens, everything stays the same. - fifo_state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end - end // case: HALF - // Both Registers Full. - // Upstream can not push to us in this fifo_state. - // Downstream can always read from us. - FULL: begin - if (o_tready) begin - fifo_state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end - else begin - fifo_state <= FULL; - i_tready <= 1'b0; - o_tvalid <= 1'b1; - end - end - endcase // case(fifo_state) - end // else: !if(reset | clear) - - assign {o_tlast,o_tdata} = (fifo_state == FULL) ? data_reg2 : data_reg1; - - -endmodule // axi_fast_fifo diff --git a/fpga/usrp3/lib/axi/axi_fast_fifo.v b/fpga/usrp3/lib/axi/axi_fast_fifo.v deleted file mode 100644 index a24db3cc8..000000000 --- a/fpga/usrp3/lib/axi/axi_fast_fifo.v +++ /dev/null @@ -1,102 +0,0 @@ -// -// Ultra fast critical path FIFO. -// Only 2 entrys but no combinatorial feed through paths -// - - -module axi_fast_fifo - #(parameter WIDTH=64) - ( - input clk, - input reset, - input clear, - // - input [WIDTH-1:0] i_tdata, - input i_tvalid, - output reg i_tready, - // - output [WIDTH-1:0] o_tdata, - output reg o_tvalid, - input o_tready - ); - - reg [WIDTH-1:0] data_reg1, data_reg2; - - reg [1:0] state; - - localparam EMPTY = 0; - localparam HALF = 1; - localparam FULL = 2; - - always @(posedge clk) - if (reset | clear) begin - state <= EMPTY; - data_reg1 <= 0; - data_reg2 <= 0; - o_tvalid <= 1'b0; - i_tready <= 1'b0; - - end else begin - case (state) - // Nothing in either register. - // Upstream can always push data to us. - // Downstream has nothing to take from us. - EMPTY: begin - if (i_tvalid) begin - data_reg1 <= i_tdata; - state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end else begin - state <= EMPTY; - i_tready <= 1'b1; - o_tvalid <= 1'b0; - end - end - // First Register Full. - // Upstream can always push data to us. - // Downstream can always read from us. - HALF: begin - if (i_tvalid && o_tready) begin - data_reg1 <= i_tdata; - state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end else if (i_tvalid) begin - data_reg1 <= i_tdata; - data_reg2 <= data_reg1; - state <= FULL; - i_tready <= 1'b0; - o_tvalid <= 1'b1; - end else if (o_tready) begin - state <= EMPTY; - i_tready <= 1'b1; - o_tvalid <= 1'b0; - end else begin - state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end - end // case: HALF - // Both Registers Full. - // Upstream can not push to us in this state. - // Downstream can always read from us. - FULL: begin - if (o_tready) begin - state <= HALF; - i_tready <= 1'b1; - o_tvalid <= 1'b1; - end - else begin - state <= FULL; - i_tready <= 1'b0; - o_tvalid <= 1'b1; - end - end - endcase // case(state) - end // else: !if(reset | clear) - - assign o_tdata = (state == FULL) ? data_reg2 : data_reg1; - - -endmodule // axi_fast_fifo diff --git a/fpga/usrp3/lib/axi/axi_lite_slave.v b/fpga/usrp3/lib/axi/axi_lite_slave.v deleted file mode 100644 index 54cfa9c53..000000000 --- a/fpga/usrp3/lib/axi/axi_lite_slave.v +++ /dev/null @@ -1,42 +0,0 @@ -module axi_lite_slave - ( - input aclk, // Global AXI clock - input aresetn, // Global AXI reset, active low. - // - // AXI Write address channel - // - input [31 : 0] m_axi_awaddr, // Write address. The write address gives the address of the first transfer in a write burst - input [2 : 0] m_axi_awprot, // Protection type. This signal indicates the privilege and security level of the transaction - input m_axi_awvalid, // Write address valid. This signal indicates that the channel is signaling valid write addr - output m_axi_awready, // Write address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Write data channel. - // - input [31 : 0] m_axi_wdata, // Write data - input [3 : 0] m_axi_wstrb, // Write strobes. This signal indicates which byte lanes hold valid data. - input m_axi_wvalid, // Write valid. This signal indicates that valid write data and strobes are available. - output m_axi_wready, // Write ready. This signal indicates that the slave can accept the write data. - // - // AXI Write response channel signals - // - output [1 : 0] m_axi_bresp, // Write response. This signal indicates the status of the write transaction. - output m_axi_bvalid, // Write response valid. This signal indicates that the channel is signaling a valid response - input m_axi_bready, // Response ready. This signal indicates that the master can accept a write response - // - // AXI Read address channel - // - input [31 : 0] m_axi_araddr, // Read address. The read address gives the address of the first transfer in a read burst - input [2 : 0] m_axi_arprot, // Protection type. This signal indicates the privilege and security level of the transaction - input m_axi_arvalid, // Read address valid. This signal indicates that the channel is signaling valid read addr - output m_axi_arready, // Read address ready. This signal indicates that the slave is ready to accept an address - // - // AXI Read data channel - // - output [31 : 0] m_axi_rdata, // Read data. - output [1 : 0] m_axi_rresp, // Read response. This signal indicates the status of the read transfer - output m_axi_rvalid, // Read valid. This signal indicates that the channel is signaling the required read data. - input m_axi_rready, // Read ready. This signal indicates that the master can accept the read data and response - // - // - // - )
\ No newline at end of file |