2017-03-03 3 views
1

Ich versuche, ein synthetisierbares Verilog-Modul zu implementieren, das ein Vektorprodukt von 2 Vektoren/Arrays erzeugt, die jeweils acht 16-Bit-Ganzzahlen ohne Vorzeichen enthalten. Design Compiler hat den Fehler symbol i must be a constant or parameter gemeldet. Ich weiß nicht, wie ich es beheben soll. Hier ist mein Code.Verilog Vektor inneres Produkt

module VecMul16bit (a, b, c, clk, rst); 
// Two vector inner product, each has 8 elements 
// Each element is 16 bits 
// So the Output should be at least 2^32*2^3 = 2^35 in order to 
// prevent overflow 
// Output is 35 bits 
input clk; 
input rst; 
input [127:0] a,b; 
output [35:0] c; 
reg [15:0] a_cp [0:7]; 
reg [15:0] b_cp [0:7]; 
reg [35:0] c_reg; 
reg k,c_done; 

integer i; 
always @ (a) 
begin 
    for (i=0; i<=7; i=i+1) begin 
     a_cp[i] = a[i*15:i*15+15]; 
    end 
end 

always @ (b) 
begin 
    for (i=0; i<=7; i=i+1) begin 
     b_cp[i] = b[i*15:i*15+15]; 
    end 

end 

assign c = c_reg; 

always @(posedge clk or posedge rst) 
begin 
    if (rst) begin 
     c_reg <= 0; 
     k <= 0; 
     c_done <= 0; 
    end else begin 
     c_reg <= c_done ? c_reg : (c_reg + a_cp[k]*b_cp[k]); 
     k   <= c_done ?   k : k + 1; 
     c_done  <= c_done ?   1 : (k == 7); 
    end 
end 

endmodule 

Wie Sie sehen können, ich versuche a-a_cp durch eine Schleife zu kopieren, dann ist dies der richtige Weg, es zu tun?

Wenn ja, wie soll ich es definiert haben i und kann eine Konstante als Stepper in for-Schleife verwendet werden?

Antwort

1

Ein Teil wählen in Verilog muss konstante Grenzen haben. So ist dies nicht erlaubt:

a_cp[i] = a[i*15:i*15+15]; 

Verilog-2001 eingeführt ein neuer indizierte Teil Syntax auswählen, in dem die Startposition und die Breite der ausgewählten Gruppe von Bits angeben. So müssen Sie die obige Zeile ersetzen durch:

a_cp[i] = a[i*15+:16]; 

Dies nimmt ein 16-Bit-Breite Stück a bei Bit beginnend i*15 Zählen nach rechts. Sie können -: anstelle von +: verwenden, in diesem Fall zählen Sie nach links.

Seien Sie vorsichtig: es ist sehr einfach zu schreiben :+ anstelle von +: und :+ ist gültige Syntax und so möglicherweise nicht von Ihrem Compiler entdeckt werden (aber könnte immer noch ein Fehler sein). Tatsächlich habe ich genau das getan, als ich diese EDA Playground example eingegeben habe, obwohl mein Tippfehler in diesem Fall vom Compiler abgefangen wurde.

+1

Der Index sollte wahrscheinlich um 'i * 16 'verschoben werden, da sonst Überschneidungen zwischen den Slices auftreten. Ich empfehle, vor und nach dem '+:' Leerzeichen einzufügen, um es hervorzuheben: 'a [i * 15 +: 16];' – Greg