2017-05-04 3 views
1

J'ai écrit un code pour un multiplicateur de 52 bits que je dois donner sous une forme standard (standard à virgule flottante IEEE 754 pour les nombres de 64 bits). Donc après, je vérifie, combien de bits a-t-il dépassé de 64, de sorte que je mettrais ce nombre en exposant.Erreur de code Verilog: La plage doit être délimitée par des expressions constantes

module mul1(output reg [103:0] p, 
     output reg [51:0] c, 
     input [51:0] x, 
     input [51:0] y); 


reg [103:0]a; 
integer i; 

always @(x , y) 
begin 
    a=x; 
    p=0; // needs to zeroed 
    for(i=0;i<104;i=i+1) 
    begin 
    if(y[i]) 
     p=p+a; // must be a blocking assignment 
    a=a<<1; 
    end 

    for(i=103;i>=0;i=i-1) 
    begin 
    if (p[i]) 
     c=p[i:i-51]; 
     break; 
    end 

    end 
endmodule 

il donne une erreur: Gamme doit être délimitée par des expressions constantes pour la ligne: c = p [i: i-51]; Comment puis-je résoudre ce problème?

+0

Possible copie de [Verilog: "... n'est pas une constante"] (http://stackoverflow.com/questions/29815974/verilog-is-not-a-constant) – Qiu

Répondre

0

Vous ne pouvez pas sélectionner une partie/tranche variable (largeur variable). Pensez à l'affectation dans la perspective de la variable c. c a une largeur de 52 bits, donc vous devez lui assigner 52 bits de p. La boucle a juste besoin de sélectionner quels 52 bits. C'est ce que fait l'opérateur de sélection de partie variable. Il y a une bonne explication ici: Indexing vectors and arrays with +:

Il ressemble à:

c=p[i+:52] 

Ce qui signifie, sélectionnez i allant jusqu'à i + 52-1 de p à partir de (bit inférieur) et affecter à c.

module mul1(output reg [103:0] p, 
     output reg [51:0] c, 
     input [51:0] x, 
     input [51:0] y); 


reg [103:0]a; 
integer i; 

always @(x , y) begin 
    a=x; 
    p=0; // needs to zeroed 
    for(i=0;i<104;i=i+1) begin 
    if(y[i]) begin 
     p=p+a; // must be a blocking assignment 
    end 
    a=a<<1; 
    end 

    for(i=103;i>=0;i=i-1) begin 
    if (p[i]) begin 
     c=p[i+:52]; 
     break; 
    end 
    end 
end 
endmodule 

En outre, vous avez besoin d'un « commencer » après le « si » dans la 2ème boucle et une « fin » pour fermer le bloc toujours. Le code ci-dessus compile pour moi.