2016-06-24 6 views
0

Ich möchte sequenziellen Zähler Block in einem anderen Modul instanziieren. Dies sind die folgenden Module. Wenn ich diese Module in Synopsys-Design-Vision-Umgebung synthetisiere, gibt es die folgende Fehlermeldung,Methode der Instanziierung sequentiellen Block in Verilog

prob_calculator.sv:1: Illegaler Verweis auf Speicherproblem. (VER-253)

module counter #(parameter m=16) (input en,input clk,input reset,output reg [m-1:0] out); 

always @(posedge clk) 
if(reset) begin 
    out <= 0; 
end 
else if (en) begin 
    out <= out+1; 
end 
endmodule 

Instanziierung des Zählerblock:

module prob_calculator #(parameter n=32,parameter m=6,parameter Ir=14) (input 
[n-1:0]b,input clk,input reset,output reg [m-1:0] prob [0:Ir-1]); 

genvar i; 
generate 
for (i=0;i<Ir;i=i+1) begin:x1 
counter #(.m(m)) count_blck(.en(1),.clk(clk),.reset(reset),.out(prob[i])); 
end 
endgenerate 
endmodule 

Kann jemand bitte darauf hinweisen, was ist falsch mit dem Code?

Antwort

1

Verilog unterstützt keine mehrdimensionalen Arrays über Ports. SystemVerilog unterstützt mehrdimensionale Array-Ports. Allerdings unterstützen nicht alle SystemVerilog-Synthesizer diese Funktion.

Vor der Adressierung der mehrdimensionalen Portbeschränkung möchte ich darauf hinweisen, dass probe als wire, nicht als reg deklariert werden sollte. In Verilog sollte eine Variable als reg deklariert werden, wenn sie von einem prozeduralen Block (d. H. always oder initial) im aktuellen Modul zugewiesen wird (nicht dessen Untermodul oder Elternmodul), andernfalls sollte sie als wire deklariert werden. Mit SystemVerilog können Sie auch logic verwenden und den Typ logic großzügiger verwenden; Alle Orte, an denen Sie reg verwenden und die meisten Orte, an denen Sie wire verwenden (schließen Sie wires aus, die mehrere Laufwerke haben).

Wenn Sie probe von reg zu wire ändern, kann es Ihren Synthesizer glücklich machen, aber es wird wahrscheinlich nicht.

Eine Möglichkeit besteht darin, prob zu einem einzigen Vektor zu reduzieren: Ändern Sie output reg [m-1:0] prob [0:Ir-1] in output wire [Ir*m-1:0] prob. Dann ändern Sie die Verbindungen zwischen out und Sonde in eine Scheibe von neuen Prob Vektor: .out(prob[i]) bis .out(prob[i*m +: m]) (Siehe Indexing vectors and arrays with +:). Dieser Ansatz funktioniert mit SystemVerilog und Verilog (IEEE1364-2001 und höher).

module prob_calculator #(parameter n=32,parameter m=6,parameter Ir=14) (input 
[n-1:0]b,input clk,input reset,output wire [Ir*m-1:0] prob); 

    genvar i; 
    generate 
    for (i=0;i<Ir;i=i+1) begin:x1 
     counter #(.m(m)) count_blck(.en(1),.clk(clk),.reset(reset),.out(prob[i*m +: m])); 
    end 
    endgenerate 
endmodule

SystemVerilog bietet andere Möglichkeiten, wie mit (typedef, verpackt struct, interface, modport), die um als Arbeits arbeiten kann, wenn mehrdimensionale Port wird nicht direkt unterstützt. Es empfiehlt sich, auf das Handbuch Ihres Synthesizers zu verweisen, sicherzustellen, dass die Option SystemVerilog aktiviert ist, und zu prüfen, welche Funktionen unterstützt werden.


FYI: Mit SystemVerilog seine wieder aufgenommen [email protected](posedge clk) statt [email protected](posedge clk)

+0

Vielen Dank für Ihre Antwort zu verwenden. Das Reduzieren der 'prob'-Variablen funktioniert. Ich werde in andere Möglichkeiten schauen, die Sie erwähnt haben. – Snigdha203