262 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
// (C) 2001-2015 Altera Corporation. All rights reserved.
 | 
						|
// Your use of Altera Corporation's design tools, logic functions and other 
 | 
						|
// software and tools, and its AMPP partner logic functions, and any output 
 | 
						|
// files any of the foregoing (including device programming or simulation 
 | 
						|
// files), and any associated documentation or information are expressly subject 
 | 
						|
// to the terms and conditions of the Altera Program License Subscription 
 | 
						|
// Agreement, Altera MegaCore Function License Agreement, or other applicable 
 | 
						|
// license agreement, including, without limitation, that your use is for the 
 | 
						|
// sole purpose of programming logic devices manufactured by Altera and sold by 
 | 
						|
// Altera or its authorized distributors.  Please refer to the applicable 
 | 
						|
// agreement for further details.
 | 
						|
 | 
						|
 | 
						|
`timescale 1 ns / 1 ns
 | 
						|
 | 
						|
// -----------------------------------------------------
 | 
						|
// Top level for the burst adapter. This selects the
 | 
						|
// implementation for the adapter, based on the
 | 
						|
// parameterization.
 | 
						|
// -----------------------------------------------------
 | 
						|
module altera_merlin_burst_adapter
 | 
						|
#(
 | 
						|
    parameter 
 | 
						|
    // Indicates the implementation to instantiate:
 | 
						|
    //    "13.1" means the slow, inexpensive generic burst converter.
 | 
						|
    //    "new" means the fast, expensive per-burst converter.
 | 
						|
    ADAPTER_VERSION             = "13.1",
 | 
						|
 | 
						|
    // Indicates if this adapter needs to support read bursts
 | 
						|
    // (almost always true).
 | 
						|
    COMPRESSED_READ_SUPPORT     = 1,
 | 
						|
 | 
						|
    // Standard Merlin packet parameters that indicate
 | 
						|
    // field position within the packet
 | 
						|
    PKT_BEGIN_BURST             = 81,
 | 
						|
    PKT_ADDR_H                  = 79,
 | 
						|
    PKT_ADDR_L                  = 48,
 | 
						|
    PKT_BYTE_CNT_H              = 5,
 | 
						|
    PKT_BYTE_CNT_L              = 0,
 | 
						|
    PKT_BURSTWRAP_H             = 11,
 | 
						|
    PKT_BURSTWRAP_L             = 6,
 | 
						|
    PKT_TRANS_COMPRESSED_READ   = 14,
 | 
						|
    PKT_TRANS_WRITE             = 13,
 | 
						|
    PKT_TRANS_READ              = 12,
 | 
						|
    PKT_BYTEEN_H                = 83,
 | 
						|
    PKT_BYTEEN_L                = 80,
 | 
						|
    PKT_BURST_TYPE_H            = 88,
 | 
						|
    PKT_BURST_TYPE_L            = 87,
 | 
						|
    PKT_BURST_SIZE_H            = 86,
 | 
						|
    PKT_BURST_SIZE_L            = 84,
 | 
						|
    ST_DATA_W                   = 89,
 | 
						|
    ST_CHANNEL_W                = 8,
 | 
						|
 | 
						|
    // Component-specific parameters. Explained
 | 
						|
    // in the implementation levels
 | 
						|
    IN_NARROW_SIZE              = 0,
 | 
						|
    NO_WRAP_SUPPORT             = 0,
 | 
						|
    INCOMPLETE_WRAP_SUPPORT     = 1,
 | 
						|
    BURSTWRAP_CONST_MASK        = 0,
 | 
						|
    BURSTWRAP_CONST_VALUE       = -1,
 | 
						|
 | 
						|
    OUT_NARROW_SIZE             = 0,
 | 
						|
    OUT_FIXED                   = 0,
 | 
						|
    OUT_COMPLETE_WRAP           = 0,
 | 
						|
    BYTEENABLE_SYNTHESIS        = 0,
 | 
						|
    PIPE_INPUTS                 = 0,
 | 
						|
 | 
						|
    OUT_BYTE_CNT_H              = 5,
 | 
						|
    OUT_BURSTWRAP_H             = 11
 | 
						|
)
 | 
						|
(
 | 
						|
    input                            clk,
 | 
						|
    input                            reset,
 | 
						|
 | 
						|
    // -------------------
 | 
						|
    // Command Sink (Input)
 | 
						|
    // -------------------
 | 
						|
    input                            sink0_valid,
 | 
						|
    input [ST_DATA_W-1 : 0]          sink0_data,
 | 
						|
    input [ST_CHANNEL_W-1 : 0]       sink0_channel,
 | 
						|
    input                            sink0_startofpacket,
 | 
						|
    input                            sink0_endofpacket,
 | 
						|
    output reg                       sink0_ready,
 | 
						|
 | 
						|
    // -------------------
 | 
						|
    // Command Source (Output)
 | 
						|
    // -------------------
 | 
						|
    output wire                      source0_valid,
 | 
						|
    output wire [ST_DATA_W-1 : 0]    source0_data,
 | 
						|
    output wire [ST_CHANNEL_W-1 : 0] source0_channel,
 | 
						|
    output wire                      source0_startofpacket,
 | 
						|
    output wire                      source0_endofpacket,
 | 
						|
    input                            source0_ready
 | 
						|
);
 | 
						|
 | 
						|
    localparam PKT_BURSTWRAP_W = PKT_BURSTWRAP_H - PKT_BURSTWRAP_L + 1;
 | 
						|
 | 
						|
    generate if (COMPRESSED_READ_SUPPORT == 0) begin : altera_merlin_burst_adapter_uncompressed_only
 | 
						|
 | 
						|
        // -------------------------------------------------------------------
 | 
						|
        // The reduced version of the adapter is only meant to be used on
 | 
						|
        // non-bursting wide to narrow links.
 | 
						|
        // -------------------------------------------------------------------
 | 
						|
        altera_merlin_burst_adapter_uncompressed_only #(
 | 
						|
            .PKT_BYTE_CNT_H            (PKT_BYTE_CNT_H),
 | 
						|
            .PKT_BYTE_CNT_L            (PKT_BYTE_CNT_L),
 | 
						|
            .PKT_BYTEEN_H              (PKT_BYTEEN_H),
 | 
						|
            .PKT_BYTEEN_L              (PKT_BYTEEN_L),
 | 
						|
            .ST_DATA_W                 (ST_DATA_W),
 | 
						|
            .ST_CHANNEL_W              (ST_CHANNEL_W)
 | 
						|
        ) burst_adapter (
 | 
						|
            .clk                   (clk),
 | 
						|
            .reset                 (reset),
 | 
						|
            .sink0_valid           (sink0_valid),
 | 
						|
            .sink0_data            (sink0_data),
 | 
						|
            .sink0_channel         (sink0_channel),
 | 
						|
            .sink0_startofpacket   (sink0_startofpacket),
 | 
						|
            .sink0_endofpacket     (sink0_endofpacket),
 | 
						|
            .sink0_ready           (sink0_ready),
 | 
						|
            .source0_valid         (source0_valid),
 | 
						|
            .source0_data          (source0_data),
 | 
						|
            .source0_channel       (source0_channel),
 | 
						|
            .source0_startofpacket (source0_startofpacket),
 | 
						|
            .source0_endofpacket   (source0_endofpacket),
 | 
						|
            .source0_ready         (source0_ready)
 | 
						|
        );
 | 
						|
 | 
						|
    end
 | 
						|
    else if (ADAPTER_VERSION == "13.1") begin : altera_merlin_burst_adapter_13_1
 | 
						|
 | 
						|
        // -----------------------------------------------------
 | 
						|
        // This is the generic converter implementation, which attempts
 | 
						|
        // to convert all burst types with a generalized conversion
 | 
						|
        // function. This results in low area, but low fmax.
 | 
						|
        // -----------------------------------------------------
 | 
						|
        altera_merlin_burst_adapter_13_1 #(
 | 
						|
            .PKT_BEGIN_BURST           (PKT_BEGIN_BURST),
 | 
						|
            .PKT_ADDR_H                (PKT_ADDR_H ),
 | 
						|
            .PKT_ADDR_L                (PKT_ADDR_L),
 | 
						|
            .PKT_BYTE_CNT_H            (PKT_BYTE_CNT_H),
 | 
						|
            .PKT_BYTE_CNT_L            (PKT_BYTE_CNT_L ),
 | 
						|
            .PKT_BURSTWRAP_H           (PKT_BURSTWRAP_H),
 | 
						|
            .PKT_BURSTWRAP_L           (PKT_BURSTWRAP_L),
 | 
						|
            .PKT_TRANS_COMPRESSED_READ (PKT_TRANS_COMPRESSED_READ),
 | 
						|
            .PKT_TRANS_WRITE           (PKT_TRANS_WRITE),
 | 
						|
            .PKT_TRANS_READ            (PKT_TRANS_READ),
 | 
						|
            .PKT_BYTEEN_H              (PKT_BYTEEN_H),
 | 
						|
            .PKT_BYTEEN_L              (PKT_BYTEEN_L),
 | 
						|
            .PKT_BURST_TYPE_H          (PKT_BURST_TYPE_H),
 | 
						|
            .PKT_BURST_TYPE_L          (PKT_BURST_TYPE_L),
 | 
						|
            .PKT_BURST_SIZE_H          (PKT_BURST_SIZE_H),
 | 
						|
            .PKT_BURST_SIZE_L          (PKT_BURST_SIZE_L),
 | 
						|
            .IN_NARROW_SIZE            (IN_NARROW_SIZE),
 | 
						|
            .BYTEENABLE_SYNTHESIS      (BYTEENABLE_SYNTHESIS),
 | 
						|
            .OUT_NARROW_SIZE           (OUT_NARROW_SIZE),
 | 
						|
            .OUT_FIXED                 (OUT_FIXED),
 | 
						|
            .OUT_COMPLETE_WRAP         (OUT_COMPLETE_WRAP),
 | 
						|
            .ST_DATA_W                 (ST_DATA_W),
 | 
						|
            .ST_CHANNEL_W              (ST_CHANNEL_W),
 | 
						|
            .BURSTWRAP_CONST_MASK      (BURSTWRAP_CONST_MASK),
 | 
						|
            .BURSTWRAP_CONST_VALUE     (BURSTWRAP_CONST_VALUE),
 | 
						|
            .PIPE_INPUTS               (PIPE_INPUTS),
 | 
						|
            .NO_WRAP_SUPPORT           (NO_WRAP_SUPPORT),
 | 
						|
            .OUT_BYTE_CNT_H            (OUT_BYTE_CNT_H),
 | 
						|
            .OUT_BURSTWRAP_H           (OUT_BURSTWRAP_H)
 | 
						|
        ) burst_adapter (
 | 
						|
            .clk                   (clk),
 | 
						|
            .reset                 (reset),
 | 
						|
            .sink0_valid           (sink0_valid),
 | 
						|
            .sink0_data            (sink0_data),
 | 
						|
            .sink0_channel         (sink0_channel),
 | 
						|
            .sink0_startofpacket   (sink0_startofpacket),
 | 
						|
            .sink0_endofpacket     (sink0_endofpacket),
 | 
						|
            .sink0_ready           (sink0_ready),
 | 
						|
            .source0_valid         (source0_valid),
 | 
						|
            .source0_data          (source0_data),
 | 
						|
            .source0_channel       (source0_channel),
 | 
						|
            .source0_startofpacket (source0_startofpacket),
 | 
						|
            .source0_endofpacket   (source0_endofpacket),
 | 
						|
            .source0_ready         (source0_ready)
 | 
						|
        );
 | 
						|
 | 
						|
    end
 | 
						|
    else begin : altera_merlin_burst_adapter_new
 | 
						|
 | 
						|
        // -----------------------------------------------------
 | 
						|
        // This is the per-burst-type converter implementation. This attempts
 | 
						|
        // to convert bursts with specialized functions for each burst
 | 
						|
        // type. This typically results in higher area, but higher fmax.
 | 
						|
        // -----------------------------------------------------
 | 
						|
        altera_merlin_burst_adapter_new #(
 | 
						|
            .PKT_BEGIN_BURST           (PKT_BEGIN_BURST),
 | 
						|
            .PKT_ADDR_H                (PKT_ADDR_H ),
 | 
						|
            .PKT_ADDR_L                (PKT_ADDR_L),
 | 
						|
            .PKT_BYTE_CNT_H            (PKT_BYTE_CNT_H),
 | 
						|
            .PKT_BYTE_CNT_L            (PKT_BYTE_CNT_L ),
 | 
						|
            .PKT_BURSTWRAP_H           (PKT_BURSTWRAP_H),
 | 
						|
            .PKT_BURSTWRAP_L           (PKT_BURSTWRAP_L),
 | 
						|
            .PKT_TRANS_COMPRESSED_READ (PKT_TRANS_COMPRESSED_READ),
 | 
						|
            .PKT_TRANS_WRITE           (PKT_TRANS_WRITE),
 | 
						|
            .PKT_TRANS_READ            (PKT_TRANS_READ),
 | 
						|
            .PKT_BYTEEN_H              (PKT_BYTEEN_H),
 | 
						|
            .PKT_BYTEEN_L              (PKT_BYTEEN_L),
 | 
						|
            .PKT_BURST_TYPE_H          (PKT_BURST_TYPE_H),
 | 
						|
            .PKT_BURST_TYPE_L          (PKT_BURST_TYPE_L),
 | 
						|
            .PKT_BURST_SIZE_H          (PKT_BURST_SIZE_H),
 | 
						|
            .PKT_BURST_SIZE_L          (PKT_BURST_SIZE_L),
 | 
						|
            .IN_NARROW_SIZE            (IN_NARROW_SIZE),
 | 
						|
            .BYTEENABLE_SYNTHESIS      (BYTEENABLE_SYNTHESIS),
 | 
						|
            .OUT_NARROW_SIZE           (OUT_NARROW_SIZE),
 | 
						|
            .OUT_FIXED                 (OUT_FIXED),
 | 
						|
            .OUT_COMPLETE_WRAP         (OUT_COMPLETE_WRAP),
 | 
						|
            .ST_DATA_W                 (ST_DATA_W),
 | 
						|
            .ST_CHANNEL_W              (ST_CHANNEL_W),
 | 
						|
            .BURSTWRAP_CONST_MASK      (BURSTWRAP_CONST_MASK),
 | 
						|
            .BURSTWRAP_CONST_VALUE     (BURSTWRAP_CONST_VALUE),
 | 
						|
            .PIPE_INPUTS               (PIPE_INPUTS),
 | 
						|
            .NO_WRAP_SUPPORT           (NO_WRAP_SUPPORT),
 | 
						|
            .INCOMPLETE_WRAP_SUPPORT   (INCOMPLETE_WRAP_SUPPORT),
 | 
						|
            .OUT_BYTE_CNT_H            (OUT_BYTE_CNT_H),
 | 
						|
            .OUT_BURSTWRAP_H           (OUT_BURSTWRAP_H)
 | 
						|
        ) burst_adapter (
 | 
						|
            .clk                   (clk),
 | 
						|
            .reset                 (reset),
 | 
						|
            .sink0_valid           (sink0_valid),
 | 
						|
            .sink0_data            (sink0_data),
 | 
						|
            .sink0_channel         (sink0_channel),
 | 
						|
            .sink0_startofpacket   (sink0_startofpacket),
 | 
						|
            .sink0_endofpacket     (sink0_endofpacket),
 | 
						|
            .sink0_ready           (sink0_ready),
 | 
						|
            .source0_valid         (source0_valid),
 | 
						|
            .source0_data          (source0_data),
 | 
						|
            .source0_channel       (source0_channel),
 | 
						|
            .source0_startofpacket (source0_startofpacket),
 | 
						|
            .source0_endofpacket   (source0_endofpacket),
 | 
						|
            .source0_ready         (source0_ready)
 | 
						|
        );
 | 
						|
 | 
						|
    end 
 | 
						|
    endgenerate
 | 
						|
 | 
						|
    // synthesis translate_off
 | 
						|
     
 | 
						|
    // -----------------------------------------------------
 | 
						|
    // Simulation-only check for incoming burstwrap values inconsistent with 
 | 
						|
    // BURSTWRAP_CONST_MASK, which would indicate a paramerization error. 
 | 
						|
    //
 | 
						|
    // Should be turned into an assertion, really.
 | 
						|
    // -----------------------------------------------------
 | 
						|
    always @(posedge clk or posedge reset) begin
 | 
						|
        if (~reset && sink0_valid &&
 | 
						|
          BURSTWRAP_CONST_MASK[PKT_BURSTWRAP_W - 1:0] &
 | 
						|
          (BURSTWRAP_CONST_VALUE[PKT_BURSTWRAP_W - 1:0] ^ sink0_data[PKT_BURSTWRAP_H : PKT_BURSTWRAP_L])
 | 
						|
        ) begin
 | 
						|
            $display("%t: %m: Error: burstwrap value %X is inconsistent with BURSTWRAP_CONST_MASK value %X", $time(), sink0_data[PKT_BURSTWRAP_H : PKT_BURSTWRAP_L], BURSTWRAP_CONST_MASK[PKT_BURSTWRAP_W - 1:0]);
 | 
						|
        end
 | 
						|
    end
 | 
						|
 | 
						|
    // synthesis translate_on
 | 
						|
 | 
						|
endmodule
 |