J'utilise SystemVerilog pour la synthèse. Je me suis battu avec le fait que les tableaux d'interfaces ne sont pas vraiment des tableaux dans SystemVerilog et l'index doit être une valeur constante, mais il a surmonté les instructions generate for
et assign
pour surmonter ce qui est vraiment une limitation de la langue (si je peux émuler l'effet en utilisant plus de code, la langue pourrait juste faire la bonne chose (tm) elle-même).Tableaux d'instances d'interface dans SystemVerilog avec nombre d'éléments paramétrés
Pour le pseudo-code suivant, j'omets une grande partie de ce qu'il y a dans le code réel (modports, tâches, etc) pour plus de clarté. J'ai une interface:
interface i_triplex();
logic a; // input wire
logic b; // output wire
logic [127:0] data; // output wires
endinterface
Et je passe un tableau de ces interfaces à un module qui ressemble à
module roundrobin_triplex#(
parameter int NUNITS = 8
)
(
input wire clk,
input wire rst,
i_triplex t[NUNITS]
);
always_ff @(posedge clk) begin
if (rst) begin
// insert code to initialize the "data" member
// in all interface instances in the array.
end
else begin
// ...
end
end
endmodule
Quelle serait votre manière préférée d'utiliser toutes les instances d'interface dans le tableau uniforme - - indépendamment de la valeur de NUNITS
? J'ai quelques suggestions, mais j'ai hâte d'apprendre ce que d'autres ingénieurs peuvent imaginer.
Suggestion 1: Utilisez VHDL.
Proposition 2: Scrap l'interface et faire oldschool Verilog style, comme dans
module roundrobin_triplex#(
parameter int NUNITS = 8
)
(
input wire clk,
input wire rst,
// This was once a proud i_triplex array
input wire i_triplex_a[NUNITS],
input wire i_triplex_b[NUNITS],
input wire [127:0] i_triplex_data[NUNITS],
);
always_ff @(posedge clk) begin
if (rst) begin
for (int i = 0; i < NUNITS; i++)
i_triplex_data[i] <= '1;
end
else begin
// ...
end
end
endmodule
Suggestion 3: Utiliser un struct
pour les fils d'entrée et une struct
pour les fils de sortie au lieu de L'interface.
Suggestion 4: Utilisez un système comme préprocesseur qui se déroule generate for
boucles à l'intérieur des processus (ce que la langue doit faire de toute façon!), De sorte que le code résultant ressemble (prétraité avec Nunits = 4):
module roundrobin_triplex#(
parameter int NUNITS = 8
)
(
input wire clk,
input wire rst,
i_triplex t[NUNITS]
);
always_ff @(posedge clk) begin
if (rst) begin
i_triplex.data[0] <= '1;
i_triplex.data[1] <= '1;
i_triplex.data[2] <= '1;
i_triplex.data[3] <= '1;
end
else begin
// ...
end
end
endmodule
Suggestion 5: Utiliser la solution generate for
/assign
:
module roundrobin_triplex#(
parameter int NUNITS = 8
)
(
input wire clk,
input wire rst,
i_triplex t[NUNITS]
);
wire i_triplex_a[NUNITS];
wire i_triplex_b[NUNITS];
wire [127:0] i_triplex_data[NUNITS];
generate
genvar i;
// The wires of the interface which are to be driven
// from this module are assigned here.
for (i = 0; i < NUNITS; i++) begin
assign t[i].b = i_triplex_b[i];
assign t[i].data = i_triplex_data[i];
end
endgenerate
always_ff @(posedge clk) begin
if (rst) begin
for (int i = 0; i < NUNITS; i++)
i_triplex_data[i] <= '1;
end
else begin
// ...
end
end
endmodule
Peut-être que la langue devrait être étendue pour vérifier si toutes les instances d'interface dans un tableau sont "assez similaires" (ou permettent à l'utilisateur d'utiliser un mot-clé pour l'indiquer) et permettent d'utiliser de tels tableaux d'instances d'interface comme des tableaux réguliers. Cela résoudrait * beaucoup * de problèmes lors de l'utilisation d'interfaces pour la synthèse. – apriori
J'ai littéralement des centaines de modules utilisant cette interface, dont la plupart l'utilisent comme un port d'interface normal, mais beaucoup utilisent des choses comme 'i_triplex t [NUNITS + 2]' pour mux'ing avec d'autres instances d'interface. J'espère pouvoir passer sans trop réécrire le code, donc je vais vérifier si une combinaison de votre modification de la suggestion 2 et du code de la colle 'générer pour' 'for for-assign' fonctionnera donc je peux laisser la plupart des autres modules comme ils sont utilisez quelque chose comme une interface 'i_triplex_array' pour les occurrences où cela est bénéfique. – apriori
Oui, je suis d'accord, nous aurions besoin d'une nouvelle syntaxe. Essayer de trouver des règles basées sur l'usage rend encore plus compliqué un langage déjà trop compliqué. –