2012-04-06 4 views
2

J'utilise Verilog avec ModelSim et je reçois les erreurs suivantes lorsque je tente d'assigner des variables de reg à différentes parties d'une autre variable reg:affectation Verilog reg à une partie d'un autre reg

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

est le code approprié ici :

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

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

Je veux R pour inclure qd (de 0 à f) et Q comme (le reste) qd (f + de 1 à 63). Comment faire? Merci.

+0

Voici une réponse (http://stackoverflow.com/questions/7543592/verilog-barrel-shifter/ 7543745 # 7543745) à un problème similaire. –

Répondre

3

Ce que vous essayez de faire est pas légal en Verilog 2001.

Comme votre avertissement dit, Range width must be constant expression, à savoir que vous ne pouvez pas avoir une partie longueur variable sélectionne.

Vous pouvez avoir partie fixe de longueur sélectionner qui varie le point de départ (à savoir sélectionner 8 bits à partir de f), mais la syntaxe pour c'est ceci:

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

dans le matériel de la taille d'un bus doit être une taille fixe, vous ne pouvez pas changer le nombre de fils dans le silicium basé sur le contenu d'un registre :)

+0

AKA: "Indexed Part Selects" – Marty

+0

C'est vrai, mais ne réalise pas ce que je voulais vraiment. Que faire si la partie select_width est supérieure aux bits restants? tous les bits restants seront sélectionnés sans problème? – mj1261829

+0

@ user1261829: Cela générerait probablement juste des données non valides si vous sélectionniez le bit de départ de sorte que la sélection de partie déborde du bus. Pouvez-vous décrire ce que vous essayez de faire à un niveau conceptuel plus élevé? Peut-être qu'il y a une meilleure façon d'y arriver que ce que vous essayez de faire. – Tim