module ocx_leaf_inferd_regfile
    (
        // Port A module ports (This is a WRITE-ONLY port.)
        clka   ,
        ena    ,
        addra  ,
        dina   ,
   
        // Port B module ports (This is a READ-ONLY port.)
        clkb   ,
        rstb_n ,
        enb    ,
        addrb  ,
        doutb
    ) ;


// ==============================================================================================================================
// @@@  Parameters   (These can be overwritten by module instatiation.)
// ==============================================================================================================================
       
        parameter  REGFILE_DEPTH   =    16 ;        //positive integer
        parameter  REGFILE_WIDTH   =   576 ;        //positive integer
        parameter  ADDR_WIDTH      =     4 ;        //positive integer
   

// ==============================================================================================================================
// @@@  Port Declarations
// ==============================================================================================================================
   
        // Port A module ports (This is a WRITE-ONLY port.)
        input                        clka   ;
        input                        ena    ;
        input  [ADDR_WIDTH-1:0]      addra  ;
        input  [REGFILE_WIDTH-1:0]   dina   ;
   
        // Port B module ports (This is a READ-ONLY port.)
        input                        clkb   ;
        input                        rstb_n ;
        input                        enb    ;
        input  [ADDR_WIDTH-1:0]      addrb  ;
        output [REGFILE_WIDTH-1:0]   doutb  ;



// ==============================================================================================================================
// @@@  Wires and Variables (Regs)
// ==============================================================================================================================

        (* RAM_STYLE="DISTRIBUTED" *)
        reg    [REGFILE_WIDTH-1:0]   regfile [REGFILE_DEPTH-1:0]   ;
        reg    [REGFILE_WIDTH-1:0]   output_reg  ;


// ==============================================================================================================================
// @@@  ocx_leaf_inferd_regfile Logic
// ==============================================================================================================================

        // Regfile memory array
        always @ (posedge clka) begin
              if(ena)    begin   regfile[addra] <= dina;  end
        end

        // Output register
        always @ (posedge clkb) begin
            if    (!rstb_n)         begin  output_reg  <= {REGFILE_WIDTH{1'b0}};   end
            else if (enb)           begin  output_reg  <= regfile[addrb];          end
        end

        assign  doutb  =  output_reg ;


endmodule  // ocx_leaf_inferd_regfile