[Harman 세미콘 아카데미] Day_65(System Verilog)
어제의 Testbench를 이어서 몇 가지의 수정사항이 있었습니다.
먼저, Driver와 Monitor의 Timing 문제입니다. Driver가 DUT에 item을 던질 때와 Monitor가 DUT로부터 item을 받을 경우를 위해 #1 ns를 추가하여 약간의 waiting timing을 걸어줍니다.
또한, Simulation 시 Sequence가 두 번 발생하였는데, adder_test라는 handler를 하나 더 추가하고 new를 통해 하나의 instance를 불러오기 때문이었습니다. 그래서 이를 제거해 줍니다.
그리고, test Class의 run_phase를 하기 전에 topology를 추가하여 Tree 구조를 이루고 있는 Component에 대해 확인할 수 있습니다.
그래서, 아래의 그림과 같이 Test 동작을 실행하기 전에, Testbench를 구성하는 요쇼들이 트리 구조로 나타나게 됩니다.
그리고, Makefile을 통해 쉽게 Compile하고 Simulation을 확인할 수 있습니다. 대신, Compile시 파일에 변화가 있어야만 동작이 가능합니다.
Console 창에 make vcs / make simv를 입력하여 쉽게 Compile/Simulation이 가능합니다.
또한 simulation에 대한 log를 남겨 놓고 이를 Build 밑에 두어 directory를 깔끔하게 정리하였습니다. 이제 make simv를 하면 simv.log가 Build 밑에 생성됩니다. 또한, 깔끔하게 삭제를 하기 위해 clean이라는 명령어도 두어 make clean을 실행하면 log, key csrc등이 모두 제거가 가능합니다.
이를 통해, Test_NAME의 변수만 변경하고 make를 사용한다면, 쉽게 Compile Simulation을 할 수 있습니다.
Synopsys의 verdi를 활용하기 위해, testbench에 $fsdbDumpfile, $fsdbDumpvasr를 구성해 줍니다. verdi tool을 사용하여 testbench의 모든 정보를 수집, 저장할 수 있습니다. 그래서, 시뮬레이션 결과 파형(waveform)을 확인할 수 있습니다.
verdi에 관해 새로이 추가를 해주고 make verdi를 실행해 줍니다. (이때, mobaXterm에서만 동작이 됩니다.) 또한, all을 설정하여 make all을 통해 vcs, simv를 한꺼번에 실행할 수 있습니다.
Verdi에 접속하면, 저희가 생성한 testbench와 Waveform을 확인할 수 있습니다.
그래서, Waveform에 Instance로 존재하는 clk, a, b, y를 Vivado에서 Simulation을 보듯이 추가하여 확인하면 Randomize 된 a와 b가 나오고 a + b의 결과값인 y가 잘 출력되는 것을 확인할 수 있습니다.
SPI 통신: Master가 생성하는 CLK으로 Slave와 동기식 통신을 진행하는 프로토콜
- 동기식 통신
- 전이중 통신 (송/수신이 동시에 가능) -> tx, rx 따로 존재
- Master - Slave 구조 (Master가 CLK을 생성함)
ㄴ MISO => Master In Slave Out 신호선 (Slave -> Master)
ㄴ MOSI => Master Out Slave In 신호선 (Master -> Slave)
- 고속 통신
- 하나의 Master로 여러 Slave 통신 (BUS)
데이터 전송 및 저장 방식
Master와 Slave에는 각각 8bit의 Shift Register가 존재하며, Master가 MOSI로 데이터를 전송하면 Slave의 Shift Register에 데이터가 클럭에 맞춰 shift되어 저장됩니다.
이때 SPI는 전이중(Full Duplex) 통신 방식이기 때문에, 동시에 Slave도 MISO를 통해 데이터를 Master에게 전송합니다.
따라서 Master가 Slave로부터 데이터를 수신하고 싶을 경우, 의미 없는 "dummy 데이터" 를 MOSI로 보내면서 클럭을 생성해야 하며, 이 클럭에 맞춰 Slave는 MISO로 응답 데이터를 전송합니다. (반대도 동일)
SCLK -> CPOL(CLK에 시작에 대한 설정)
CPOL이 0이면 CLK의 시작은 0
CPOL이 1이면 CLK의 시작은 1
CPHA가 0이면 Sample 위치가 CLK의 첫번째 Edge
ㄴ CPOL이 0일때는 Rising Edge에서 Sample
ㄴ CPOL이 1일때는 Falling Edge에서 Sample
CPHA가 1이면 Sample 위치가 CLK의 두번째 Edge
ㄴ CPOL이 0일때는 Falling Edge에서 Sample
ㄴ CPOL이 1일때는 Rising Edge에서 Sample
이때, 아래의 그림의 SS(==Chip select, cs)는 기본적으로 low active 동작이므로 LOW일때 선택이 활성화 됩니다.
Master의 Block Diagram을 그리면 아래와 같습니다. Master에서 CLK을 맞춰 Slave와 동기 통신을 진행하고, MOSI와 MISO port가 연결이 되어있습니다. 동기 CLK는 1MHz로 설정해 주었습니다.
Slave의 경우, Master로부터 CS low를 통해 선택을 받아서 SCLK, MOSI를 받고 MISO를 출력합니다.
CPOL과 CPHA가 둘 다 0일 경우를 MODE0라고 합니다. 기본적으로, SCLK의 Rising Edge일때 데이터를 Sampling 하고 다음 Falling Edge일 때 다음 데이터 bit를 준비합니다. 동작은 기본적으로, Master가 생성하는 SCLK로 Slave와 연결되고 통신합니다. 8bit 즉, 1byte의 데이터를 보내기 위해 1bit의 MOSI를 보내게 됩니다. MOSI는 SPI_Master 내부에 있는 tx_data를 담고 있는 register의 MSB를 담아서 Slave에게 보냅니다. 그리고 SPI는 Full-Duplex(전이중 방식)이기 때문에 Slave로부터 MISO의 응답도 받습니다. Read 명령이 같이 있을땐 rx_data를 MISO로 받기도 하고, 아닐 경우에는 dump data를 MISO로 받기도 합니다.
그래서 이를, 아래의 그림과 함께 FSM을 구현합니다. State는 총 3개로 기존 상태인 IDLE, CP0, CP1입니다.
IDLE 상태에서는 start 신호를 받으면 state를 CP0 state로 천이합니다. 이 state에서는 tx_data를 register에 넣어 놓고, 데이터를 전송하기 전 단계입니다.
CP0 State는 SCLK가 High로 변하는 시점으로 Data를 Sampling하고 MOSI를 통해 1bit씩 데이터를 전송하게 됩니다. 이때, 100MHz의 기본 CLK를 활용해서 1MHz의 SCLK의 HIGH를 만들어 주어야하기 때문에, Count register를 설계하여 50을 세면 동작을 하도록 합니다.
SCLK의 HIGH를 만들어 주었으면 LOW도 만들어 주어야 합니다. 그래서 CP1 state를 통해 SCLK의 LOW를 만들어주고, 이 또한 Count register를 통해 50을 세면 동작을 하도록 설계합니다. CP1 state는 다음에 보낼 1bit data를 보낼 준비를 해야하므로, Master의 data register를 shift 합니다. 데이터를 보내려면 1byte를 기준으로 하기 때문에 8개의 bit를 보내지 않으면 CP0 state로 이동하여 다시 데이터를 보내고, 8개를 모두 보냈다면 IDLE State로 넘어가며 데이터 전송 동작을 종료합니다. 그리고, done 신호를 생성하여 최종적인 종료를 알리게 됩니다.
코드 :
Code_Verilog_SystemVerilog/workspace/250516_SPI_Master/250516_SPI_Master.srcs/sources_1/new/SPI_MASTER.v at main · Heeju99/Code
Contribute to Heeju99/Code_Verilog_SystemVerilog development by creating an account on GitHub.
github.com
TestBench 결과 :
tx_data로 8'b10101010을 설정하였습니다. 이를 CP0와 CP1 state를 돌며 1bit의 MOSI를 보내게 됩니다. 8bit의 데이터를 모두 보내게 되면 IDLE state로 돌아가며 종료하는 모습을 볼 수 있습니다.