Erreur “procédure de cession à un non-enregistrer le résultat n'est pas autorisée”
J'obtiens le message d'erreur
[Synth 8-2576] procédure de cession à un non-enregistrer le résultat n'est pas
permis ["lpm_mult.v":29]
Ce que je fais mal?
module lpm_mult (
dataa, datab, //multiplicand,multiplier
sum, //partial sum
clock, //pipeline clock
clken, //clock enable
aclr, //asynch clear
result //product
);
input clock;
input clken;
input aclr;
input [31:0] dataa;
input [31:0] datab;
input [63:0] sum;
output [63:0] result;
always @ (clken or posedge clock) begin
if (1==clken) begin
assign result = dataa * datab;
end
end
endmodule
N'est-ce pas le message d'erreur décrit dans la vivado docs? Vous pouvez également disposer d'une synthèse de problème avec
always @ (clken or posedge clock)
. Ma conjecture est que vous ne voulez pas clken
là-dedans, ou le assign
pour cette question.OriginalL'auteur Helyx | 2015-07-17
Vous devez vous connecter pour publier un commentaire.
Il y a plus de questions alors donner ensuite le message d'erreur. Comme d'autres l'ont déjà souligné
result
devrait être défini commeoutput reg [63:0] result;
Les autres questions ne génèrent pas d'erreur de compilation; ils sont la génération d'un comportement incorrect et sont unsynthesizable. Avec le code:
clken
est asynchrone déclencheur; il ne devrait pas être dans la sensibilité de la liste.Un
assign
déclaration à l'intérieur du bloc est toujours un appel de procédure continue d'affectation. Une fois l'affectation est déclenchée, il sera en permanence et immédiatement mis à jour sur tout changement àdataa
oudatab
(en ignorant les conditions declken
etclock
).Remarque: IEEE envisage de dépréciation de la procédure continue d'affectation, de sorte que dans l'avenir, il deviendra probablement illégal de la syntaxe. La norme IEEE Std 1800-2012 C. 4.2 Procédure d'affecter et de dés-assigner des déclarations:
En continu des affectations (
assign
en dehors de la procédure de bloc) restera légal de la syntaxe.Verilog et SystemVerilog ont officiellement fusionné par IEEE IEEE Std 1800-2009.
Synchrone logique devez utiliser non-bloquant (
<=
) affectations. Il est légal de syntaxe de blocage (=
) affectations dans synchrone de la logique des blocs, mais n'est-il pas repris. Utilisation de blocage des affectations dans synchrone de la logique des blocs peut provoquer des conditions de course dans le simulateur résultant de comportement décalage entre RTL et synthétisé circuit.assign
états doivent utiliser le blocage des affectations (non-bloquant est illégal de syntaxe).Votre code devrait ressembler à quelque chose en ligne de la suite de compiler et de se comporter correctement dans la simulation:
OriginalL'auteur Greg
Vous attribuez à
result
à l'intérieur d'unalways
bloc, ce qui n'est pas autorisé, parce queresult
est unwire
, pas unreg
.Déclarer
result
comme suit pour le faire fonctionner:OriginalL'auteur mkrieger1
Par défaut, toutes les entrées et les signaux de sortie sont des "fils de". Les fils ne peuvent être affectés dans la procédure de blocs.
Cela devrait corriger l'erreur.
OriginalL'auteur PAVAN ANAND