발견된 문제점

1. 전제 모듈 연결 후, Read 할 때, MISO 값이 간헐적으로 이상하게 나오는 것을 확인.

2. Master에서 RX FIFO로 가는 DOUT의 출력 값 이상 확인.

3. Master DIN이 값을 가져오는 주기의 이상 확인.

 

 

해결과정

 

단계적 문제확인

1) TX FIFO로부터 가져온 DATA가 MASTER에서 나눈 Phase와 일치하지 않아서 생긴 문제.

2) 전체 16-bit 저장용 레지스터 tot_data가 phase 마다 변하면서 정확하지 않은 MOSI값을 출력하고 있었다. 


spi_master에서 아래코드 추가 및 수정

always @ (posedge phase) begin
    addr <= DIN[4:0];           // when falling edge of phase is occured, 
    tot_data [7:0] <= data_reg;
end

always @ (negedge phase) begin
    data_reg <= DIN;
    tot_data[14:8] <= {2'b00, addr};
end

 

data_reg를 추가해서 들어오는 address와 data를 분리해서 인식하고 8비트마다 최신화하여 MOSI 값이 정상적으로 출력되는 것을 확인.

 

수정한 tot_data는 1페이즈(phase == 0)에서 ADDR 값 최신화, 2페이즈(phase == 1)에서 DATA값 최신화 하여 Slave로 값 전송.

 

이 값이 Slave로 넘어가면서 1/2 페이즈 씩 지연되는 것 확인.

 

 

Slave에서는 1페이즈 DATA최신화, 2페이즈 ADDR 최신화.

 

그러면 2페이즈에만 RAM으로 ADDR과 DATA를 보내서 적절한 ADDR에 DATA를 위치시는 것으로 개선


spi_slave에서 아래 코드 추가 및 기존 Write 코드 제거

always @ (posedge phase) begin
        ADDR <= full_data[15:8];
    if(!cmd)
        DOUT <= full_data[7:0];
end

 

기존에 SCLK 마다 값을 바꿔주게 되어있었던 부분을 Phase를 기준으로 변경되게 바꿔주었다.

 

최종 Simulation 파형

WR/RD가 정상적으로 되는 모습

 

Master 모듈에서 read 동작에서 cmd 값이 반대로 되어있는 것 확인 후 수정

 

 

 

Implemnetation 오류 확인

다시 Linter로 돌아가서 있었던 Violation들 확인하고 수정하기로 함.

 

Simulation에서 Synthesis와 Implementation 체크 해제 했지만, 오류 제거되지 않음.

 

'inferred latch for signal'

 

기존 코드 수정하여 제거


기존 slave 단의 w_en 신호(ncs + sclk)

always @ (SCLK || NCS) begin      // when phase value is change
    if (SCLK && !NCS)                //  first bit on positive phase
        w_en <= 1'b1;                                                         // transfer to w_en
    else if (!SCLK && !NCS) 
        w_en <= 1'b0;
    else if (!SCLK && NCS)
        w_en <= 1'b1;
end

아래로 수정

always @ (SCLK || NCS) begin      // when phase value is change
    if (SCLK || NCS)                //  first bit on positive phase
        w_en <= 1'b1;
    else
        w_en <= 0;

testbench 확인 결과 기존과 같은 파형 확인.

 


남아있는 Linter Violation

ASSIGN-7# 1

에서 서로 다른 always block에서 addr값을 변경하는 코드 확인 후. 제거

 


 

Linter 문제 파악 및 해결 어려움

 place 30- 494 error가 input 만있고 output이 없어서 생길 수 있다고 해서 spi_test 모듈에서 spi_top만 synthesis 하니 implementation까지 정상적으로 진행되었다.

 

하지만 Generate Bitstream이 되지 않았다.

추가적인 문제점 및 해결은 다음편에 작성.

 

https://chanfifo77.tistory.com/87

 

[Verilog] 21. SPI Debugging (2)

https://chanfifo77.tistory.com/86 [Verilog] 20. SPI Debugging(1)발견된 문제점1. 전제 모듈 연결 후, Read 할 때, MISO 값이 간헐적으로 이상하게 나오는 것을 확인.2. Master에서 RX FIFO로 가는 DOUT의 출력 값 이상 확

chanfifo77.tistory.com

 

'Circuit Design > 🔥HDL' 카테고리의 다른 글

[Verilog] 22. UART 제작기 (1)  (0) 2024.07.23
[Verilog] 21. SPI Debugging (2)  (2) 2024.07.22
[Verilog] 19. AXI Lite(AXI - Light weight)  (1) 2024.07.14
[Verilog] 18. SPI Slave + RAM 설계  (0) 2024.07.09
[Verilog] 17. SPI Master 설계  (0) 2024.07.02