133|1

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

接口类型转换 [复制链接]

本帖最后由 小南鲸-FPGA 于 2024-11-28 17:58 编辑

将sramif模块中的bankA和bankB转换为AXI-Stream接口,应当如何解决这个问题?(求助大佬)

 

 

module sramif #(

     parameter integer NUM_CPUS = 1,

     parameter integer AXI_SRAM_ID = 12

)(
  // ACE slave interface
  (* mark_debug = "true" *) output wire                    ace_awready_o,
  (* mark_debug = "true" *) input  wire                    ace_awvalid_i,
  input  wire [(AXI_SRAM_ID-1):0]   ace_awid_i,
 (* mark_debug = "true" *) input  wire [31:0]             ace_awaddr_i,
  (* mark_debug = "true" *) input  wire [7:0]              ace_awlen_i,
  (* mark_debug = "true" *) input  wire [2:0]              ace_awsize_i,
  (* mark_debug = "true" *) input  wire [1:0]              ace_awburst_i,
  //input  wire [1:0]              ace_awbar_i,
  //input  wire [1:0]              ace_awdomain_i,
  input  wire                    ace_awlock_i,
  input  wire [3:0]              ace_awcache_i,
  input  wire [2:0]              ace_awprot_i,
  //input  wire [2:0]              ace_awsnoop_i,
  //input  wire                    ace_awunique_i,
  (* mark_debug = "true" *) output wire                    ace_wready_o,
  (* mark_debug = "true" *) input  wire                    ace_wvalid_i,
  //input  wire [5:0]              ace_wid_i,
  (* mark_debug = "true" *) input  wire [127:0]            ace_wdata_i,
  (* mark_debug = "true" *) input  wire [15:0]             ace_wstrb_i,
  (* mark_debug = "true" *) input  wire                    ace_wlast_i,
  input  wire                    ace_bready_i,
  output wire                    ace_bvalid_o,
  output wire [(AXI_SRAM_ID-1):0]              ace_bid_o,
  output wire [1:0]              ace_bresp_o,
  output wire                    ace_arready_o,
  input  wire                    ace_arvalid_i,
  input  wire [(AXI_SRAM_ID-1):0]              ace_arid_i,
  input  wire [31:0]             ace_araddr_i,
  input  wire [7:0]              ace_arlen_i,
  input  wire [2:0]              ace_arsize_i,
  input  wire [1:0]              ace_arburst_i,
  //input  wire [1:0]              ace_arbar_i,
  //input  wire [1:0]              ace_ardomain_i,
  input  wire                    ace_arlock_i,
  input  wire [3:0]              ace_arcache_i,
  input  wire [2:0]              ace_arprot_i,
  //input  wire [3:0]              ace_arsnoop_i,
  input  wire                    ace_rready_i,
  output wire                    ace_rvalid_o,
  output wire [(AXI_SRAM_ID-1):0]              ace_rid_o,
  output wire [127:0]            ace_rdata_o,
  output wire [1:0]              ace_rresp_o,
  output wire                    ace_rlast_o,

  input  wire                   clk,
  input  wire                   reset_n,

  // npu axi register
  input logic [5:0]                 fifo_count     ,

  // npu register interface
  output logic [31:0]               sys_addr       , // System Interface
  output logic                      sys_wr         , // System Interface
  output logic [15:0]               sys_wr_val     , // System Interface
  output logic                      sys_rd         , // System Interface
  input                             sys_ack        , // System Interface
  input        [15:0]               sys_rd_val     , // System Interface

  // npu data sram interface
  output logic [1:0][15:0]               bankA_dma_cs         ,
  output logic [1:0][15:0]               bankA_dma_we         ,
  output logic [1:0][15:0][10:0]         bankA_dma_addr       , 
  output logic [1:0][15:0][127:0]        bankA_dma_din        , 
  output logic [1:0][15:0][15:0]         bankA_dma_byte_en    ,
  input        [1:0][15:0][127:0]        bankA_dma_dout       , 
  output logic [1:0][15:0]               bankB_dma_cs         ,
  output logic [1:0][15:0]               bankB_dma_we         ,
  output logic [1:0][15:0][10:0]         bankB_dma_addr       , 
  output logic [1:0][15:0][127:0]        bankB_dma_din        , 
  output logic [1:0][15:0][15:0]         bankB_dma_byte_en    ,
  input        [1:0][15:0][127:0]        bankB_dma_dout       ,
  // npu lut sram
  output logic [15:0]                     dma_lut_cs          ,
  output logic [15:0]                     dma_lut_we          ,
  output logic [15:0][11:0]               dma_lut_addr        ,
  output logic [15:0][15:0]               dma_lut_din         ,
  output logic [15:0][1:0]                dma_lut_byte_en     ,
  input        [15:0][15:0]               dma_lut_dout        ,

  // Command manager interface
  output logic                            cmd_cs         ,
  output logic                            cmd_we         ,
  output logic [10-1:0]                   cmd_addr       ,
  input  logic [32-1:0]                   cmd_out        ,
  output logic [32-1:0]                   cmd            
/*
  input  wire                             bist_mode       ,
  // clk / rst_n          
  input  wire                             i_apb_clk       ,

  // apb port         
  input  wire                             i_psel          ,
  input  wire [11:0]                      i_paddr         ,
  input  wire                             i_penable       ,
  input  wire                             i_pwrite        ,
  input  wire [31:0]                      i_pwdata        ,
  output wire [31:0]                      o_prdata        ,
  output wire                             npum_ctrl       , //default:0
  output wire [15:0]                      npum_ramclk */
);

  localparam ADDR_WIDTH = 32;
  //----------------------------------------------------------------------------
  // Signal declarations
  //----------------------------------------------------------------------------
  //reg                    ace_rready_i_tmp;
  //always@(posedge clk)begin
  //    ace_rready_i_tmp <= ace_rready_i;
  //end
  logic [7:0]              len_addr_count;
  logic [7:0]              len_addr_count_d1;

  // Read/write arbitration
  reg                     write_sel;
  wire                    nxt_write_sel;
  wire                    write_sel_we;

  // Unpacked address/control
  wire [(ADDR_WIDTH-1):0] unpk_wr_addr;
  wire                    unpk_wr_last;
  wire                    unpk_wr_valid;
  wire                    unpk_wr_ready;
  wire [(ADDR_WIDTH-1):0] unpk_rd_addr;
  wire                    unpk_rd_last;
  wire                    unpk_rd_valid;
  wire                    unpk_rd_ready;
  reg                     unpk_rd_valid_d1;
  reg                     unpk_rd_last_d1;
  reg                     unpk_rd_last_d2;

  // ACE signals
  wire                    ace_awready;
  wire                    ace_arready;
  reg  [(AXI_SRAM_ID-1):0]              ace_arid_reg;
  reg  [(AXI_SRAM_ID-1):0]              ace_arid_d2;
  wire                    ace_arid_reg_we;
  reg  [(AXI_SRAM_ID-1):0]              ace_rid;
  wire                    ace_rid_we;
  reg  [(AXI_SRAM_ID-1):0]              ace_bid;
  wire                    ace_bid_we;
  reg                     ace_wready;
  wire                    nxt_ace_wready;
  reg                     ace_bvalid;
  wire                    nxt_ace_bvalid;
  wire [1:0]              ace_bresp;
  reg  [127:0]            ace_rdata;
  reg                     ace_rvalid;
  wire                    nxt_ace_rvalid;
  reg                     ace_rlast;
  reg                     ace_rlast_temp;
  wire [1:0]              ace_rresp;

  // Validation read/write
  wire                    val_read;
  reg                     val_read_d1; // read data delay one cycle
  reg                     val_read_d2; // read data delay two cycle
  wire [127:0]            val_rd_data; // Read data
  wire [127:0]            val_rd_data_big; // Read data
  wire                    val_write;
  wire                    val_rd_ongoing;
  reg                     val_rd_ongoing_reg;

  logic unpk_wr_valid_d1;
  logic unpk_wr_valid_d2;
  logic preproc_valid;
  logic [1:0]   pre_type;
  logic bvalid_delay;
  logic ace_wvalid_d1;
  logic wstart;
  
  logic empty;
  logic empty_b1;
  logic almost_empty;
/*
  //apb signals
  wire                   o_sw_SLEEP_P0;
  wire                   o_sw_SLEEP_P1;
  wire                   o_sw_SLEEP_P2;
  wire                   o_sw_SLEEP_P3;
  wire                   o_sw_SLEEP_P4;
  wire                   o_sw_SLEEP_P5;
  wire                   o_sw_SLEEP_P6;
  wire                   o_sw_SLEEP_P7;
  wire                   o_sw_SLEEP_P8;
  wire                   o_sw_SLEEP_P9;
  wire                   o_sw_SLEEP_P10;
  wire                   o_sw_SLEEP_P11;
  wire                   o_sw_SLEEP_P12;
  wire                   o_sw_SLEEP_P13;
  wire                   o_sw_SLEEP_P14;
  wire                   o_sw_SLEEP_P15;


apb_reg_memctl u_apb_reg_memctl
(
  .i_clk         (i_apb_clk     ),
  .i_rst_n       (reset_n       ),
  .i_psel        (i_psel        ),
  .i_paddr       (i_paddr       ),
  .i_penable     (i_penable     ),
  .i_pwrite      (i_pwrite      ),
  .i_pwdata      (i_pwdata      ),
  .o_prdata      (o_prdata      ),
  .o_sw_SLEEP_P0 (o_sw_SLEEP_P0 ),
  .o_sw_SLEEP_P1 (o_sw_SLEEP_P1 ),
  .o_sw_SLEEP_P2 (o_sw_SLEEP_P2 ),
  .o_sw_SLEEP_P3 (o_sw_SLEEP_P3 ),
  .o_sw_SLEEP_P4 (o_sw_SLEEP_P4 ),
  .o_sw_SLEEP_P5 (o_sw_SLEEP_P5 ),
  .o_sw_SLEEP_P6 (o_sw_SLEEP_P6 ),
  .o_sw_SLEEP_P7 (o_sw_SLEEP_P7 ),
  .o_sw_SLEEP_P8 (o_sw_SLEEP_P8 ),
  .o_sw_SLEEP_P9 (o_sw_SLEEP_P9 ),
  .o_sw_SLEEP_P10(o_sw_SLEEP_P10),
  .o_sw_SLEEP_P11(o_sw_SLEEP_P11),
  .o_sw_SLEEP_P12(o_sw_SLEEP_P12),
  .o_sw_SLEEP_P13(o_sw_SLEEP_P13),
  .o_sw_SLEEP_P14(o_sw_SLEEP_P14),
  .o_sw_SLEEP_P15(o_sw_SLEEP_P15),
  .o_sw_NPUM_CTRL(npum_ctrl     ) 
);

  //----------------------------------------------------------------------------
  //Power Down Mode
  //----------------------------------------------------------------------------
ca53_cell_clkgate clkgate_ram_clk0   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P0 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[0 ]));
ca53_cell_clkgate clkgate_ram_clk1   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P1 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[1 ]));
ca53_cell_clkgate clkgate_ram_clk2   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P2 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[2 ]));
ca53_cell_clkgate clkgate_ram_clk3   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P3 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[3 ]));
ca53_cell_clkgate clkgate_ram_clk4   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P4 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[4 ]));
ca53_cell_clkgate clkgate_ram_clk5   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P5 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[5 ]));
ca53_cell_clkgate clkgate_ram_clk6   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P6 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[6 ]));
ca53_cell_clkgate clkgate_ram_clk7   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P7 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[7 ]));
ca53_cell_clkgate clkgate_ram_clk8   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P8 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[8 ]));
ca53_cell_clkgate clkgate_ram_clk9   (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P9 ), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[9 ]));
ca53_cell_clkgate clkgate_ram_clk10  (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P10), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[10]));
ca53_cell_clkgate clkgate_ram_clk11  (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P11), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[11]));
ca53_cell_clkgate clkgate_ram_clk12  (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P12), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[12]));
ca53_cell_clkgate clkgate_ram_clk13  (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P13), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[13]));
ca53_cell_clkgate clkgate_ram_clk14  (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P14), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[14]));
ca53_cell_clkgate clkgate_ram_clk15  (.clk_i(clk),.clk_enable_i(!o_sw_SLEEP_P15), .clk_senable_i(bist_mode),.clk_gated_o(npum_ramclk[15]));
*/
  //----------------------------------------------------------------------------
  // ACE address unpacking
  //
  //   An ACE read/write request can specify a burst while only providing the
  //   address for the first transfer in the burst.  To access the validation
  //   memory resources these 'packed' addresses are unpacked into a series of
  //   requests, each providing the full address.
  //----------------------------------------------------------------------------

  // Write channel
  execution_tb_ace_intf_addr_unpack #(.ADDR_WIDTH(ADDR_WIDTH))
    u_execution_tb_ace_intf_addr_unpack_wr
      (// Clocks and resets
       .clk             (clk),
       .reset_n         (reset_n),

       // ACE write address channel
       .ace_axaddr_i    (ace_awaddr_i),
       .ace_axburst_i   (ace_awburst_i),
       .ace_axsize_i    (ace_awsize_i),
       .ace_axlen_i     (ace_awlen_i),
       .ace_axprot_i    (ace_awprot_i),
       .ace_axvalid_i   (ace_awvalid_i),
       .ace_axready_o   (ace_awready),

       .len_addr_count  (len_addr_count),

       // Unpacked write address/control
       .unpk_addr_o     (unpk_wr_addr),
       .unpk_last_o     (unpk_wr_last),
       .unpk_valid_o    (unpk_wr_valid),
       .unpk_ready_i    (unpk_wr_ready)
      );
  // The ACE write address channel is stalled until the ACE write channel
  // provides data on a completed W channel handshake.
  //
  // However, for the last beat of the burst the stall is extended until the end
  // of the ACE write response channel handshake.  This is required so that no
  // other requests on the AW channel are started until the current request has
  // completely cleared; the address unpacker can only handle a single
  // outstanding write.
  assign unpk_wr_ready = (ace_wvalid_i & ace_wready & ~unpk_wr_last) |
                         (ace_bvalid & ace_bready_i);

  // Read channel
  execution_tb_ace_intf_addr_unpack
    u_execution_tb_ace_intf_addr_unpack_rd
      (// Clocks and resets
       .clk             (clk),
       .reset_n         (reset_n),

       // ACE read address channel
       .ace_axaddr_i    (ace_araddr_i),
       .ace_axburst_i   (ace_arburst_i),
       .ace_axsize_i    (ace_arsize_i),
       .ace_axlen_i     (ace_arlen_i),
       .ace_axprot_i    (ace_arprot_i),
       .ace_axvalid_i   (ace_arvalid_i),
       .ace_axready_o   (ace_arready),

       .len_addr_count  (),

       // Unpacked write address channel
       .unpk_addr_o     (unpk_rd_addr),
       .unpk_last_o     (unpk_rd_last),
       .unpk_valid_o    (unpk_rd_valid),
       .unpk_ready_i    (unpk_rd_ready)
      );

  always @ (posedge clk or negedge reset_n)
    if(!reset_n)
      len_addr_count_d1 <= {8{1'b0}};
    else
      len_addr_count_d1 <= len_addr_count;


  // The ACE read address channel stalls until the read is issued to the
  // validation subsystem.
  assign unpk_rd_ready = val_read;


  //----------------------------------------------------------------------------
  // ACE transaction IDs
  //----------------------------------------------------------------------------

  // ARID register:
  //   Capture ARID on a completed ACE AR handskake to form the correct ID for
  //   the read response
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_arid_reg <= {(AXI_SRAM_ID){1'b0}};
    else if (ace_arid_reg_we)
      ace_arid_reg <= ace_arid_i;

  assign ace_arid_reg_we = ace_arready & ace_arvalid_i;
  
  // read data delay a cycle and rid need delay a cycle
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_arid_d2 <= {(AXI_SRAM_ID){1'b0}};
    else
      ace_arid_d2 <= ace_arid_reg;
//    else if (ace_arid_reg_we)
//      //ace_arid_d2 <= ace_arid_i;
//      ace_arid_d2 <= ace_arid_reg;

  // RID:
  //   RID will normally be from ace_arid_reg, but because we can accept the
  //   next AR request while waiting for the previous request's RREADY we have
  //   to cover this extra window.
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_rid <= {(AXI_SRAM_ID){1'b0}};
    else if (ace_rid_we)
      ace_rid <= ace_arid_d2;

  assign ace_rid_we = unpk_rd_valid_d1 & ~(ace_rlast & ace_rvalid & ~ace_rready_i);
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      unpk_rd_valid_d1 <= 1'b0;
    else
      unpk_rd_valid_d1 <= unpk_rd_valid;


  // BID:
  //   Takes a copy of AWID when the write address handshake is complete.
  //   Bits[1:0] of the ID contains the CPU number of the CPU that made the
  //   request.
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_bid <= {(AXI_SRAM_ID){1'b0}};
    else if (ace_bid_we)
      ace_bid <= ace_awid_i;

  assign ace_bid_we = ace_awready & ace_awvalid_i;


  //----------------------------------------------------------------------------
  // Write channel handshake
  //
  //   Once a write address handshake has completed, writes for that transaction
  //   do not incur any stalls.  Therefore WREADY is brought high after a write
  //   address handshake and stays high until the handshake for the last data
  //   beat completes and the write response has handshaked.
  //
  //   We must wait for the write response handshake to complete so as not to
  //   handshake any new write transactions that the processor may have
  //   presented.
  //----------------------------------------------------------------------------

  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_wready <= 1'b0;
    else
      ace_wready <= nxt_ace_wready;

  assign nxt_ace_wready = unpk_wr_valid & preproc_valid &                 // Ongoing write
                          ~(ace_wvalid_i & ace_wready & ace_wlast_i) &  // Not last beat
                          ~ace_bvalid;                                  // Not waiting for BREAD

  // unpk_valid delay one cycle for val_write_i
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      unpk_wr_valid_d1 <= 1'b0;
    else
      unpk_wr_valid_d1 <= unpk_wr_valid;
  // unpk_valid delay 2 cycle for val_write_i
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      unpk_wr_valid_d2 <= 1'b0;
    else
      unpk_wr_valid_d2 <= unpk_wr_valid_d1;

  //----------------------------------------------------------------------------
  // Write response channel handshake
  //
  //   The write response is driven after the final beat of write data has been
  //   written (i.e. its write handshake has completed.)  BVALID stays high
  //   until the processor completes the handshake.
  //----------------------------------------------------------------------------

  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_bvalid <= 1'b0;
    else
      ace_bvalid <= nxt_ace_bvalid;

  //assign nxt_ace_bvalid = ~bvalid_delay & ((ace_wvalid_i & ace_wready & unpk_wr_last) | ace_bvalid) &
  assign nxt_ace_bvalid = ((ace_wvalid_i & ace_wready & unpk_wr_last) | ace_bvalid) &
                          ~(ace_bvalid & ace_bready_i);

  assign ace_bresp = 2'b00; // OKAY response


  //----------------------------------------------------------------------------
  // Read channel data register and handshake
  //
  //   Read data from the validation memory model is registered before being
  //   sent to the processor.
  //
  //   RVALID is set high at the same time and stays high until the processor
  //   completes the handshake.
  //----------------------------------------------------------------------------

//  always @ (posedge clk or negedge reset_n)
//    if (!reset_n)
//      ace_rdata <= {128{1'b0}};
//    else if (val_read_d2)
//      ace_rdata <= val_rd_data_big;

sramif_fifo u_sramif_fifo(
    .clk      (clk     ),
    .rst_n    (reset_n ),
    .flush    ( 1'b0   ),
    .write    (val_read_d2 ),
    .data_in  (val_rd_data_big ),
    .read     (~empty & ace_rready_i ),
    .data_out (ace_rdata ),
    .full     ( ),
    .almost_empty    (almost_empty ),
    .empty_b1 (empty_b1 ),
    .empty    (empty )
);

assign val_rd_data_big[31:0]    = {val_rd_data[7:0], val_rd_data[15:8], val_rd_data[23:16], val_rd_data[31:24]};
assign val_rd_data_big[63:32]   = {val_rd_data[39:32], val_rd_data[47:40], val_rd_data[55:48], val_rd_data[63:56]};
assign val_rd_data_big[95:64]   = {val_rd_data[71:64], val_rd_data[79:72], val_rd_data[87:80], val_rd_data[95:88]};
assign val_rd_data_big[127:96]   = {val_rd_data[103:96], val_rd_data[111:104], val_rd_data[119:112], val_rd_data[127:120]};

  // RVALID
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_rvalid <= 1'b0;
    else
      ace_rvalid <= nxt_ace_rvalid;

  assign nxt_ace_rvalid = val_rd_ongoing | (ace_rvalid & ~ace_rready_i);

  // Drive RLAST from the unpacked interface when the read is ongoing
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      ace_rlast <= 1'b0;
    else if (ace_rvalid & ace_rready_i & ace_rlast)
      ace_rlast <= 1'b0;
    else if (val_read_d2)
      ace_rlast <= unpk_rd_last_d2;

  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      unpk_rd_last_d1 <= 1'b0;
    else
      unpk_rd_last_d1 <= unpk_rd_last;
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      unpk_rd_last_d2 <= 1'b0;
    else
      unpk_rd_last_d2 <= unpk_rd_last_d1;

  // The validation memories never give an error response
  assign ace_rresp = 2'b00;  // OKAY response


  //----------------------------------------------------------------------------
  // Validation read/write valid
  //
  //   A read to the validation memory interface is valid when the address
  //   unpacker signals a valid read and we are not waiting on RREADY (which
  //   stalls the next read.)
  //
  //   Since write data is accepted as soon as it is provided by the processor,
  //   a write to the validation memory interface is valid when there's
  //   a completed ACE write channel handshake.
  //----------------------------------------------------------------------------

  assign val_read  = unpk_rd_valid & ~(ace_rvalid & ~ace_rready_i);
  assign val_write = ace_wvalid_i & ((ace_wready & pre_type != 2'h2) | 
    (unpk_wr_valid_d1 & pre_type == 2'h2 & (!unpk_wr_valid_d2 || wstart ||
    (len_addr_count != len_addr_count_d1 && len_addr_count_d1 != 8'b0))));

//  assign val_write = ace_wvalid_i & ((ace_wready & pre_type != 2'h2) | 
//    (unpk_wr_valid_d1 & pre_type == 2'h2 & (!unpk_wr_valid_d2 || 
//    (len_addr_count != len_addr_count_d1 && len_addr_count_d1 != 8'b0))));

  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      wstart <= 1'b0;
    else if(unpk_wr_valid_d1 && ~unpk_wr_valid_d2 && ~ace_wvalid_i)
      wstart <= 1'b1;
    else if(ace_wvalid_i)
      wstart <= 1'b0;
  
//  assign val_write = ace_wvalid_i & ((ace_wready & pre_type != 2'h2) | (unpk_wr_valid_d1 & ~unpk_wr_valid_d2 & pre_type == 2'h2));
// write data valid after unpk wr addr valid one cycle
//  assign val_write = ace_wvalid_i & ace_wready;

  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      val_read_d1 <= 1'b0;
    else
      val_read_d1 <= val_read;
  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      val_read_d2 <= 1'b0;
    else
      val_read_d2 <= val_read_d1;

  // Set a flag when a read is sent to the validation components and stays high
  // until the read data is presented to the ACE interface, accounting for any
  // stalls from the RVALID/RREADY handshake
  assign val_rd_ongoing = ~empty_b1 | (val_rd_ongoing_reg & ~(ace_rvalid & ace_rready_i));

  always @ (posedge clk or negedge reset_n)
    if (!reset_n)
      val_rd_ongoing_reg <= 1'b0;
    else
      val_rd_ongoing_reg <= val_rd_ongoing;


  //----------------------------------------------------------------------------
  // Output assignments
  //----------------------------------------------------------------------------

//  wire                    val_read_o,    // Read valid
  wire [(ADDR_WIDTH-1):0] val_rd_addr; // Read address
//  wire                    val_write_o,   // Write valid
  wire [(ADDR_WIDTH-1):0] val_wr_addr; // Write address
  wire [15:0]             val_wr_strb; // Write strobes
  wire [127:0]            val_wr_data;  // Write data

  // Validation memory interface
  //assign val_read      = val_read;
  assign val_rd_addr   = unpk_rd_addr;
  //assign val_write     = val_write;
  assign val_wr_addr   = unpk_wr_addr;
  // change little-big endian
  assign val_wr_data[31:0]   = {ace_wdata_i[7:0], ace_wdata_i[15:8], ace_wdata_i[23:16], ace_wdata_i[31:24]};
  assign val_wr_data[63:32]   = {ace_wdata_i[39:32], ace_wdata_i[47:40], ace_wdata_i[55:48], ace_wdata_i[63:56]};
  assign val_wr_data[95:64]   = {ace_wdata_i[71:64], ace_wdata_i[79:72], ace_wdata_i[87:80], ace_wdata_i[95:88]};
  assign val_wr_data[127:96]   = {ace_wdata_i[103:96], ace_wdata_i[111:104], ace_wdata_i[119:112], ace_wdata_i[127:120]};
  //assign val_wr_data   = ace_wdata_i;
  //assign val_wr_strb   = ace_wstrb_i;
  assign val_wr_strb   = {ace_wstrb_i[12], ace_wstrb_i[13],ace_wstrb_i[14],ace_wstrb_i[15],
                          ace_wstrb_i[8], ace_wstrb_i[9],ace_wstrb_i[10],ace_wstrb_i[11],
                          ace_wstrb_i[4], ace_wstrb_i[5],ace_wstrb_i[6],ace_wstrb_i[7],
                          ace_wstrb_i[0], ace_wstrb_i[1],ace_wstrb_i[2],ace_wstrb_i[3]};

  //reg                    ace_rvalid_o_tmp;
  //reg [5:0]              ace_rid_o_tmp;
  //reg [3:0]              ace_rresp_o_tmp;
  //reg                    ace_rlast_o_tmp;
  //always@(posedge clk)begin
  //    ace_rvalid_o_tmp <= ace_rid    ;
  //    ace_rid_o_tmp    <= ace_rresp  ;
  //    ace_rresp_o_tmp  <= ace_rlast  ;
  //    ace_rlast_o_tmp  <= ace_rvalid ;
  //end

  // ACE outputs
  assign ace_awready_o = ace_awready;
  assign ace_wready_o  = ace_wready;
  assign ace_bvalid_o  = ace_bvalid;
  assign ace_bid_o     = ace_bid;
  assign ace_bresp_o   = ace_bresp;
  assign ace_arready_o = ace_arready;
  assign ace_rvalid_o  = ace_rvalid;
  assign ace_rid_o     = ace_rid;
  assign ace_rdata_o   = ace_rdata;
  //assign ace_rdata_o   = val_rd_data;
  assign ace_rresp_o   = ace_rresp;
  assign ace_rlast_o   = ace_rlast;


  //----------------------------------------------------------------------------
  // System address decoder
  //
  //   The validation memory starts at address 0x000_0000_0000 and aliases
  //   through the whole memory map, except for the region 0x000_1300_0000 to
  //   0x000_13FF_FFFF which is reserved for the tube and trickbox registers.
  //
  //   This region contains:
  //
  //     0x000_1300_0000 : Tube
  //     0x000_1300_0008 : Trickbox - FIQ counter load
  //     0x000_1300_000C : Trickbox - FIQ clear
  //
  //   Other locations in the trickbox region are reserved.
  //----------------------------------------------------------------------------

  sramif_decoder
    u_sramif_decoder
      (
           .clk             (clk),
           .reset_n         (reset_n),

         // Read port
         .val_read_i          (val_read),
         .val_rd_addr_i       (val_rd_addr),
         .val_rd_data_o       (val_rd_data),

         // Write port
         .val_write_i         (val_write),
         .val_wr_addr_i       (val_wr_addr),
         .val_wr_strb_i       (val_wr_strb),
         .val_wr_data_i       (val_wr_data),

         // unpack address
         // a cycle ahead w_data_en
       .unpk_valid_i    (unpk_wr_valid),
         
         // axi fifo register interface
         .fifo_count          (fifo_count),

         // preprocess interface
         .preproc_valid       (preproc_valid),
         .pre_type            (pre_type),
         .bvalid_delay        (bvalid_delay),

         // sram interface
        .bankA_dma_cs        ( bankA_dma_cs        ),
        .bankA_dma_we        ( bankA_dma_we        ),
        .bankA_dma_addr      ( bankA_dma_addr      ),
        .bankA_dma_din       ( bankA_dma_din       ),
        .bankA_dma_byte_en   ( bankA_dma_byte_en   ),
        .bankA_dma_dout      ( bankA_dma_dout      ),
        .bankB_dma_cs        ( bankB_dma_cs        ),
        .bankB_dma_we        ( bankB_dma_we        ),
        .bankB_dma_addr      ( bankB_dma_addr      ),
        .bankB_dma_din       ( bankB_dma_din       ),
        .bankB_dma_byte_en   ( bankB_dma_byte_en   ),
        .bankB_dma_dout      ( bankB_dma_dout      ),

        // lut sram interface
        .dma_lut_cs          ( dma_lut_cs          ),
        .dma_lut_we          ( dma_lut_we          ),
        .dma_lut_addr        ( dma_lut_addr        ),
        .dma_lut_din         ( dma_lut_din         ),
        .dma_lut_byte_en     ( dma_lut_byte_en     ),
        .dma_lut_dout        ( dma_lut_dout        ),
        
        // npu reg interface
        .sys_addr            ( sys_addr            ),
        .sys_wr              ( sys_wr              ),
        .sys_wr_val          ( sys_wr_val          ),
        .sys_rd              ( sys_rd              ),
        .sys_ack             ( sys_ack             ),
        .sys_rd_val          ( sys_rd_val          ),

        // npu command sram interface
        .cmd_cs              ( cmd_cs              ),
        .cmd_we              ( cmd_we              ),
        .cmd_addr            ( cmd_addr            ),
        .cmd_out             ( cmd_out             ),
        .cmd                 ( cmd                 ) 

      );

endmodule
 

此帖出自FPGA/CPLD论坛
点赞 关注
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
12345323865 发表于 2024-11-29 15:17 **** 作者被禁止或删除 内容自动屏蔽 ****

 

此帖出自FPGA/CPLD论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表