Systemverilog problème avec always_comb construire
J'ai un problème avec cette Systemverilog code.
Je suis un débutant dans cette langue, et il est très dificile
pour trouver des documentations à propos de cette langue.
Voici le code:
module mult ( multiplicande, multiplicateur, Produit, clk, claire, le processus Starmc, endm );
input [31:0] multiplicand;
input [31:0] multiplier ;
input clk;
input clear;
input Startm;
output logic [63:0] Product;
output logic endm;
enum logic [1:0] { inicio, multiplicar, nao_multiplicar, fim } estados;
logic [1:0] state;
logic [31:0] mplier;
logic [31:0] mplier_aux;
logic [31:0] mcand ;
logic [31:0] mcand_aux;
logic [63:0] Prod ;
logic [63:0] Prod_aux;
logic [5:0] cont;
logic [5:0] cont_aux;
initial begin
mplier = multiplier;
mplier_aux = multiplier;
mcand = multiplicand;
mcand_aux = multiplicand;
Prod = 0;
Prod_aux = 0;
state = inicio;
cont = 0;
cont_aux = 0;
end
always_ff @( posedge clk )
begin
if( clear )
begin
state <= inicio;
end
else if ( Startm )
begin
case( state )
inicio :
begin
if( mplier[0] == 0 )
begin
state <= nao_multiplicar;
end
else if( mplier[0] == 1 )
begin
state <= multiplicar;
end
end
multiplicar :
begin
if( cont == 32 )
state <= fim;
else if( mplier[0] == 0 )
begin
state <= nao_multiplicar;
end
else if( mplier[0] == 1 )
begin
state <= multiplicar;
end
end
nao_multiplicar:
begin
if( cont == 32 )
state <= fim;
else if( mplier[0] == 0 )
begin
state <= nao_multiplicar;
end
else if( mplier[0] == 1 )
begin
state <= multiplicar;
end
end
fim:
begin
state <= inicio;
end
endcase
end
end
always_comb
begin
case(state)
inicio:
begin
mplier = multiplier;
mcand = multiplicand;
Prod = 0;
cont_aux = cont + 1;
cont = cont_aux;
end
multiplicar:
begin
mcand_aux = mcand << 1;
mcand = mcand_aux ;
mplier_aux = mplier >> 1;
mplier = mplier_aux ;
Prod_aux = Prod + mcand;
Prod = Prod_aux;
cont_aux = cont + 1;
cont = cont_aux;
end
nao_multiplicar:
begin
cont_aux = cont + 1;
cont = cont_aux;
end
fim:
begin
Product = Prod;
endm = 1;
end
endcase
end
endmodule
Je suis en train d'écrire un multiplicateur avec des entrées de 32 bits et un produit de 64 bits à l'aide de
le Stand de l'algorithme. Cette erreur se produit : "always_comb construire ne renvoie pas purement combinatoire logique". Pourquoi cela se produit?
- Un exemple minimal qui montre votre problème serait aide.
Vous devez vous connecter pour publier un commentaire.
Lors de la description combinatoire logique dans
always
blocs, vous devez vous assurer que toutes vos variables sont affectées d'une valeur dans tous les chemins dans votre code. Sinon, un loquet sera déduit. Il est facile de rater quelque chose comme cela dans la traditionnellealways
blocs, de sorte que laalways_comb
bloc a été introduit en SystemVerilog explicitement le vérifier.Dans votre cas, vous avez un peu de bus qui ne sont pas des valeurs attribuées à chaque branche de l'instruction du cas, par exemple
mcand
n'a pas une valeur qui lui est assignée dans les branchesnao_multiplicar
etfim
.Il y a 2 solutions. La première est, ainsi, de céder à toutes vos variables dans toutes vos branches de code.
Une autre solution est d'écrire "par défaut" des valeurs pour toutes les variables dans le
always_comb
avant l'instruction de cas. De cette façon, chaque variable sera toujours attribuée une valeur à chaque fois que lealways_comb
bloc déclenche, et il n'y aura pas de mises en garde. Votre instruction du cas, puis il suffit de traiter avec les variables qu'il faut changer:Toutes les erreurs de compilation sont éliminés quand je me débarrasser de l'
initial
bloc. Je suis à l'aide de simulateurs de Cadence et de Synopsys.Voici une citation de la norme IEEE Std, 1800-2009, section 9.2.2.4 "logique Séquentielle always_ff procédure":
Similaire il ya un devis pour
always_comb
.La documentation est facilement disponible à partir de l'IEEE. Votre simulateur doit aussi avoir de la documentation.
Le message d'erreur que vous recevez de votre outil ne semble pas être très utile dans ce cas.
Le LRM est le plus utile de la documentation-je utiliser pour system verilog
http://www.vhdl.org/sv/SystemVerilog_3.1a.pdf
always_comb déduit combinatoire logique, cependant, dans votre always_comb bloc que vous faire des travaux comme code C, e.g:
Ici vous demander de faire une combinatoire logique avec des commentaires.
Si vous souhaitez stocker des valeurs dans le temps, vous devez mettre vos missions dans un always_ff bloc, ce qui permettra d'en déduire une logique séquentielle.