위 파이프라인이 적용된 데이터패스에서 lw 명령어의 경우를 살펴보자. 명령어가 실행되면(IF), IF/ID 레지스터는 명령어를 저장한다. 이때 프로세서는 아직 명령어가 무엇인지 모르기에 beq를 대비하여 PC+4를 저장한다. ID 단계에서는 이제 데이터패스는 명령어가 lw임을 알게 된다 ID/EX 레지스터에는 ID 단계에서 생성된 데이터 세트(두 개의 32비트 데이터, 부호 확장된 immediate value, PC+4)가 저장된다. EX 단계에서는 레지스터 1의 값과 부호 확장된 immediate value를 ID/EX 레지스터에서 읽어온다. 두 값은 ALU를 통해 대상 데이터 메모리 주소를 계산하고 EX/MEM 레지스터에 저장한다. MEM 단계에서는 EX/MEM 레지스터에서 메모리 주소를 읽어와 데이..
컴퓨터구조
control unit은 instruction type에 따라 모든 신호의 값을 결정한다. 입력은 명령어의 opcode(instruction 31-26), 출력은 7개의 signals PCSrc는 Branch와 ALU의 Zero 신호의 AND 게이트로 결정된다. 분기명령어(Branch = 1)이고, 분기가 실행될 때(Zero = 1) target address가 PC에 기록된다. jump instruction은 먼저 (1)에서 PC의 앞 4bit를 추출한 값을 얻고, (2)에서 instruction[25-0]에 2만큼 right shift한 값을 얻은 다음 둘을 XOR연산하여 합친다. 만약 instruction의 31-26, 즉 opcode가 jump 명령어(000010)이라면 control unit에서..
ALU는 3가지 중 하나의 기능을 한다. - lw/sw 명령어는 메모리 주소를 계산하기 위해 add 연산을 함 - branch 명령어는 두 레지스터 값을 비교하기 위해 subtract 연산을 함. - R-type 명령어는 6bit funct 필드의 값에 따라 actions을 정함. 우리는 datapath 에서 ALU가 수행할 기능을 결정하는 control unit이 필요하다. - input(2bits): 이 명령어는 lw/sw , branch-equal, R-type 중 무엇인가? - input(6bits): R-type인 경우, funct 필드의 값은 무엇인가? - output(4bits): ALU가 수행하는 기능은 무엇인가? ALU Control Unit에 2bit의 ALUOp, 6bit의 Funct..
위 회로는 브랜치 분기 명령어에서 사용되는 회로다. 이는 두 가지 출력으로 나뉘는데, 예를 들어 beq $t1 8($t2)가 입력됐다고 가정하자. 첫번째 출력은 대상 주소 출력이다. 상대 주소인 8은 Sign-extend 회로로 16bit에서 32bit로 변환된다. 그 후 Shift left 2 회로로 4가 곱해져 워드 단위의 상대 주소가 된다. Adder(가산기)로써 PC+4와 합쳐져 대상 주소가 출력된다. 두번째 출력은 조건문에 따른 출력이다. Read register에 $t1과 $t2가 입력되고, Read data로 출력된다. 출력된 값은 ALU에 입력되어 subtract 연산을 수행한다. 만약 zero flag가 활성화된다면 둘은 같은 것이므로 대상 주소에 위치한 명령어가 수행된다. 1) inst..
Datapath Elements(데이터 경로 요소)에는 Instruction memory, Program counter, Adder가 있다. Instruction memory(명령어 메모리): 프로그램의 명령어를 저장하는 메모리로, 주소(입력)이 주어지면, 해당하는 명령어(출력)을 공급 Program counter: 현재 명령어의 주소를 보유하는 레지스터 Adder(덧셈기): 다음 명령어의 주소를 위해 PC를 증가시키는 논리 회로로, 산술 논리 장치(ALU)에서 수행되는 산술/비트 연산에서 구성됨 프로세서는 PC의 주소를 명령어 메모리(Instruction memory)에 입력함으로 해당 명령어(Instruction)를 가져온다. 다음 명령어를 실행하기 위해서는 PC를 증가시켜야하는데, 명령어 하나의 크..
위 그림은 MIPS의 구조를 요약한 것이다. Processor에서부터 하나씩 뜯어보자. 이 부분은 Registers가 입력을 받고, 출력을 하며, 결과값을 입력받기까지 하는 부분이다. R-type의 경우 필드가 3개기에 입력 addr이 3개이다. 예를 들어, add dst src1 src2 라고 하면 각각 dst addr, src1 addr, src2 addr로 들어간다. 각각 5bit의 wide를 차지한다. src1 data와 src2 data는 src1 addr와 src2 addr의 데이터를 출력해준다. write data로 들어온 입력은 dst addr의 데이터에 입력된다. Program Counter의 출력은 현재 명령어의 위치이다. 위 그림에서는 PC의 출력값을 Adder의 첫 번째 입력으로 주..
$t0에 4000000을 넣을 때 어떻게 넣으면 될까? addi를 사용하기엔 넣을 수 있는 값이 16bit이므로 400만을 나타낼 수 없다. 이 때, lui와 ori를 사용할 수 있다. Load Upper Immediate $t0 = 255
함수 안에서 변수를 선언하면 해당 변수는 레지스터에 저장하기에 용량이 크면 스택에 저장된다. 이때 스택에 저장된 변수는 프로시저 프레임으로 세분화된다. 프로시저 프레임은 프로시저가 호출될 때 생성되고 프로시저가 종료될 때 삭제된다. 프로시저 프레임에는 프로시저가 호출될 때 저장해야하는 값들을 포함한다. 인자 레지스터 $a, 반환주소레지스터 $ra, 저장된 레지스터 $s, 지역변수가 이에 포함된다. 따라서 프로시저 내부에서 변수를 사용하면 해당 변수는 프로시저 프레임 내에 저장된다. 프로시저가 종료될 때 그 프레임이 삭제되고 해당 변수도 함께 삭제된다. 프로시저 프레임을 사용해서 프로시저에서 지역 변수와 레지스터를 관리할 수 있다. 이는 메모리 공간을 효율적으로 활용할 수 있게 해주고 스택을 사용해서 함수..