2022. 12. 24. 12:29ㆍ기록지/컴퓨터구조(computer architecture)
●0 ns ~ 10 ns
i_rst_n=0 : negative에 동작하는 리셋이므로 값이 0이기 때문에 리셋이 동작한다.
[PC] i_next_pc=32’h00000004, o_pc=32’h00000000 : 리셋이 동작했기 때문에 현재 pc값 o_pc이 32’h00000000이 되고 다음 pc값 i_next_pc은 +4 해준 32’h00000004가 된다.
[IM] i_addr=32’h00000000, o_instr=32’h00000000 : o_pc값이 주소값i_addr이므로 32’h00000000이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h00000000이다.
[ADD_PC] i_data1=32’h00000000, i_data2=32’h00000004, o_sum=32’h00000004 : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h00000000이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000004가 된다.
●10 ns ~ 25 ns
i_rst_n=1 : negative에 동작하는 리셋이므로 값이 1이기 때문에 리셋이 동작하지 않는다.(이하 작성않음)
[PC] i_next_pc=32’h00000008, o_pc=32’h00000004 : 현재 pc값 o_pc은 이전 cycle i_next_pc값인 32’h00000004이 되고 다음 pc값 i_next_pc은 +4 해준 32’h00000008이 된다.
[IM] i_addr=32’h00000004, o_instr=32’h8e110000 : o_pc값이 주소값 i_addr이므로 32’h00000004이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h8e110000이다.
[ADD_PC] i_data1=32’h00000004, i_data2=32’h00000004, o_sum=32’h00000008 : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h00000004이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000008가 된다.
●25 ns ~ 35 ns
[PC] i_next_pc=32’h0000000c, o_pc=32’h00000008 : 현재 pc값 o_pc은 이전 cycle i_next_pc값인 32’h00000008이 되고 다음 pc값 i_next_pc은 +4 해준 32’h0000000c이 된다.
[IM] i_addr=32’h00000008, o_instr=32’h8e120004 : o_pc값이 주소값 i_addr이므로 32’h00000004이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h8e120004이다.
[ADD_PC] i_data1=32’h00000008, i_data2=32’h00000004, o_sum=32’h0000000c : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h00000008이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘00000000c가 된다.
●35 ns ~ 45 ns
[PC] i_next_pc=32’h00000010, o_pc=32’h0000000c : 현재 pc값 o_pc은 이전 cycle i_next_pc값인 32’h0000000c이 되고 다음 pc값 i_next_pc은 +4 해준 32’h00000010이 된다.
[IM] i_addr=32’h0000000c, o_instr=32’h8e130008 : o_pc값이 주소값 i_addr이므로 32’h0000000c이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h8e130008이다.
[ADD_PC] i_data1=32’h0000000c, i_data2=32’h00000004, o_sum=32’h00000010 : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h0000000c이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000010가 된다.
●45 ns ~ 55 ns
[PC] i_next_pc=32’h00000014, o_pc=32’h00000010 : 현재 pc값 o_pc은 이전 cycle i_next_pc값인 32’h00000010이 되고 다음 pc값 i_next_pc은 +4 해준 32’h00000014이 된다.[IM] i_addr=32’h00000010, o_instr=32’h02538820 : o_pc값이 주소값 i_addr이므로 32’h00000010이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h02538820이다.
[ADD_PC] i_data1=32’h00000010, i_data2=32’h00000004, o_sum=32’h00000014 : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h00000010이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000014가 된다.
●55 ns ~ 65 ns
[PC] i_next_pc=32’h00000018, o_pc=32’h00000014 : 현재 pc값 o_pc은 이전 cycle i_next_pc값인 32’h00000014이 되고 다음 pc값 i_next_pc은 +4 해준 32’h00000018이 된다.
[IM] i_addr=32’h00000014, o_instr=32’h02538822 : o_pc값이 주소값 i_addr이므로 32’h00000014이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h02538822이다.
[ADD_PC] i_data1=32’h00000014, i_data2=32’h00000004, o_sum=32’h00000018 : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h00000014이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000018가 된다.
●65 ns ~ 75 ns
[PC] i_next_pc=32’h0000001c, o_pc=32’h00000018 : 현재 pc값 o_pc은 이전 cycle i_next_pc값인 32’h00000018이 되고 다음 pc값 i_next_pc은 +4 해준 32’h0000001c이 된다.
[IM] i_addr=32’h00000018, o_instr=32’h8e510004 : o_pc값이 주소값 i_addr이므로 32’h00000018이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h8e510004이다.
[ADD_PC] i_data1=32’h00000018, i_data2=32’h00000004, o_sum=32’h0000001c : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h00000018이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘00000001c가 된다.
●75 ns ~ 85 ns
[PC] i_next_pc=32’h00000020, o_pc=32’h0000001c : 현재 pc값 o_pc은 이전 cycle i_next_pc값인 32’h0000001c이 되고 다음 pc값 i_next_pc은 +4 해준 32’h00000020이 된다.
[IM] i_addr=32’h0000001c, o_instr=32’h8e720030 : o_pc값이 주소값 i_addr이므로 32’h0000001c이 되 고 machinecode.txt에서 i_addr 주소의 해당 명령어값을 읽어오면 그 값은 o_instr=32‘h8e720030이다.
[ADD_PC] i_data1=32’h0000001c, i_data2=32’h00000004, o_sum=32’h00000020 : 다음PC를 계산하기 위한 ADD이므로 i_data1는 현재 pc값 32’h0000001c이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000020가 된다.
●15 ns ~ 25 ns
[RF] i_Read_reg1=5’h10, i_Read_reg2=5’h11, i_Write_reg=5’h11, i_Writedata=32’h00000001, RegWrite=1’h1, o_Read_data1=32’h00000000, o_Read_data2=32’hzzzzzzzz : o_instr[25:16]의 값을 i_Read_reg1, i_Read_reg2에 각각 5비트씩 넣으므로 그 값은 i_Read_reg1=5’h00, i_Read_reg2=5’h00가 된다. 메모리에서 읽을 때 데이터를 load해서 i_Write_data에 저장. RegWrite는 write enable신호로서 1 로 on되어있다. o_Read_data1,2는 레지스터에서 read한 값이다.[ALU] i_data1=32’h00000000, i_data2=32’h00000000, ALUop=4’h2, o_result=32’h00000000, o_zero=1‘h1 : i_data1에 Read data1값을 불러오고 i_data2에 Read data2또는 immediate값이 된 다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero가 1이 된다. 올바르게 동작하는것을 확인할수 있다.
●25 ns ~ 35 ns
[RF] i_Read_reg1=5’h10, i_Read_reg2=5’h12, i_Write_reg=5’h12, i_Writedata=32’h00000002, RegWrite=1’h1, o_Read_data1=32’h00000000, o_Read_data2=32’hzzzzzzzz : o_instr[25:16]의 값을 i_Read_reg1, i_Read_reg2에 각각 5비트씩 넣으므로 그 값은 i_Read_reg1=5’h00, i_Read_reg2=5’h00가 된다. 메모리에서 읽을 때 데이터를 load해서 i_Write_data에 저장. RegWrite는 write enable신호로서 1 로 on되어있다. o_Read_data1,2는 레지스터에서 read한 값이다.
[ALU] i_data1=32’h00000000, i_data2=32’h00000004, ALUop=4’h2, o_result=32’h00000004, o_result=32’h00000004, o_zero=1‘h0 : i_data1에 Read data1값을 불러오고 i_data2에 Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero가 1이 된다. 올바르게 동작하는것을 확인할수 있다.
●35 ns ~ 45 ns
[RF] i_Read_reg1=5’h10, i_Read_reg2=5’h13, i_Write_reg=5’h13, i_Writedata=32’h00000004, RegWrite=1’h1, o_Read_data1=32’h00000000, o_Read_data2=32’hzzzzzzzz : o_instr[25:16]의 값을 i_Read_reg1, i_Read_reg2에 각각 5비트씩 넣으므로 그 값은 i_Read_reg1=5’h10, i_Read_reg2=5’h13가 된다. 메모리에서 읽을 때 데이터를 load해서 i_Write_data에 저장. RegWrite는 write enable신호로서 1 로 on되어있다. o_Read_data1,2는 레지스터에서 read한 값이다.
[ALU] i_data1=32’h00000000, i_data2=32’h00000008, ALUop=4’h2, o_result=32’h00000008, o_result=32’h00000004, o_zero=1‘h0 : i_data1에 Read data1값을 불러오고 i_data2에 Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero가 1이 된다. 올바르게 동작하는것을 확인할수 있다.
●45 ns ~ 55 ns
[RF] i_Read_reg1=5’h12, i_Read_reg2=5’h13, i_Write_reg=5’h11, i_Writedata=32’h00000004, RegWrite=1’h1, o_Read_data1=32’h0000000, o_Read_data2=32’hzzzzzzzz : o_instr[25:16]의 값을 i_Read_reg1, i_Read_reg2에 각각 5비트씩 넣으므로 그 값은 i_Read_reg1=5’h12, i_Read_reg2=5’h13가 된다. 메모리에서 읽을 때 데이터를 load해서 i_Write_data에 저장. RegWrite는 write enable신호로서 1 로 on되어있다. o_Read_data1,2는 레지스터에서 read한 값이다.
●65 ns ~ 75 ns
[RF] i_Read_reg1=5’h12, i_Read_reg2=5’h11, i_Write_reg=5’h11, i_Writedata=32’hxxxxxxxx, RegWrite=1’h1, o_Read_data1=32’hxxxxxxxx, o_Read_data2=32’hzzzzzzzz : o_instr[25:16]의 값을 i_Read_reg1, i_Read_reg2에 각각 5비트씩 넣으므로 그 값은 i_Read_reg1=5’h10, i_Read_reg2=5’h13가 된다. 메모리에서 읽을 때 데이터를 load해서 i_Write_data에 저장. RegWrite는 write enable신호로서 1 로 on되어있다. o_Read_data1,2는 레지스터에서 read한 값이다.
[ALU] i_data1=32’hxxxxxxxx, i_data2=32’h00000004, ALUop=4’h2, o_result=32’hxxxxxxxx, o_result=32’h00000004, o_zero=1‘h0 : i_data1에 Read data1값을 불러오고 i_data2에 Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero가 1이 된다. 올바르게 동작하는것을 확인할수 있다.
●75 ns ~ 85 ns
[RF] i_Read_reg1=5’h13, i_Read_reg2=5’h12, i_Write_reg=5’h13, i_Writedata=32’hxxxxxxxx, RegWrite=1’h1, o_Read_data1=32’hxxxxxxxx, o_Read_data2=32’hzzzzzzzz : o_instr[25:16]의 값을 i_Read_reg1, i_Read_reg2에 각각 5비트씩 넣으므로 그 값은 i_Read_reg1=5’h10, i_Read_reg2=5’h13가 된다. 메모리에서 읽을 때 데이터를 load해서 i_Write_data에 저장. RegWrite는 write enable신호로서 1 로 on되어있다. o_Read_data1,2는 레지스터에서 read한 값이다.
[ALU] i_data1=32’hxxxxxxxx, i_data2=32’h00000030, ALUop=4’h2, o_result=32’hxxxxxxxx, o_result=32’h00000004, o_zero=1‘h0 : i_data1에 Read data1값을 불러오고 i_data2에 Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero가 1이 된다. 올바르게 동작하는것을 확인할수 있다.
●15 ns ~ 25 ns
[SEU] i_halfword=16’h0000, o_word=32’h00000000 : msb가 0이므로 i_halfword와 0으로 이루어진 16비트를 채워 32비트를 만듬
[ADD_BR] i_data1=32’h00000008, i_data2=32’h0000000, o_sum=32’h0000008 : i_data1과 i_data2를 더해서 o_sum에 저장한다. 올바르게 동작한다.
[MUX] sel값이 0이면 o_sum값은 i_data1이 되고 sel값이 1이면 o_sum값은 i_data2가 된다. 올바르게 동 작하는 것을 확인할 수있다.
●75 ns ~ 85 ns
[SEU] i_halfword=16’h0030, o_word=32’00000030 : msb가 0이므로 i_halfword와 0으로 이루어진 16비트를 채워 32비트를 만듬
[ADD_BR] i_data1=32’h00000020, i_data2=32’h000000c0, o_sum=32’h000000e0 : i_data1과 i_data2를 더해서 o_sum에 저장한다. 올바르게 동작한다.
[MUX] sel값이 0이면 o_sum값은 i_data1이 되고 sel값이 1이면 o_sum값은 i_data2가 된다. 올바르게 동 작하는 것을 확인할 수있다.
●0 ns ~ 85 ns
[Maincontrol] o_instr[31:26]이 op에 저장된다. RegDst=1 이면 MemRead가 0, MemtoReg가 0, ALUSrc가 0이되고 ALUop는 2‘h2가 된다. RegDst=0이 되면 MemRead가 1, MemtoReg가 1, ALUSrc가 1이되고 ALUop는 2‘h0이 된다. 모두 올바르게 동작하는 것을 확인할 수 있다.
[ALUControl] function field가 funct[5:0]에 저장된다. op값이 2‘b00 일때는 signal값은 4’b0010을 주고
2’b01일때는 4’b0110, 2’b10 일때는 funct값에 따라 4’b0010, 0110, 0000, 0001, 0111의 값이 된다. 올 바르게 동작하는 것을 확인 할 수있다.
'기록지 > 컴퓨터구조(computer architecture)' 카테고리의 다른 글
Quartus II/ ModelSim을 이용한 구현 - 4. ALU(Arithmetic Logic Unit), Substractor (0) | 2023.01.29 |
---|---|
Quartus II/ ModelSim을 이용한 구현 - 3. CLA(Carry Look-ahead Adder) (verilog) (0) | 2023.01.28 |
Quartus II/ ModelSim을 이용한 구현 - 2. RCA(Ripple-Carry Adder) (verilog) (0) | 2023.01.27 |
Quartus II/ ModelSim을 이용한 구현 - 1. Multiplexer(verilog) (0) | 2023.01.26 |
SingleCycleCPU(verilog) (1) | 2022.12.24 |