2017-09-13 1 views
0

Essayant d'implémenter une méthode sum du tableau. Stocké la valeur de retour de la méthode sur l'entier à l'intérieur d'une fonction. Pourquoi est-ce que j'obtiens la sortie comme 48 au lieu de 560?Array.sum() Gotcha

program test; 

class check2; 
logic [7:0] a [3:0] = '{10,20,30,500}; 

function void dis(); 
    int unsigned ch; 
    ch = a.sum()+16'd0; 
    $display(ch); 
endfunction 
endclass 

check2 c; 

initial begin 
c = new; 
c.dis; 
end 
endprogram 

Répondre

2

Le résultat de la méthode a.sum() est la même largeur de chaque type d'élément de la matrice. Vous pouvez convertir chaque élément en une taille plus importante à l'aide de la clause with.

ch = a.sum(item) with (int'(item)); 
+0

Pourquoi $ display (a.sum() + 16'd0) ne fonctionne-t-il pas dans ce cas? – Rottenengg

+0

Parce que sum() est un appel de fonction et que le calcul de la valeur de retour est dans un contexte indépendant d'où l'expression de résultat est utilisée. Vous pensez comme si l'équation de la somme était alignée avec le '+ 16'd0' –

+0

Hey @dave De la méthode mentionnée ci-dessus, je reçois la somme comme 304 au lieu de 560. Lien: - http: //www.edaplayground. com/x/32BU – Rottenengg

1

La largeur de bit de la matrice est pas assez grand pour recevoir la valeur 500. 500 (décimal) est égale à 0x1F4 (hex), ce qui nécessite 9 bits. Mais, vous spécifiez seulement 8 bits ([7: 0]). Cela signifie que 500 est converti en 0xF4, ou 244 (décimal). En outre, la largeur de bit de matrice n'est pas assez grande pour prendre en compte la somme des valeurs de matrice (560). 560 nécessite 10 bits. Donc, vous obtenez 48 parce que la somme de 10,20,30,244 est 304, ce qui est 0x130 hex, ce qui est trop grand pour la somme de 8 bits. Donc, 0x130 devient 0x30, ce qui est 48 (décimal).

Utilisation logic [9:0] a [3:0] vous donnera une sortie 560.

program test; 

class check2; 
    logic [9:0] a [3:0] = '{10,20,30,500}; 

    function void dis(); 
     int unsigned ch; 
     ch = a.sum()+16'd0; 
     $display(ch); 
    endfunction 
endclass 

check2 c; 

initial begin 
    c = new; 
    c.dis(); 
end 
endprogram 
+0

Merci. Je connais cette solution. Je voulais apprendre à lancer chaque élément d'un tableau! – Rottenengg

+0

@Rottenengg, votre question était pourquoi obtenez-vous 48, et j'ai répondu à cela. – toolic

+0

Désolé pour le malentendu. J'aurais dû cadrer ma question correctement. – Rottenengg