aboutsummaryrefslogblamecommitdiff
path: root/rtl/modexpng_storage_manager.v
blob: 6b34bed3fb4f5153e8294e423a590fc353697e54 (plain) (tree)





































                               












                        





              
                                     




            

                                  
 




                                              
 




                                                
   




                                               
 




                                                 
    

                                                



                                    

                                                  



                                      











                                           




                                                     
 




                                                       

                      




                                         










                                           



                                         









                                             



                                         





                                                               



                                         






                                                                 
                                                                                  




                        
                                                                                    




                         
                                                      

                  



                                                                                                                             




                         
                                                          

                  



                                                                                                                                         















                                                     
module modexpng_storage_manager
(
    clk, rst,
    
    wr_wide_xy_ena,
    wr_wide_xy_bank,
    wr_wide_xy_addr,
    wr_wide_x_din,
    wr_wide_y_din,

    wr_narrow_xy_ena,
    wr_narrow_xy_bank,
    wr_narrow_xy_addr,
    wr_narrow_x_din,
    wr_narrow_y_din,
    
    ext_wide_xy_ena,
    ext_wide_xy_bank,
    ext_wide_xy_addr,
    ext_wide_x_din,
    ext_wide_y_din,

    ext_narrow_xy_ena,
    ext_narrow_xy_bank,
    ext_narrow_xy_addr,
    ext_narrow_x_din,
    ext_narrow_y_din,
    
    rcmb_wide_xy_ena,
    rcmb_wide_xy_bank,
    rcmb_wide_xy_addr,
    rcmb_wide_x_din,
    rcmb_wide_y_din,

    rcmb_narrow_xy_ena,
    rcmb_narrow_xy_bank,
    rcmb_narrow_xy_addr,
    rcmb_narrow_x_din,
    rcmb_narrow_y_din,
    
    rdct_wide_xy_bank,
    rdct_wide_xy_addr,
    rdct_wide_x_din,
    rdct_wide_y_din,
    rdct_wide_xy_valid,

    rdct_narrow_xy_bank,
    rdct_narrow_xy_addr,
    rdct_narrow_x_din,
    rdct_narrow_y_din,
    rdct_narrow_xy_valid
);


    //
    // Headers
    //
    `include "modexpng_parameters.vh"


    //
    // Ports
    //
    input                     clk;
    input                     rst;

    output                    wr_wide_xy_ena;
    output [BANK_ADDR_W -1:0] wr_wide_xy_bank;
    output [  OP_ADDR_W -1:0] wr_wide_xy_addr;
    output [ WORD_EXT_W -1:0] wr_wide_x_din;
    output [ WORD_EXT_W -1:0] wr_wide_y_din;

    output                    wr_narrow_xy_ena;
    output [BANK_ADDR_W -1:0] wr_narrow_xy_bank;
    output [  OP_ADDR_W -1:0] wr_narrow_xy_addr;
    output [ WORD_EXT_W -1:0] wr_narrow_x_din;
    output [ WORD_EXT_W -1:0] wr_narrow_y_din;
   
    input                     ext_wide_xy_ena;
    input  [BANK_ADDR_W -1:0] ext_wide_xy_bank;
    input  [  OP_ADDR_W -1:0] ext_wide_xy_addr;
    input  [ WORD_EXT_W -1:0] ext_wide_x_din;
    input  [ WORD_EXT_W -1:0] ext_wide_y_din;

    input                     ext_narrow_xy_ena;
    input  [BANK_ADDR_W -1:0] ext_narrow_xy_bank;
    input  [  OP_ADDR_W -1:0] ext_narrow_xy_addr;
    input  [ WORD_EXT_W -1:0] ext_narrow_x_din;
    input  [ WORD_EXT_W -1:0] ext_narrow_y_din;
    
    input                     rcmb_wide_xy_ena;
    input  [BANK_ADDR_W -1:0] rcmb_wide_xy_bank;
    input  [ 7:0] rcmb_wide_xy_addr;
    input  [17:0] rcmb_wide_x_din;
    input  [17:0] rcmb_wide_y_din;

    input                     rcmb_narrow_xy_ena;
    input  [BANK_ADDR_W -1:0] rcmb_narrow_xy_bank;
    input  [ 7:0] rcmb_narrow_xy_addr;
    input  [17:0] rcmb_narrow_x_din;
    input  [17:0] rcmb_narrow_y_din;
    
    input  [     2:0] rdct_wide_xy_bank;
    input  [     7:0] rdct_wide_xy_addr;
    input  [    17:0] rdct_wide_x_din;
    input  [    17:0] rdct_wide_y_din;
    input             rdct_wide_xy_valid;

    input  [     2:0] rdct_narrow_xy_bank;
    input  [     7:0] rdct_narrow_xy_addr;
    input  [    17:0] rdct_narrow_x_din;
    input  [    17:0] rdct_narrow_y_din;
    input             rdct_narrow_xy_valid;
    
    reg                    wr_wide_xy_ena_reg = 1'b0;
    reg [BANK_ADDR_W -1:0] wr_wide_xy_bank_reg;
    reg [  OP_ADDR_W -1:0] wr_wide_xy_addr_reg;
    reg [ WORD_EXT_W -1:0] wr_wide_x_din_reg;
    reg [ WORD_EXT_W -1:0] wr_wide_y_din_reg;

    reg                    wr_narrow_xy_ena_reg = 1'b0;
    reg [BANK_ADDR_W -1:0] wr_narrow_xy_bank_reg;
    reg [  OP_ADDR_W -1:0] wr_narrow_xy_addr_reg;
    reg [ WORD_EXT_W -1:0] wr_narrow_x_din_reg;
    reg [ WORD_EXT_W -1:0] wr_narrow_y_din_reg;
    
    task _update_wide;
        input                    xy_ena;
        input [BANK_ADDR_W -1:0] xy_bank;
        input [  OP_ADDR_W -1:0] xy_addr;
        input [ WORD_EXT_W -1:0] x_din;
        input [ WORD_EXT_W -1:0] y_din;
        begin
            wr_wide_xy_ena_reg  <= xy_ena;
            wr_wide_xy_bank_reg <= xy_bank;
            wr_wide_xy_addr_reg <= xy_addr;
            wr_wide_x_din_reg   <= x_din;
            wr_wide_y_din_reg   <= y_din;
        end
    endtask
    
    task _update_narrow;
        input        xy_ena;
        input [BANK_ADDR_W -1:0] xy_bank;
        input [  OP_ADDR_W -1:0] xy_addr;
        input [ WORD_EXT_W -1:0] x_din;
        input [ WORD_EXT_W -1:0] y_din;
        begin
            wr_narrow_xy_ena_reg  <= xy_ena;
            wr_narrow_xy_bank_reg <= xy_bank;
            wr_narrow_xy_addr_reg <= xy_addr;
            wr_narrow_x_din_reg   <= x_din;
            wr_narrow_y_din_reg   <= y_din;
        end
    endtask
    
    task enable_wide;
        input [BANK_ADDR_W -1:0] xy_bank;
        input [  OP_ADDR_W -1:0] xy_addr;
        input [ WORD_EXT_W -1:0] x_din;
        input [ WORD_EXT_W -1:0] y_din;
        begin
            _update_wide(1'b1, xy_bank, xy_addr, x_din, y_din);
        end
    endtask
    
    task enable_narrow;
        input [BANK_ADDR_W -1:0] xy_bank;
        input [  OP_ADDR_W -1:0] xy_addr;
        input [ WORD_EXT_W -1:0] x_din;
        input [ WORD_EXT_W -1:0] y_din;
        begin
            _update_narrow(1'b1, xy_bank, xy_addr, x_din, y_din);
        end
    endtask
    
    task disable_wide;
        begin
            _update_wide(1'b0, BANK_DNC, OP_ADDR_DNC, WORD_EXT_DNC, WORD_EXT_DNC);
        end
    endtask
    
    task disable_narrow;
        begin
            _update_narrow(1'b0, BANK_DNC, OP_ADDR_DNC, WORD_EXT_DNC, WORD_EXT_DNC);
        end
    endtask
    
    always @(posedge clk)
        //
        if (rst)                         disable_wide;
        else begin
            //
            if      (ext_wide_xy_ena)    enable_wide(ext_wide_xy_bank,  ext_wide_xy_addr,  ext_wide_x_din,  ext_wide_y_din);
            else if (rcmb_wide_xy_ena)   enable_wide(rcmb_wide_xy_bank, rcmb_wide_xy_addr, rcmb_wide_x_din, rcmb_wide_y_din);
            else if (rdct_wide_xy_valid) enable_wide(rdct_wide_xy_bank, rdct_wide_xy_addr, rdct_wide_x_din, rdct_wide_y_din);
            else                         disable_wide;
            //
        end
            
    always @(posedge clk)
        //
        if (rst)                           disable_narrow;
        else begin
            //
            if      (ext_narrow_xy_ena)    enable_narrow(ext_narrow_xy_bank,  ext_narrow_xy_addr,  ext_narrow_x_din,  ext_narrow_y_din);
            else if (rcmb_narrow_xy_ena)   enable_narrow(rcmb_narrow_xy_bank, rcmb_narrow_xy_addr, rcmb_narrow_x_din, rcmb_narrow_y_din);
            else if (rdct_narrow_xy_valid) enable_narrow(rdct_narrow_xy_bank, rdct_narrow_xy_addr, rdct_narrow_x_din, rdct_narrow_y_din);
            else                           disable_narrow;
            //
        end

    assign wr_wide_xy_ena  = wr_wide_xy_ena_reg;
    assign wr_wide_xy_bank = wr_wide_xy_bank_reg;
    assign wr_wide_xy_addr = wr_wide_xy_addr_reg;
    assign wr_wide_x_din   = wr_wide_x_din_reg;
    assign wr_wide_y_din   = wr_wide_y_din_reg;

    assign wr_narrow_xy_ena  = wr_narrow_xy_ena_reg;
    assign wr_narrow_xy_bank = wr_narrow_xy_bank_reg;
    assign wr_narrow_xy_addr = wr_narrow_xy_addr_reg;
    assign wr_narrow_x_din   = wr_narrow_x_din_reg;
    assign wr_narrow_y_din   = wr_narrow_y_din_reg;
    
endmodule