- RAM에서 read 시에

rd_data = ram[addr_d1[27:2]];

wb_rdata128 <= rd_data

o_wb_dat = wb_rdata128;

이라 아무런 이상이 없음.


- RAM에 write 시에

ram[addr_d1[27:2]] <= masked_wdata;

masked_wdata는 8bit씩 잘라서 wr_mask[i]의 상태에 따라 들어감 아래와 같다.

wr_mask = ~i_wb_sel;

for(i = 0 ; i < 16 ; i ++)

assign masked_wdata = wr_mask[i] ? rd_data[8*i + 7 : 8*i] : wr_data[8*i + 7 : 8*i];

이렇게 되어있어서 encrypted data는 부분별로 다른 것이 들어가버리면 이상한 값이 되어버린다.

이대로 쓰려면 i_wb_sel이 항상 16bit 전부 1이어야 되므로

a25_aes.v 파일에서

o_wb_sel_o = 16'hffff;

이렇게 고정시켜보니 앰버 실행시 맛이 가버림..


-그래서 코어쪽에서 selective하게 write하지 않고 그냥 무조건 we를 ffff가 되게 하기 위해서 따라 올라가면

wishbone.v에서는 wbuf_be로 쓰고있고

wishbone_buf.v에서는 i_be로 쓰고 있고

그것은 다시 wishbone.v에서 i_portx_be로 연결이 되어있다.

그것은 a25_core.v에서 dcache_wb_byte_enable로 연결되어 있고

그것은 a25_mem.v에 o_wb_byte_enable로 연결이 되어있다.

a25_mem.v에서는 

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

assign o_wb_byte_enable         = i_daddress[3:2] == 2'd0 ? {12'd0, i_byte_enable       } :

                                  i_daddress[3:2] == 2'd1 ? { 8'd0, i_byte_enable,  4'd0} :

                                  i_daddress[3:2] == 2'd2 ? { 4'd0, i_byte_enable,  8'd0} :

                                                            {       i_byte_enable, 12'd0} ;

============================================================================
이런 식으로 되어있는데

여기서 만약 이대로라면 16'hffff인 상태가 될 수 없다...

i_byte_enable은 4bit짜리 wire이다...

이래서 32bit로 옮긴 다음에, 

assign o_wb_write_data          = {4{i_write_data}}; 이런 식으로 했던 것이다.

고로, 128bit로 옮기고 저장하지만 32bit를 제외한 것은 모두 dummy였다.

+ Recent posts