2012-04-06 6 views
2

ich Verilog mit ModelSim verwende und ich erhalte die folgenden Fehler, wenn ich versuche reg Variablen auf verschiedene Teile eines anderen reg Variablen zuzuweisen:Verilog reg Zuordnung zum Teil einer anderen reg

** Error: Range width must be greater than zero. 
** Error: Range width must be constant expression. 

hier ist der entsprechende Code :

integer f; //zd, qd, R and Q are regs 

    always @ * begin 
    f = 52 - zd; 
    R = qd[f +:0]; 
    Q = qd[63 -:f+1]; 
    end 

I R qd möchte (von 0 bis f) und Q (der Rest), QD (von f + 1 bis 63) aufzunehmen. Wie es geht? Vielen Dank.

+0

Hier ist [eine Antwort] (http://stackoverflow.com/questions/7543592/verilog-barrel-shifter/ 7543745 # 7543745) zu einem ähnlichen Problem. –

Antwort

3

Was Sie tun möchten, ist nicht legal in Verilog 2001

Wie Ihre Warnung sagt, Range width must be constant expression, das heißt Sie nicht mit variabler Länge Teil wählt haben.

Sie haben können Länge Teil auswählen befestigt, dass der Ausgangspunkt variiert (dh wählen 8 Bits von f beginnend), aber die Syntax für das heißt das:

vector_name[starting_bit_number +: part_select_width] 
vector_name[starting_bit_number -: part_select_width] 

In Hardware die Größe eines Busses sein muß eine feste Größe, Sie können die Anzahl der Drähte in Silizium nicht ändern, basierend auf dem Inhalt eines Registers :)

+0

AKA: "Indexed Part Selects" – Marty

+0

Das stimmt aber nicht, was ich wirklich wollte. Was ist, wenn der Teil select_width größer als die restlichen Bits ist? Alle verbleibenden Bits werden ohne Probleme ausgewählt? – mj1261829

+0

@ user1261829: Es würde wahrscheinlich nur ungültige Daten erzeugen, wenn Sie das Startbit so gewählt haben, dass die Teileauswahl den Bus überläuft. Können Sie beschreiben, was Sie auf einer höheren konzeptionellen Ebene tun möchten? Vielleicht gibt es einen besseren Weg als das, was Sie tun wollen. – Tim