Lab3
폴더가 세 개 주어져 있다.
template : Single-cycle CPU에 대한 템플릿
testbench : 테스트할 수 있는 파일들
testcase : instruction stream을 어셈블리나 바이너리 포맷으로 제공한다.
Template folder
Mem_Model.v : 메모리 모델을 정의
REG_FILE.v: 레지스터 파일을 정의
RISCV_CLKRST.v: 클락 시그널을 정의
RISCV_TOP.v: 내가 해야할 것
RISCV_TOP.v 만을 수정해라
추가적인 파일을 생성할 순 있다. 예를 들면 컨트롤 패스를 구성하는 것들
testbench 폴더
TB_RISCV_forloop.v
TB_RISCV_inst.v
TB_RISCV_sort.v
testcase 폴더
asm/forloop.asm
asm/sort.asm
hex/forloop.hex
hex/inst.hex
hex/sort.hex
테스트벤치 파일을 테스트하기 전에, 테스트케이스 폴더 안에 있는 instruction stream으로 고정시켜줄 필요가 있다.
TB_RISCV_forloop.v 를 테스트하고 싶다면, 파일 패스를 testcase/hex/forloop.hex로 바꿔야한다.
asm 에는 읽을 수 있는 어셈블리 코드가 있다.
TB파일은 hex file을 읽어서 instruction memory 에다가 집어넣는다. 그리고 instruction을 실행한다. 프로그램을 실행하는 동안 실행된 instruction의 수가 미리 정의된 수에 다다르면, output 포트와 expected value를 비교해야한다.
지켜야할 것
•
Little Endian ( [15:0] ) 이런 식으로
•
instruction memory 와 data memory 가 물리적으로 분리되어서 두 개의 독립적인 모듈이 되어야한다.
•
인스트럭션을 위한 전체 메모리 사이즈는 4KB이고 데이터를 위한 것은 16KB이다.
•
instruction memory는 바이트 어드레싱을 사용하지만, 데이터 메모리는 워드 어드레싱을 사용한다.
•
control Path와 data path는 분리되어야한다.
•
instruction 에 대해서는 Effective_Address & 0xFFF 를 translation으로
•
accessing data에 대해서는 Effective_Address & 0x3FFF를 translation으로
•
초기 PC의 값은 0x000이다.
•
스택 포인터의 초기 값은 0xF00이다(이것은 REV_FILE.v 에 있는 RF[2]이다.
구현해야할 명령어
•
LUI, AUIPC → U type
◦
AUIPC는 pc와 Imm을 더해서(ALU 연산)
◦
rd에 저장한다.
◦
LUI는 Imm을 (ALU 연산 없이)
◦
rd에 저장하는데, 이 때 하위 12비트는 다 0으로 한다.
◦
pc는 pc+4
•
JAL → J type
◦
pc에 imm을 더하고(ALU 연산)
◦
그 결과를 pc에 반영
◦
pc+4를 rd에 저장
•
JALR → I type
◦
Imm를 Ra1에 더하고(ALU 연산)
◦
그 결과를 pc에 반영
◦
pc+4를 rd에 저장
•
BEQ, BNE, BLT, BGE, BLTU, BGEU → B type
◦
Imm 를 pc에 더한다(ALU 연산)
◦
그 결과를 pc에 반영
◦
rd에 저장하지 않는다.
•
LG, LH, LW, LBU, LHU → I type Load
◦
Imm을 Ra1에 더하고(ALU연산)
◦
그걸 주소값으로 데이터를 읽어서
◦
rd에 저장.
◦
pc = pc +4
•
SB, SH, SW → S type
◦
Imm을 Ra1에 더하고(ALU 연산)
◦
그 주소에다가 Ra2 값을 저장함.
◦
WB하는 과정이 없다.
◦
pc = pc +4
•
ADDI (arithmetic), SLTI, SLTIU (conditional), XORI, ORI, ANDI(logical), SLLI, SRLI, SRAI (shift)
◦
Ra1과 Imm을 ALU연산하고
◦
해당 결과를 rd에 저장
◦
pc = pc +4
◦
opcode = 0010011
◦
I-type
•
ADD, SUB{signed,unsigned}, SLL, SRL, SRA, (Shift) SLT, SLTU,(Conditional) XOR, OR, AND(Logical) - Rtype
◦
Ra1과 Ra2를 ALU 연산하고
◦
해당 결과를 rd에 저장
◦
opcode = 0110011
◦
func값에 따라 달라짐
◦
다만 SRA와 SRL은 func7값에 따라 달라짐
behaviroal model of memory and register file은 이미 있다.
내가 할거는 control과 data path를 구현하는 거다.
잘 구현한다면 Success 메시지가 뜰거다.
carefully design 해라
어떤 모듈들이 필요하고, 어떻게 연결되며, 어떤 컨트롤 시그널들이 data 유닛에 전달되기위해 필요한지.
종료 조건
flag instruction을 프로그램이 종료되기 위해 쓴다.
“0x00c00093 //(addi x1, x0, 0xc)”
“0x00008067 //(jalr x0, x1, 0)” 이거를 한 row에서 본다면, 프로그램을 정지시키면 되는데, halt 아웃풋 와이어는 1로 세팅이 되어야한다.
Simulation
테스트를 하기 위해서는 두 가지 additional output을 구현해야한다.
Num_inst와 output_port를 구현해야한다,
•
NUM_INST : 실행된 instruction의 개수
•
OUTPUT_PORT: output result
◦
만약 명령이 rd를 들고 있을 때, 그 목적 레지스터에 써져야할 값은 output_port 에도 쓰여져야한다.
◦
만약 branch instruction 이라면 taken 일 때 output_port에 1이 쓰여져야한다. 아니면 0
◦
만약 instruction이 store 일 때, target address가 output_port에 쓰여져야한다.
해야할 것 순서
1.
alu 만들기
alu에서 해야하는 연산
•
ADD
•
SUB
•
AND
•
OR
•
XOR
•
SLL
•
SRL
•
SRA
•
JALR(?)
•
slti
•
beq
•
bne
•
blt
•
bltu
•
bge
•
bgeu