일단 캐시로 올리는 부분을 찾아야 되는데, 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로는,


1. 일단 aes 모듈에 wiring을 통해 연결하기


2. write시에는 write 하고 싶다는 신호가 오면


 a. 큐에 데이터가 존재한다면 존재하는 데이터를 메모리로 보내기

 b. 큐에 데이터가 없다면 연결된 wire에서 dcache_diff 신호가 1이 될 때까지 기다리기

(여기서 중요한 것이, 연동이 잘 되어서 항상 큐에 1개만 쌓이게 될 수가 있는데 그렇다면 이렇게 큐를 만들어 줄 필요가 없는 것임 => 속도상승)


3. dcache_diff신호가 1이 되면 데이터를 큐에 넣기


3. 큐에 뭔가 존재하면 거기 있는 데이터를 램으로 보내기


4. ack가 오면 코어로 ack 신호를 보내기.


5. read신호에 대해서는 read중에 dcahce_diff signal이 올 수도 있다.....(맞나??) 그 때는 큐에만 넣어주면 될듯... 


6. write 중에는 read 하고자 할 수 없음. 왜냐면 당연히, write가 끝나고 aes 모듈에 read하고 싶다고 올 테니까.......

+ Recent posts