Search

Lab3

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

버클리 렉처노트