Générer Si les Déclarations en Verilog

Je suis en train de créer un synthesizable, paramétrées, la priorité de l'encodeur en Verilog. Plus précisément, je veux trouver le moins significatif de 1 dans le vecteur et le retour d'un vecteur contenant que des 1. Par exemple:

IN[3:0] | OUT[4:0]
--------+---------
1010    | 00010
1111    | 00001
0100    | 00100
0000    | 10000   (special case)

Donc, si les vecteurs sont de quatre bits, le code est:

if (in[0]==1'b1) least_one = 1;
else if (in[1]==1'b1) least_one = 2;
else if (in[2]==1'b1) least_one = 4;
else if (in[3]==1'b1) least_one = 8;
else out = 16; //special case in==0, set carry bit

J'ai besoin d'un général, de manière évolutive pour ce faire, car l'entrée/sortie longueur du vecteur est paramétrisée. Mon code actuel est:

module least_one_onehot
#(parameter ADDR_WIDTH=4)
(output reg [ADDR_WIDTH:0] least_one,
input [ADDR_WIDTH-1:0] in);

genvar i;

always @(in) begin
    if (in[0]==1'b1) least_one = 1;
    generate for (i=1; i<ADDR_WIDTH; i=i+1) begin : U 
        else if (in[i]==1'b1) least_one = 2**i; 
        end 
        endgenerate
    else least_one = 2**ADDR_WIDTH;
    end

endmodule

Lorsque j'essaie de compiler cela, je reçois l'erreur suivante:

file: least_one_onehot.v
        generate for (i=1; i<ADDR_WIDTH; i=i+1) begin : U
               |
ncvlog: *E,GIWSCP (least_one_onehot.v,10|8): Generated instantiation can only be valid within a module scope [12.1.3(IEEE 2001)].
                        else if (in[i]==1'b1) least_one = 2**i; 
                           |
ncvlog: *E,NOTSTT (least_one_onehot.v,11|6): expecting a statement [9(IEEE)].
                endgenerate
                          |
ncvlog: *E,GIWSCP (least_one_onehot.v,13|12): Generated instantiation can only be valid within a module scope [12.1.3(IEEE 2001)].
                else least_one = 2**ADDR_WIDTH;
                   |
ncvlog: *E,NOTSTT (least_one_onehot.v,14|5): expecting a statement [9(IEEE)]

J'ai essayé les diverses dispositions de la générer, si, et toujours déclarations, le tout sans succès. Quelqu'un connais la syntaxe correcte pour cela? Cas de déclaration de mise en œuvre ou d'autres solutions de rechange serait aussi bien. Merci.

Si votre largeur de sortie correspondent à votre largeur d'entrée? Qu'est-ce que out?
Il y a une différence entre la procédure de contextes et de module de contextes. Voir this réponse.
Devrait être un peu plus large que d'en accueillir de zéro pour tous les cas. J'ai précisé le post original.

OriginalL'auteur DrDean | 2013-02-25