2017-05-14 6 views
1

habe ich die folgenden Module in separaten Dateien. Wenn ich versuche, mein RC_ADD_SUB_32 Modul zu starten, bekomme ich den Fehler Instanziierung von 'inst' fehlgeschlagen. Region:/RC_ADD_SUB_32_TB/obj/rc_gen_loop [0]/FULL_ADDER Die Designeinheit wurde nicht gefunden. Fehler beim Laden des Designs. Das Instanziieren des Volladdierers funktioniert nicht innerhalb des Generate-Blocks. Ich habe Probleme, den Volladdierer in der Datei rc_add_sub_32.v zu instanziieren. Irgendwelche Ideen?Fehler beim Laden des Designs Bei Verwendung des Moduls innerhalb des Generate-Blocks

full_adder.v

module FULL_ADDER(S,CO,A,B, CI); 
    output S,CO; 
    input A,B, CI; 

    wire HF_1_Y, HF_1_C, HF_2_C; //Half Adder 1 Y, Half Adder 1 C and Half Adder 2 C 

    HALF_ADDER inst_01 (.A(A), .B(B), .Y(HF_1_Y), .C(HF_1_C)); 
    HALF_ADDER inst_02 (.A(HF_1_Y), .B(CI), .Y(S), .C(HF_2_C)); 
    or inst_03(CO, HF_2_C, HF_1_C); 
endmodule; 

rc_add_sub_32.v

module RC_ADD_SUB_32(Y, CO, A, B, SnA); 
    // output list 
    //output [63:0] Y; 
    output [`DATA_INDEX_LIMIT:0] Y; //Our result 
    output CO; 
    // input list 
    //input [63:0] A; 
    //input [63:0] B; 
    input [`DATA_INDEX_LIMIT:0] A; 
    input [`DATA_INDEX_LIMIT:0] B; 

    input SnA; 

    //full adder -> full adder connection 
    wire [`DATA_INDEX_LIMIT:0] CO_TO_CI; 
    wire [`DATA_INDEX_LIMIT:0] XOR_OUT; 

    genvar i; 
    generate 
     for(i=0; i<32; i=i+1) 
     begin: rc_gen_loop 
     /* 
      Cases: 
      Index 0: CI is SnA CO -> CI[1] 
      Index 31: CI is CO from index 30, CO is output CO, 
      Index 1-30: CI is from previous CO, CO points to next CI 
     */ 
      xor xors(XOR_OUT[i], SnA, B[i]); 
      if(i==0) 
      begin: 
       FULL_ADDER inst(.S(Y[i]), .CO(CO_TO_CI[i]), .A(A[i]), .B(XOR_OUT[i]), .CI(SnA)); 
      end 
      else if(i==31) 
      begin: 
       FULL_ADDER inst(.S(Y[i]), .CO(CO), .A(A[i]), .B(XOR_OUT[i]), .CI(CO_TO_CI[i-1])); 
      end 
      else if(i!=31 && i!=0) 
      begin: 
       FULL_ADDER inst(.S(Y[i]), .CO(CO_TO_CI[i]), .A(A[i]), .B(XOR_OUT[i]), .CI(CO_TO_CI[i-1])); 
      end 
     end 
    endgenerate 
endmodule 

Die Datei rc_add_sub_tb.v Prüfstand

module RC_ADD_SUB_32_TB; 
    reg [`DATA_INDEX_LIMIT:0] A; 
    reg [`DATA_INDEX_LIMIT:0] B; 
    reg SnA; 

    wire [`DATA_INDEX_LIMIT:0] Y; 
    wire CO; 

    RC_ADD_SUB_32 obj(Y, CO, A, B, SnA); 

    initial 
    begin 
     #5 A = 0; B= 0; SnA = 0; 
     #5 A = 0; B= 0; SnA = 1; 
     #5 A = 0; B= 1; SnA = 0; 
     #5 A = 0; B= 1; SnA = 1; 
     #5 A = 1; B= 0; SnA = 0; 
     #5 A = 1; B= 0; SnA = 1; 
     #5 A = 1; B= 1; SnA = 0; 
     #5 A = 1; B= 1; SnA = 1; 
     #5; 
    end 
endmodule 
+1

Ist es das Modul außerhalb des Blocks erzeugen laden? Sind Sie sicher, dass sich das 'FULL_ADDER' Modul in Ihrer Parse-Hierarchie befindet? –

Antwort

0

Die Bedingung Aussagen haben begin: ohne Etikett. So wie es ist, behandelt der Simulator es entweder als leeres Etikett oder Zeilenumbruch und macht FULL_ADDER als den Etikettennamen. Beide sind illegal. Fügen Sie entweder eine Bezeichnung (bevorzugt) hinzu oder entfernen Sie den Doppelpunkt.

FYI, die if(i!=31 && i!=0) ist unnötig, da die Bedingungen in den vorherigen Bedingungen gefangen wurden.

Beispiel mit Etiketten:

if(i==0) 
begin: gen_first 
    FULL_ADDER inst(.S(Y[i]), .CO(CO_TO_CI[i]), .A(A[i]), .B(XOR_OUT[i]), .CI(SnA)); 
end 
else if(i==31) 
begin: gen_last 
    FULL_ADDER inst(.S(Y[i]), .CO(CO), .A(A[i]), .B(XOR_OUT[i]), .CI(CO_TO_CI[i-1])); 
end 
else 
begin: gen_middle 
    FULL_ADDER inst(.S(Y[i]), .CO(CO_TO_CI[i]), .A(A[i]), .B(XOR_OUT[i]), .CI(CO_TO_CI[i-1])); 
end 

oder ohne Etiketten:

if(i==0) 
begin 
    FULL_ADDER inst(.S(Y[i]), .CO(CO_TO_CI[i]), .A(A[i]), .B(XOR_OUT[i]), .CI(SnA)); 
end 
else if(i==31) 
begin 
    FULL_ADDER inst(.S(Y[i]), .CO(CO), .A(A[i]), .B(XOR_OUT[i]), .CI(CO_TO_CI[i-1])); 
end 
else 
begin 
    FULL_ADDER inst(.S(Y[i]), .CO(CO_TO_CI[i]), .A(A[i]), .B(XOR_OUT[i]), .CI(CO_TO_CI[i-1])); 
end 
Verwandte Themen