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.