SingleCycleCpu(verilog) 설계검증

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 : 리셋이 동작했기 때문에 현재 pco_pc 32’h00000000이 되고 다음 pci_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는 현재 pc32’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 : 현재 pco_pc은 이전 cycle i_next_pc값인 32’h00000004이 되고 다음 pci_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는 현재 pc32’h00000004이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000008가 된다.

 

 

 

 

 

 

 

●25 ns ~ 35 ns

[PC] i_next_pc=32’h0000000c, o_pc=32’h00000008 : 현재 pco_pc은 이전 cycle i_next_pc값인 32’h00000008이 되고 다음 pci_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는 현재 pc32’h00000008이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘00000000c가 된다.

 

●35 ns ~ 45 ns

[PC] i_next_pc=32’h00000010, o_pc=32’h0000000c : 현재 pco_pc은 이전 cycle i_next_pc값인 32’h0000000c이 되고 다음 pci_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는 현재 pc32’h0000000c이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000010가 된다.

●45 ns ~ 55 ns

[PC] i_next_pc=32’h00000014, o_pc=32’h00000010 : 현재 pco_pc은 이전 cycle i_next_pc값인 32’h00000010이 되고 다음 pci_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는 현재 pc32’h00000010이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000014가 된다.

●55 ns ~ 65 ns

[PC] i_next_pc=32’h00000018, o_pc=32’h00000014 : 현재 pco_pc은 이전 cycle i_next_pc값인 32’h00000014이 되고 다음 pci_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는 현재 pc32’h00000014이 되고 여기에 i_data2값에 4를 주고 더하면 o_sum=32‘000000018가 된다.

●65 ns ~ 75 ns

[PC] i_next_pc=32’h0000001c, o_pc=32’h00000018 : 현재 pco_pc은 이전 cycle i_next_pc값인 32’h00000018이 되고 다음 pci_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는 현재 pc32’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_data1Read data1값을 불러오고 i_data2Read data2또는 immediate값이 된 . ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero1이 된다. 올바르게 동작하는것을 확인할수 있다.

 

●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에 저장. RegWritewrite 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_data1Read data1값을 불러오고 i_data2Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero1 된다. 올바르게 동작하는것을 확인할수 있다.

●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에 저장. RegWritewrite 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_data1Read data1값을 불러오고 i_data2Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero1 된다. 올바르게 동작하는것을 확인할수 있다.

 

 

 

 

●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에 저장. RegWritewrite 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에 저장. RegWritewrite 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_data1Read data1값을 불러오고 i_data2Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero1 된다. 올바르게 동작하는것을 확인할수 있다.

 

●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에 저장. RegWritewrite 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_data1Read data1값을 불러오고 i_data2Read data2또는 immediate값이 된다. ALUop=2이면 ADD를 해서 o_result에 저장한다. 두 값이 일치할때는 o_zero1 된다. 올바르게 동작하는것을 확인할수 있다.

 

 

●15 ns ~ 25 ns

[SEU] i_halfword=16’h0000, o_word=32’h00000000 : msb0이므로 i_halfword0으로 이루어진 16비트를 채워 32비트를 만듬

[ADD_BR] i_data1=32’h00000008, i_data2=32’h0000000, o_sum=32’h0000008 : i_data1i_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 : msb0이므로 i_halfword0으로 이루어진 16비트를 채워 32비트를 만듬

[ADD_BR] i_data1=32’h00000020, i_data2=32’h000000c0, o_sum=32’h000000e0 : i_data1i_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 이면 MemRead0, MemtoReg0, ALUSrc0이되고 ALUop2‘h2가 된다. RegDst=0이 되면 MemRead1, MemtoReg1, ALUSrc 1이되고 ALUop2‘h0이 된다. 모두 올바르게 동작하는 것을 확인할 수 있다.

[ALUControl] function fieldfunct[5:0]에 저장된다. op값이 2‘b00 일때는 signal값은 4’b0010을 주고

2’b01일때는 4’b0110, 2’b10 일때는 funct값에 따라 4’b0010, 0110, 0000, 0001, 0111의 값이 된다. 바르게 동작하는 것을 확인 할 수있다.

728x90