일단 캐시로 올리는 부분을 찾아야 되는데, a25_dcache.v에서 아래와 같은 부분이 있음.


generate

    for ( i=0; i<WAYS;i=i+1 ) begin : rams


        // Tag RAMs 

        `ifdef XILINX_SPARTAN6_FPGA

        xs6_sram_256x21_line_en

        `endif


        `ifdef XILINX_VIRTEX6_FPGA

        xv6_sram_256x21_line_en

        `endif


        `ifndef XILINX_FPGA

        generic_sram_line_en 

        `endif


            #(

            .DATA_WIDTH                 ( TAG_WIDTH             ),

            .INITIALIZE_TO_ZERO         ( 1                     ),

            .ADDRESS_WIDTH              ( CACHE_ADDR_WIDTH      ))

        u_tag (

            .i_clk                      ( i_clk                 ),

            .i_write_data               ( tag_wdata             ),

            .i_write_enable             ( tag_wenable_way[i]    ),

            .i_address                  ( tag_address           ),


            .o_read_data                ( tag_rdata_way[i]      )

            );

            

        // Data RAMs 

        `ifdef XILINX_SPARTAN6_FPGA

        xs6_sram_256x128_byte_en

        `endif


        `ifdef XILINX_VIRTEX6_FPGA

        xv6_sram_256x128_byte_en

        `endif


        `ifndef XILINX_FPGA

        generic_sram_byte_en

        `endif


            #(

            .DATA_WIDTH    ( CACHE_LINE_WIDTH) ,

            .ADDRESS_WIDTH ( CACHE_ADDR_WIDTH) )

        u_data (

            .i_clk                      ( i_clk                         ),

            .i_write_data               ( data_wdata                    ),

            .i_write_enable             ( data_wenable_way[i]           ),

            .i_address                  ( data_address                  ),

            .i_byte_enable              ( {CACHE_LINE_WIDTH/8{1'd1}}    ),

            .o_read_data                ( data_rdata_way[i]             )

            );                                                     



        // Per tag-ram write-enable

        assign tag_wenable_way[i]  = tag_wenable && ( select_way[i] || source_sel[C_INIT] );


        // Per data-ram write-enable

        assign data_wenable_way[i] = (source_sel[C_FILL] && select_way[i]) || 

                                     (write_hit && data_hit_way[i] && c_state == CS_IDLE) ||

                                     (consecutive_write && data_hit_way_r[i]);

        // Per data-ram idle_hit flag

        assign data_hit_way[i]     = tag_rdata_way[i][TAG_WIDTH-1] &&                                                  

                                     tag_rdata_way[i][TAG_ADDR_WIDTH-1:0] == i_address[31:TAG_ADDR32_LSB] &&  

                                     c_state == CS_IDLE;                                                               

    end                                                         

endgenerate


=========================================================

여기서 아래의 구문이 128 bits짜리 데이터를 캐쉬에 쓰는 구문임.

            .i_write_data               ( data_wdata                    ),

            .i_write_enable             ( data_wenable_way[i]           ),

            .i_address                  ( data_address                  ),

그렇기 때문에 이 부분에 wiring을 외부로 연결해서 aes 모듈에 연결시켜야됨.

그리고 아래의 byte_enable은 16'hffff이기에, 앞서 살펴봤던 것 같이 모든 데이터를 다 쓴다는 의미로

받아들일 수 있음.


그러면 여기서 한가지 고려해야할 사항이, 

문제 1. data를 쓰고 ack 신호가 오기 전에 다른 data를 쓰라고 바뀌면 어떻게 할 것인가?

=> 그래서 이 문제 해결을 위해서는 queue를 만드는 방법이 제일 좋을 것 같음...


문제 2. write miss가 나면 어떻게 될 것인가? 메모리에서 데이터를 받아오고 다시 하나?

=> 상관 없을 것 같음... 무시 가능할듯.


==================================================================

그러면 해야할 stage로는, 일단 aes 모듈에 

+ Recent posts