싱글사이클 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 되어져서 실행되는것을 확인할 수 있습니다.


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


저작자 표시 비영리 변경 금지
신고
by Sone 2010.05.29 14:56
| 1 |