Comportement Verilog décalage étrange arithmétique

J

jmarcelold

Guest
Moyens quelqu'un peut m'expliquer pourquoi dans le code ci-dessous, x0_eq n'est pas égal à x1_eq? `Test délai module de 10ns/1ns; reg signé [08:00] x0, x1, x0_shifted, x0_eq, x1_eq; initiale commencer x0 = -27; x0_shifted = x0 >>> 3; x0_eq = x0_shifted + x0 [2]; x1 = -27; x1_eq = (x1 >>> 3) + x1 [2]; # 10; $ fini; fin endmodule
 
Effectivement, dans le premier cas trois fois décalage à droite de -27 est calculé, qui est -4 (9'b000111100) et est stocké dans le registre de type signé, de sorte qu'il est stocké en tant -4. Ensuite, il est ajouté avec x0 [2] (qui est 1) et devient -3. Mais en second cas, après le calcul de trois quarts à droite de -27, le résultat n'est pas stocké en format signé, mais il est utilisé dans une autre opération directement de sorte qu'il est utilisé comme décimal non signé (-4 en décimal non signé est de 60), après l'ajout de x1 [2], il devient 61. Toutes les choses sont claires, sauf pourquoi 61 n'est pas stockée dans le format signé en x1_eq. Cheers, Akhil Kumar
 
Akhil, je crois que j'ai compris ce qui est arriver. L'opération a, b >>> non seulement un décalage arithmétique, mais il a également re-taille de la variable (je ne savais pas que). C'est la raison pour laquelle -27 >> 3 est traitée comme 6'b111100 lieu de 9'b111111100, qui est ce que je m'attendais. Ensuite, parce que x1 [2] n'est pas signé, le "+" opération n'est pas signé, et le résultat est étendu pour faire correspondre les 9 bits comme une valeur non signée. Ce qui concerne José Marcelo L. Duarte
 

Welcome to EDABoard.com

Sponsor

Back
Top