2017-10-10 7 views
1

Tenir compte le module suivant:Comment le synthétiseur décide-t-il bitwdith pour des résultats intermédiaires?

module power(input [11-1:0] xi,xq,output [22-1:0] y); 
    assign y = xi*xi + xq*xq; 
    endmodule 

Je sais que ma mission unique est en fait décomposé en 3 étapes: 2 places et un ajout. Ma question est de savoir comment le synthétiseur déciderait de la largeur de bits des étapes intermédiaires xi*xi et xq*xq?

J'ai remarqué que lors de l'exécution du code ci-dessus circuit equivelance logique (LEC), il cause des problèmes et ne pouvait être résolu en décomposant la seule cession en trois missions comme suit:

module power(input [11-1:0] xi,xq,output [22-1:0] yy); 
    wire [21-1:0] pi,pq; 
    assign pi = xi*xi; 
    assign pq = xq*xq; 
    assign yy = pi+pq; 
    endmodule 
+0

Veuillez supprimer l'étiquette VHDL. – JHBonarius

+1

Je pense que c'est le même problème pour n'importe quel langage HDL – Mortada

+0

La réponse de Matthew Taylor démontre que le problème n'est pas identique pour les deux HDL. – user1155120

Répondre

2

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 signednumeric_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.

+0

J'ai effectivement déclaré les variables comme signés dans mon design, c'est pourquoi je n'ai pas besoin du bit supplémentaire: – Mortada

+0

@Mortada Oui, parce que vous ' Au contraire, la réponse sera toujours positive. Je vais modifier ma réponse. –

+0

réellement ceil (log2 ((2^(11-1) -1)^2 + (2^(11-1) -1)^2)) est 21, plus un bit pour le signe fait 22 bits. Cela dit, peu importe que la réponse soit positive ou non: j'ai un bit pour le signe – Mortada