2013-06-11 3 views
0

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 

답변

2

첫 번째 문제, CLK는 항상 블록의 당신의 감도 목록에없는,하지만 당신은 문 경우 중 하나에 그것을 사용할 수 있습니다.

더 많은 정보는이 전체 블록의 코딩입니다. 레지스터를 원하면 래치를 추론합니다. 먼저 비 차단 할당을 원할 때 "="블로킹 할당을 사용하고 있습니다. "< =". 두 번째로 변경해야 할 것은 레지스터 할당을 꺼내서 다른 항상 블록에서 수행하는 것입니다. 그것은 다음과 같이 보일 것입니다 :

[email protected](posedge clk, posedge reset) 
begin 
    if(reset) 
     reset data 
    else if(write_en0 
     set regs to writedata 
    else 
     reg <= reg 
end 

[email protected](posedge clk, posedge reset) 
begin 
    read_data1 data 
end 

[email protected](posedge clk, posedge reset) 
begin 
    read_data2 data 
end 

이 논문은 잘 설명 : http://www-inst.eecs.berkeley.edu/~cs152/fa04/handouts/CummingsHDLCON1999_BehavioralDelays_Rev1_1.pdf

+1

TNK을! Verilog에 대해 더 공부해야한다고 생각합니다. – user1697281

+0

첫 번째 차이점은 <=, = – user1697281