2016-12-05 2 views
0

가산기에 대한 디자인을하지만 결과가 잘못되었습니다.코드를 변경하는 방법. Verilog 테스트 벤치 코드

module FMUL(CLK, St, F1, E1, F2, E2, F, V, done); 

    input CLK; 
    input St; 
    input [3:0] F1; 
    input [3:0] E1; 
    input [3:0] F2; 
    input [3:0] E2; 
    output[6:0] F; 
    output V; 
    output done; 

    reg[6:0] F; 
    reg done; 
    reg V; 

    reg[3:0] A; 
    reg[3:0] B; 
    reg[3:0] C; 
    reg[4:0] X; 
    reg[4:0] Y; 
    reg Load; 
    reg Adx; 
    reg SM8; 
    reg RSF; 
    reg LSF; 
    reg AdSh; 
    reg Sh; 
    reg Cm; 
    reg Mdone; 
    reg[1:0] PS1; 
    reg[1:0] NS1; 
    reg[2:0] State; 
    reg[2:0] Nextstate; 

    initial 
    begin 
     State = 0; 
     PS1 = 0; 
     NS1 = 0; 
     Nextstate=0; 
    end 

    always @(PS1 or St or Mdone or X or A or B) 
    begin : main_control 
    Load = 1'b0; 
    Adx = 1'b0; 

    NS1 = 0; 
    SM8 = 1'b0; 
    RSF = 1'b0; 
    LSF = 1'b0; 

    V = 1'b0; 
    F = 7'b0000000; 
    done = 1'b0; 
    case (PS1) 
    0 : 
    begin 
     F = 7'b0000000; 
     done = 1'b0; 
     V = 1'b0; 
     if(St == 1'b1) 
     begin 
      Load = 1'b1; 
      NS1 = 1; 
     end 

    end 

    1 : 
    begin 
     Adx = 1'b1; 
     NS1 = 2; 
    end 

    2 : 
    begin 
     if(Mdone == 1'b1) 
     begin 
      if(A==0) 
      begin 
       SM8 = 1'b1; 
      end 
      else if(A == 4 & B == 0) 
      begin 
       RSF = 1'b1; 
      end 
      else if (A[2] == A[1]) 
      begin 
       LSF = 1'b1; 
      end 
      NS1 = 3; 
      end 

      else 
      begin 
       NS1 = 2; 
      end 
    end 

    3 : begin 
      if(X[4] != X[3]) 
      begin 
       V = 1'b1; 
      end 
      else 
      begin 
       V = 1'b0; 
      end 
      done = 1'b1; 
      F = {A[2:0],B}; 
      if(St==1'b0) 
      begin 
       NS1 = 0; 
      end 

     end 

    endcase 
    end 



    always @(State or Adx or B) 
    begin : mul2c 
    AdSh = 1'b0; 
    Sh = 1'b0; 
    Cm = 1'b0; 
    Mdone = 1'b0; 
    Nextstate = 0; 

    case(State) 
    0 : 
    begin 
     if(Adx==1'b1) 
     begin 
      if((B[0]) == 1'b1) 
      begin 
       AdSh = 1'b1; 
      end 
      else 
      begin 
       Sh = 1'b1; 
      end 
      Nextstate = 1; 
      end 
     end 

    1,2 : 
    begin 
     if((B[0])==1'b1) 
     begin 
      AdSh = 1'b1; 
     end 
     else 
     begin 
      Sh = 1'b1; 
     end 
     Nextstate = State + 1; 
     end 

    3: 
    begin 
     if((B[0])==1'b1) 
     begin 
      Cm = 1'b1; 
      AdSh = 1'b1; 
     end 
     else 
     begin 
      Sh = 1'b1; 
     end 
     Nextstate = 4; 
     end 

    4: 
    begin 
     Mdone = 1'b1; 
     Nextstate = 0; 
    end 

    endcase 
    end 



    wire [3:0] addout; 
    assign addout = (Cm == 1'b0)? (A+C) : (A-C); 

    always @(posedge CLK) 
    begin : update 

     PS1 <= NS1; 
     State <= Nextstate; 
     if(Load == 1'b1) 
     begin 
      X <= {E1[3], E1}; 
      Y <= {E2[3], E2}; 
      A <= 4'b0000; 
      B <= F1; 
      C <= F2; 

      end 

      if(Adx == 1'b1) 
      begin 
       X <= X+Y; 
      end 
      if(SM8 == 1'b1) 
      begin 
       X <= 5'b11000; 
      end 

      if(RSF == 1'b1) 
      begin 
       A <= {1'b0, A[3:1]}; 
       B <= {A[0], B[3:1]}; 
       X <= X+1; 
      end 
      if(LSF == 1'b1) 
      begin 
       A <= {A[2:0], B[3]}; 
       B <= {B[2:0], 1'b0}; 
       X <= X+31; 
      end 
      if(AdSh == 1'b1) 
      begin 
       A <= {(C[3]^Cm), addout[3:1]}; 
       B <= {addout[0], B[3:1]}; 
      end 
      if(Sh == 1'b1) 
      begin 
       A <= {A[3], A[3:1]}; 
       B <= {A[0], B[3:1]}; 
      end 
      end 

      endmodule 

테스트 벤치.

module tb_FMUL(); 

    wire[6:0] F; 
    wire done; 
    wire V; 

    reg[3:0] A; 
    reg[3:0] B; 
    reg[3:0] C; 
    reg[4:0] X; 
    reg[4:0] Y; 
    reg Load; 
    reg Adx; 
    reg SM8; 
    reg RSF; 
    reg LSF; 
    reg AdSh; 
    reg Sh; 
    reg Cm; 
    reg Mdone; 
    reg[1:0] PS1; 
    reg[1:0] NS1; 
    reg[2:0] State; 
    reg[2:0] Nextstate; 
    reg CLK; 
    reg St; 
    reg [3:0] F1; 
    reg [3:0] E1; 
    reg [3:0] F2; 
    reg [3:0] E2; 

    FMUL u0(CLK, St, F1, E1, F2, E2, F, V, done); 

    always 
    begin 
    #10 CLK <= ~CLK; 
    end 



    initial 
    begin 

    #100 F1 = 2.125; 
    E1 = 5; F2 = 5.1; E2 = 1; St=0; 

    #100 F1 = 1.125; 
    E1 = 5; F2 = 2.1; E2 = 2; St=0; 

    #100 F1 = 5.125; 
    E1 = 5; F2 = 3.1; E2 = 3; St=0; 


    end 


endmodule 

시뮬레이션 결과 파형. enter image description here

나는이 책을 참조한다. 코드 테스트 벤치가 없다. 그래서 만들었습니다. 그러나 작동하지 않습니다.

또한 CLK는 변경되지 않습니다.

테스트 벤치 코드를 검토하십시오.

+0

당신은 부동 소수점 값으로'reg' 유형을 할당 할 수 없습니다. 가장 가까운 정수로 반올림됩니다. – Greg

답변

2

당신이 두 가지 문제 (적어도) :

  1. 귀하의 시계가 (예를 들어 1'b0에) 초기화 할 필요가 :

    초기 CLK = 1'b0;

Verilog를 임의 wire 또는 reg의 초기 값은 1'bx이고; ~1'bx1'bx이고; CLK1'bx에 남아 있습니다.

  1. 시뮬레이션이 중단되지 않습니다. 주 initial 블록에 $finish으로 전화를 걸었습니다.

https://www.edaplayground.com/x/r4U