싱글사이클 32비트 small MIPS 프로세서의 일부를 VerilogHDL을 이용하여 나타낸것입니다.
수행 가능한 명령어는  아래 메인디코더 모듈을 보면 쉽게 파악할 수 있습니다.


always @ (*)
case(op)
6'b000000: controls <= 9'b110000010; //Rtyp
6'b100011: controls <= 9'b101001000; //LW
6'b101011: controls <= 9'b001010000; //SW
6'b000100: controls <= 9'b000100001; //BEQ
6'b000101: controls <= 9'b000100001; //BNE         //modified
6'b001000: controls <= 9'b101000000; //ADDI
6'b001101: controls <= 9'b101000011; //ORI         //modified
6'b000010: controls <= 9'b000000100; //J
default: controls <= 9'bxxxxxxxxx; //???
endcase

일단  R-type Opcode는   Function Table을 참조해야하기때문에  ,예외로 두고,
LW(Load Word) , 
SW(Store Word) , 
BEQ(Branch EQual) , 
BNE(Branch Not Equal) , 
ADDI (Add Imm) , 
ORI ( OR Imm) , 
J(Jump)

또한, ALU디코더 모듈을  살펴보면

case (aluop)
2'b00: alucontrol <= 3'b010; // add
2'b01: alucontrol <= 3'b110; // sub
2'b11: alucontrol <= 3'b001; // ori     //modified
default: 
case(funct) // RTYPE
6'b100000: alucontrol <= 3'b010; // ADD
6'b100010: alucontrol <= 3'b110; // SUB
6'b100100: alucontrol <= 3'b000; // AND
6'b100101: alucontrol <= 3'b001; // OR
6'b101010: alucontrol <= 3'b111; // SLT
default: alucontrol <= 3'bxxx; // ???
endcase
endcase

ADD
SUB
AND
OR
ORI
SLT (Set Less Than)


총13개의 명령 수행이 가능한 CPU입니다.

테스트에 사용된 MIPS Assembly Code는 다음과 같습니다.

#MIPS assembly sample code

.text

main : addi $s1, $0, 0                #$s1 = 0
        addi $s0, $0, 1                #$s0 = 1
addi $t0, $0, 101      #$t0 = 101

loop: slt $t1, $s0, $t0            
        bne     $t1  $0, continue          
        beq $t1, $0, done
continue:  
        add $s1, $s1, $s0
add $s0, $s0, $s0
j   loop  
done:   ori     $s2,  $s1,  0x80      #$s2에 255(FF)가 나오면 증명 
done1: j     done1

위 코드는 20+21+22+23+24+25+26 = 127 (0x7F) 를 먼저 구한뒤 , 
0x7F가 결과로 나오게 되면 SLT에서 FALSE State가 되고 , 따라서 beq에서 done으로 점프합니다.
그리고나서 , 0x80과 ori 연산을 수행하게되면 , 최종적으로 결과는 0xFF가 나옵니다.


위 코드를 직접 기계어로 바꾸면 다음과 같습니다.
20110000
20100001
20080065
0208482A
15200002
11200006
02308820
02108020
08000003
36320080
0800000A



마지막 aluout에  0xFF가 출력되는것을 확인할 수 있습니다.
Program Counter의 증가와,  Instruction의 Fetch도 올바르게 되는것을 확인할 수 있습니다.
싱글사이클이기 때문에  Posedge Clock일때 , 인스트럭션이 Fetch 되어져서 실행되는것을 확인할 수 있습니다.


이 자료를 상업적으로 이용하는것을 절대 금지하며, (레포트월드 등)
만약에 상업적으로 이용하는것이 적발된다면 어떠한 일이 일어날지 모릅니다.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2010.05.29 14:56
| 1 |

티스토리 툴바