2017-10-10 3 views
1

Betrachten Sie das folgende Modul:Wie entscheidet der Synthesizer über Bitwdith für Zwischenergebnisse?

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

Ich weiß, dass meine einzige Zuordnung tatsächlich von 3 Stufen zerlegt wird: 2 Quadrate und eine Addition. Meine Frage ist, wie würde der Synthesizer über die Bitbreite der Zwischenschritte xi*xi und xq*xq entscheiden?

Ich bemerkte, dass, wenn Logik equivelance Schaltung (lec) für den obigen Code ausgeführt wird, es Probleme verursacht und nur durch Zerlegen der Einzelbelegung in drei Aufgaben gelöst werden konnte wie folgt:

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

Bitte entfernen Sie das VHDL-Tag. – JHBonarius

+1

Ich denke, es ist das gleiche Problem für jede HDL-Sprache – Mortada

+0

Matthew Taylors Antwort zeigt, dass das Problem für beide HDLs nicht identisch ist. – user1155120

Antwort

2

Hier ist, wie Ihr Simulator entscheidet über Bitwdith für Zwischenergebnisse.

Verilog Simulation

Dieser Ausdruck - assign y = xi*xi + xq*xq; - ist ein Beispiel für einen Kontext bestimmt Ausdruck. Ein Verilog-Simulator nimmt das breiteste aller Netze oder Variablen im Ausdruck und verwendet diesen. Also, in Ihrem Code ist die breiteste y mit 22 Bit Breite, so wird Verilog 22 Bits durchgängig verwenden.

VHDL Simulation

Das Verhalten eines VHDL-Simulator abhängig von der verwendeten Verpackung. Wenn Sie das numeric_std Paket verwenden, wie empfohlen wird, dann müssen Sie die folgenden Regeln befolgen:

Die Breite der Summe soll das gleiches wie die breiteren der beiden Operanden sein. Die Breite des Produkts sollte die Summe der Breiten der Operanden sein.

Daher würde der Code, wenn sie direkt in VHDL übersetzt kompilieren:

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; 

Sollte nicht alles unterschrieben werden?

die Namen Ihres Moduls Given (power) und Eingänge (xi und xq) und Systeme Funk Gestaltung 25 Jahre verbracht haben, sollten sie signed sein nicht? Sollte nicht Ihre Verilog sein:

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

Deshalb habe ich die signed Typ von numeric_std gewählt haben, nicht die unsigned Typ.

Synthese

Nun, ich habe über Simulatoren waffled auf, aber man fragte nach Synthese. Und, um ehrlich zu sein, ich weiß nicht, was ein Synthesizer tun würde. Da es jedoch die Aufgabe eines Synthesizers ist, eine Logikschaltung zu entwerfen, die sich genau wie die Simulation verhält, würde man meinen, dass jeder Synthesizer, der etwas auf sich hält, die gleichen Bitbreiten wie der Simulator verwendet. Also, ich bin mir ziemlich sicher, dass das deine Antwort ist.

+0

Ich erklärte die Variablen tatsächlich als in meinem Design unterzeichnet, deshalb brauchte ich das zusätzliche Bit nicht: – Mortada

+0

@Mortada Ja, weil Sie ' Wenn man es quadriert, wird die Antwort immer positiv sein. Ich werde meine Antwort bearbeiten. –

+0

tatsächlich Ceil (log2 ((2^(11-1) -1)^2 + (2^(11-1) -1)^2)) ist 21, plus ein Bit für das Zeichen macht es 22 Bits. Es ist jedoch egal, ob die Antwort positiv ist oder nicht: Ich habe ein Bit für das Zeichen – Mortada

Verwandte Themen