1
votes

Diviser un verilog genvar

Je construis donc un arbre dans Verilog. L'arbre assignera l'élément j du niveau i au plus petit de [j, j + 1] du niveau i + 1.

Le problème ici est que je ne suis pas sûr de savoir comment Verilog traite l'opérateur de division pour genvar: p >

genvar i,j;
generate
  for(i = LEVELS; i > 0; i--) begin
    for(j = 0; j < 2**i; j = j + 2) begin // 0..7 for level 3, 0..3 for level 2, 0..1 for level 1 and 0 for level 0
      assign tree[i-1][j/2] = tree[i][j] <operator> tree[i][j+1];
    end
  end
endgenerate

Le problème ici est que je ne suis pas sûr que le j / 2 ci-dessus sera mis au sol de sorte que 1/2 == 0. Tout le monde sait si c'est vrai?


0 commentaires

3 Réponses :


3
votes

Cette simulation démontre que, si j est impair, alors j / 2 sera bloqué:

tree[0] = 1
tree[1] = 3
tree[2] = 5
tree[3] = 7

Résultat: p>

module tb;

wire [7:0] tree [4];

genvar j;
generate
    for (j=1; j<8; j=j+2) begin
        assign tree[j/2] = j;
    end
endgenerate

initial begin
    #1;
    for (int k=0; k<4; k++) $display("tree[%0d] = %0d", k, tree[k]);
end

endmodule

Dans ce code, j n'a que des valeurs impaires: 1, 3, 5, 7.

Donc j / 2 résout les valeurs paires: 0, 1, 2, 3.


En passant: dans votre code, vous ne pouvez pas avoir 1/2. j ne peut être que 0,2,4,6 ... Donc, j / 2 ne peut être que 0,1,2,3 ...


0 commentaires

3
votes

la division entière est toujours au sol:

IEEE 1800-2017: 11.4.2: La division entière doit tronquer toute partie fractionnaire vers zéro.


0 commentaires

1
votes

Si vous n'avez besoin que de j / 2, pourquoi ne pas simplement le remplacer par (j >> 1)? Il y a moins de chance de les outils l’interprètent mal. LRM n'est pas gravé dans la pierre, j'ai vu de nombreux outils de CAO l'emmener dans des endroits assez irrationnels.


1 commentaires

En fait, je ne savais pas que vous pouviez modifier les genvars. Puisque je ne suis pas sûr de quel type ils finissent par être.