Voici comment votre simulateur décide sur bitwdith pour les résultats intermédiaires.
Verilog Simulation
Cette expression - assign y = xi*xi + xq*xq;
- est un exemple d'une expression déterminée contexte. Un simulateur Verilog prend le plus large de tous les réseaux ou variables dans l'expression et l'utilise. Donc, dans votre code, le plus grand est y
avec une largeur de 22 bits, donc Verilog utilisera 22 bits partout.
VHDL Simulation
Le comportement d'un simulateur VHDL dépend de l'emballage utilisé. Si vous utilisez le package numeric_std
, comme il est recommandé, alors vous devez respecter les règles suivantes:
La largeur de la somme devrait être la même que la plus large des deux opérandes. La largeur du produit doit correspondre à la somme des largeurs des opérandes.
Par conséquent, votre code compilerait si traduit directement en VHDL:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity power is
port (xi, xq : in signed(11-1 downto 0);
y : out signed(22-1 downto 0));
end entity power;
architecture A of power is
begin
y <= xi*xi + xq*xq;
end architecture A;
ne devrait pas être signé tout?
donné les noms de votre module (power
) et entrées (xi
et xq
) et après avoir passé 25 ans à la conception des systèmes radio, ne devraient-ils être signed
? Ne devrait pas votre Verilog être:
module power(input signed [11-1:0] xi,xq,output signed [22-1:0] y);
assign y = xi*xi + xq*xq;
endmodule
C'est la raison pour laquelle j'ai choisi le type de signed
numeric_std
, pas le type unsigned
.
Synthèse
Eh bien, je l'ai gaufrée sur au sujet des simulateurs, mais vous posé des questions sur la synthèse. Et, pour être franc, je ne sais pas ce qu'un synthétiseur ferait. Mais, étant donné que le travail d'un synthétiseur consiste à concevoir un circuit logique qui se comporte exactement comme la simulation, on pourrait penser que tout synthétiseur qui se respecte utiliserait les mêmes largeurs de bits que le simulateur. Donc, je suis à peu près sûr que c'est ta réponse.
Veuillez supprimer l'étiquette VHDL. – JHBonarius
Je pense que c'est le même problème pour n'importe quel langage HDL – Mortada
La réponse de Matthew Taylor démontre que le problème n'est pas identique pour les deux HDL. – user1155120