2017-05-14 4 views
1

J'ai les modules suivants dans des fichiers séparés. Lorsque j'essaie de lancer mon module RC_ADD_SUB_32, l'erreur d'instanciation de 'inst' échoue. Région:/RC_ADD_SUB_32_TB/obj/rc_gen_loop [0]/FULL_ADDER L'unité de conception n'a pas été trouvée. Erreur lors du chargement du design. L'instanciation de l'addition complète ne fonctionne pas dans le bloc de génération. J'ai du mal à instancier l'Adder complet dans le fichier rc_add_sub_32.v. Des idées?Erreur lors du chargement de la conception Lorsque vous utilisez le module à l'intérieur du bloc de génération

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 

Le fichier testbench rc_add_sub_tb.v

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

-t-il charger le module en dehors du bloc générer? Êtes-vous sûr que le module 'FULL_ADDER' est dans votre hiérarchie d'analyse? –

Répondre

0

Les états de l'état ont begin: sans étiquette. En l'état, le simulateur le traite comme une étiquette vierge ou un retour à la ligne et fait de FULL_ADDER le nom de l'étiquette. Les deux sont illégaux. Soit ajouter une étiquette (préféré) ou se débarrasser du côlon.

FYI, le if(i!=31 && i!=0) est inutile car les conditions ont été capturées dans les conditions antérieures.

Exemple avec des étiquettes:

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 

ou sans étiquettes:

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