FPGA 보드 (Spartan 3E 스타터 키트)에서 5 단계 파이프 라인 Mips Cpu 구현이 거의 완료되었습니다. 그러나 하나의 모듈에는 중대한 문제가 있습니다.Verilog 오래된 값 문제
이 문제는 mMdule이 입력 신호에서 데이터를 가져 오는 경우 모듈이을 가져옵니다. 그 모듈은 CPU의 가장 중요한 부분 인 레지스터입니다. screenshot http://cfile8.uf.tistory.com/original/2441AB3351B74AD217FE01
회색 화살표가 나는 (내가 원하는) 설계 것입니다 : 여기
샷 (ISIM)입니다.그러나 모듈은 빨간색 화살표로 작동합니다.
모듈 내가 보드 만이 모듈을 구현
(When reg_write is true) and (Clk is true-not show in screenshot)
register[write_reg]=write_data;
내가 내 자신의 FPGA 보드 (스파르타 3E 스타터 키트) 을 정의합니다. 온보드 sw0 ~ 4를 사용하여 signal(Clk, signal. write_reg, write_data)
을 만들었습니다. (심지어 비록 clk)
그리고 나서 그것을 작동!
아무런 문제가 없습니다.
전체 CPU 설계에서이 모듈을 사용할 때.
모듈 발생 이전 값 문제입니다.
가 여기에 전체 소스
module reg1(Reset, Clk, read_reg1, read_reg2, write_reg, write_data, reg_write, read_data1, read_data2
);
input Reset;
input Clk;
input reg_write;
input [4:0] read_reg1, read_reg2, write_reg;
input [31:0] write_data;
output [31:0] read_data1;
output [31:0] read_data2;
reg [31:0] register [11:0];
reg [31:0] read_data1_reg;
reg [31:0] read_data2_reg;
wire [31:0] read_data1=read_data1_reg;
wire [31:0] read_data2=read_data2_reg;
always @(reg_write or Reset or read_reg1 or read_reg2)
begin
if(reg_write == 1'b0)
begin
case(read_reg1)
5'b00000: read_data1_reg=register[0];
5'b00001: read_data1_reg=register[1];
5'b00010: read_data1_reg=register[2];
5'b00011: read_data1_reg=register[3];
5'b00100: read_data1_reg=register[4];
5'b00101: read_data1_reg=register[5];
5'b00110: read_data1_reg=register[6];
5'b00111: read_data1_reg=register[7];
5'b01000: read_data1_reg=register[8];
5'b01001: read_data1_reg=register[9];
5'b01010: read_data1_reg=register[10];
5'b01011: read_data1_reg=register[11];
default: read_data1_reg=32'h00000000;
endcase
case(read_reg2)
5'b00000: read_data2_reg=register[0];
5'b00001: read_data2_reg=register[1];
5'b00010: read_data2_reg=register[2];
5'b00011: read_data2_reg=register[3];
5'b00100: read_data2_reg=register[4];
5'b00101: read_data2_reg=register[5];
5'b00110: read_data2_reg=register[6];
5'b00111: read_data2_reg=register[7];
5'b01000: read_data2_reg=register[8];
5'b01001: read_data2_reg=register[9];
5'b01010: read_data2_reg=register[10];
5'b01011: read_data2_reg=register[11];
default: read_data2_reg=32'h00000000;
endcase
end
else
begin
if(Clk==1'b1)
case(write_reg)
5'b00000: register[0] = write_data;
5'b00001: register[1] = write_data;
5'b00010: register[2] = write_data;
5'b00011: register[3] = write_data;
5'b00100: register[4] = write_data;
5'b00101: register[5] = write_data;
5'b00110: register[6] = write_data;
5'b00111: register[7] = write_data;
5'b01000: register[8] = write_data;
5'b01001: register[9] = write_data;
5'b01010: register[10] = write_data;
5'b01011: register[11] = write_data;
default: register[0] = register[0];
endcase
else
begin
//read_data1_reg = register[read_reg1];
//read_data2_reg = register[read_reg2];
case(read_reg1)
5'b00000: read_data1_reg=register[0];
5'b00001: read_data1_reg=register[1];
5'b00010: read_data1_reg=register[2];
5'b00011: read_data1_reg=register[3];
5'b00100: read_data1_reg=register[4];
5'b00101: read_data1_reg=register[5];
5'b00110: read_data1_reg=register[6];
5'b00111: read_data1_reg=register[7];
5'b01000: read_data1_reg=register[8];
5'b01001: read_data1_reg=register[9];
5'b01010: read_data1_reg=register[10];
5'b01011: read_data1_reg=register[11];
default: read_data1_reg=32'h00000000;
endcase
case(read_reg2)
5'b00000: read_data2_reg=register[0];
5'b00001: read_data2_reg=register[1];
5'b00010: read_data2_reg=register[2];
5'b00011: read_data2_reg=register[3];
5'b00100: read_data2_reg=register[4];
5'b00101: read_data2_reg=register[5];
5'b00110: read_data2_reg=register[6];
5'b00111: read_data2_reg=register[7];
5'b01000: read_data2_reg=register[8];
5'b01001: read_data2_reg=register[9];
5'b01010: read_data2_reg=register[10];
5'b01011: read_data2_reg=register[11];
default: read_data2_reg=32'h00000000;
endcase
end
end
if(Reset)
begin
register[0] = 32'h00000000;
register[1] = 32'h00000000;
register[2] = 32'h00000000;
register[3] = 32'h00000000;
register[4] = 32'h00000000;
register[5] = 32'h00000000;
register[6] = 32'h00000000;
register[7] = 32'h00000000;
register[8] = 32'h00000000;
register[9] = 32'h00000000;
register[10] = 32'h00000000;
register[11] = 32'b00000000000000000000000110010000;
case(read_reg1)
5'b00000: read_data1_reg=register[0];
5'b00001: read_data1_reg=register[1];
5'b00010: read_data1_reg=register[2];
5'b00011: read_data1_reg=register[3];
5'b00100: read_data1_reg=register[4];
5'b00101: read_data1_reg=register[5];
5'b00110: read_data1_reg=register[6];
5'b00111: read_data1_reg=register[7];
5'b01000: read_data1_reg=register[8];
5'b01001: read_data1_reg=register[9];
5'b01010: read_data1_reg=register[10];
5'b01011: read_data1_reg=register[11];
default: read_data1_reg=32'h00000000;
endcase
case(read_reg2)
5'b00000: read_data2_reg=register[0];
5'b00001: read_data2_reg=register[1];
5'b00010: read_data2_reg=register[2];
5'b00011: read_data2_reg=register[3];
5'b00100: read_data2_reg=register[4];
5'b00101: read_data2_reg=register[5];
5'b00110: read_data2_reg=register[6];
5'b00111: read_data2_reg=register[7];
5'b01000: read_data2_reg=register[8];
5'b01001: read_data2_reg=register[9];
5'b01010: read_data2_reg=register[10];
5'b01011: read_data2_reg=register[11];
default: read_data2_reg=32'h00000000;
endcase
//
end
else
begin
register[0] = register[0];
register[1] = register[1];
register[2] = register[2];
register[3] = register[3];
register[4] = register[4];
register[5] = register[5];
register[6] = register[6];
register[7] = register[7];
register[8] = register[8];
register[9] = register[9];
register[10] = register[10];
register[11] = register[11];
case(read_reg1)
5'b00000: read_data1_reg=register[0];
5'b00001: read_data1_reg=register[1];
5'b00010: read_data1_reg=register[2];
5'b00011: read_data1_reg=register[3];
5'b00100: read_data1_reg=register[4];
5'b00101: read_data1_reg=register[5];
5'b00110: read_data1_reg=register[6];
5'b00111: read_data1_reg=register[7];
5'b01000: read_data1_reg=register[8];
5'b01001: read_data1_reg=register[9];
5'b01010: read_data1_reg=register[10];
5'b01011: read_data1_reg=register[11];
default: read_data1_reg=32'h00000000;
endcase
case(read_reg2)
5'b00000: read_data2_reg=register[0];
5'b00001: read_data2_reg=register[1];
5'b00010: read_data2_reg=register[2];
5'b00011: read_data2_reg=register[3];
5'b00100: read_data2_reg=register[4];
5'b00101: read_data2_reg=register[5];
5'b00110: read_data2_reg=register[6];
5'b00111: read_data2_reg=register[7];
5'b01000: read_data2_reg=register[8];
5'b01001: read_data2_reg=register[9];
5'b01010: read_data2_reg=register[10];
5'b01011: read_data2_reg=register[11];
default: read_data2_reg=32'h00000000;
endcase
end
end
endmodule
TNK을! Verilog에 대해 더 공부해야한다고 생각합니다. – user1697281
첫 번째 차이점은 <=, = – user1697281