2017-09-08 1 views
0

J'utilise la fonction suivante dans mon code System Verilog. Je me demandais s'il y avait une façon idiomatique d'obtenir le même effet qui n'exigerait peut-être pas que la largeur soit câblée. J'ai essayé les opérateurs de streaming, mais je n'ai pas réussi à les faire fonctionner. J'ai besoin d'utiliser des tableaux non emballés. Merci beaucoup.Concaténation d'éléments d'une baie non compressée ensemble

function bit [64:0] cat8 (bit [7:0] a[8]); 
    return { a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0] }; 
endfunction; 

Répondre

1

puisque vous inverser le tableau dans concat, il n'y a pas de bonne façon de l'exprimer. vous avez:

bit [7:0] a[8]; 

qui équivaut à

bit [7:0] a[0:7]; 

dans votre concat vous commencez avec a[7] dans les bits les plus significatifs si 7 est le moins important indice dans le tableau.

C'est la raison pour laquelle les opérateurs de streaming ne fonctionnaient pas dans votre cas.

Donc, si vous avez vraiment besoin d'inverser le tableau, que vous avez ce que vous avez, sinon vous pouvez trouver que ces 2 choses sont équivalentes:

{ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7] } 

et

{ >> {a}} 

bien sûr vous pouvez déclarer votre tableau comme bit [7:0] a[7:0] et conserver l'ordre de l'index en concat comme vous avez. Mais il va pas inverser le tableau à nouveau, comme dans le cas ci-dessus.

0

Vous pouvez définir un nouveau type de données via typedef.

typedef bit[7:0] octet; 
typedef octet upack[7:0]; 

function bit [64:0] cat8 (upack a); 
    // your code 
endfunction; 
0

ci-dessous devrait travailler pour vous

module top; 
    function bit [63:0] cat8 (bit [7:0] a[8]); 
    return { <<8{a}}; 
    endfunction; 
    bit [7:0] arr[8]; 

    initial begin 
    arr= '{1,2,3,4,5,6,7,8}; 
    foreach (arr[i])$display("%h", arr[i]); 
     $display("%h", cat8(arr)); 
    end 
endmodule