2017-03-13 8 views
0

J'utilise une boucle de génération pour instancier un nombre paramétrable de modules, et je veux affecter certaines des entrées au module en fonction de l'itération de la boucle. Malheureusement, je rencontre des problèmes de synthèse où le compilateur de conception dit qu'il y a une erreur parce que la largeur du port ne correspond pas. Voici ce que je suis en train de faire:verilog generate boucle attribuer à l'itérateur de la largeur de l'itérateur

genvar k; 
generate 
    for(k = 0; k < `NUM/2; ++k) begin 
     cmp2 cmps(
      .a  (arr[k]), 
      .b  (arr[k+1]), 
      .a_idx (k), //gives errors about port width mismatch 
      .b_idx (k+1), //but I can't get it to work any other way 
      .data_out(data[k]), 
      .idx_out (idx[k]) 
      ); 
    end 
endgenerate 

J'ai aussi essayé d'utiliser localparams dans la boucle et l'affectation a_idx et b_idx au localparam mais je reçois toujours la même erreur dans la synthèse.

J'ai essayé quelque chose comme .a_idx((k)[bit_width-1:0]), mais ça ne marche pas non plus.

Des idées?

Répondre

2

k et k+1 ont une largeur de 32 bits, ce qui provoque la différence de largeur. Selon ce que votre outil de synthèse prend en charge, vous pourriez vouloir essayer ce qui suit:

  • Bit tranchage:

    .a_idx (k[0 +: bit_width]) 
    
  • Moulage à bit_width logique -Wide:

    typedef logic[bit_width-1:0] logicN_t; 
    // .... // 
        .a_idx (logicN_t'(k)), 
        .b_idx (logicN_t'(k+1)), 
    // .... //