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?
3 Réponses :
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 ...
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.
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.
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.