2016-07-04 12 views
0

Ich bin neu in Verilog, würde ich es wirklich schätzen, wenn mir jemand Figur diese Fehler helfen könnte:Verilog Fehler: Können Parameter im Modul binden

Ich versuche, einen Prüfstand zu schreiben PU_tb, die dieses Modul instanziieren:

PU_conv #(
.image_width   (image_width  ), 
.image_height  (image_height  ), 
.kernel_width  (kernel_width  ), 
.kernel_height  (kernel_height  ) 
) convolution (
.ACLK    (ACLK    ), //input  
.image    (image    ), //input 
.kernel    (kernel    ), //input 
.result    (result    ) //output  
); 

Das Modul PU_conv wie folgt aussieht:

module PU_conv 
#(//Parameters 
parameter integer image_width = 10, 
parameter integer image_height = 4, 
parameter integer kernel_width = 2, 
parameter integer kernel_height = 2 
)(//PORTS 
input wire         ACLK, 
input wire [0:image_width][image_height:0] image, 
input wire [0:kernel_width][kernel_height:0] kernel, 
output reg [0:image_width][image_height:0] result 
); 

ich diesen Fehler:

error: Unable to bind parameter 'image_height' in 'PU_tb'
error: Unable to bind parameter 'image_width' in 'PU_tb'
error: Unable to bind parameter 'kernel_height' in 'PU_tb'
error: Unable to bind parameter 'kernel_width' in 'PU_tb'

Die Kernel und Bildbreiten und -höhen erklärt sich wie folgt:

reg[5:0] param_kw; 
reg[5:0] param_kh; 
reg[5:0] param_iw; 
reg[5:0] param_ih; .... 

integer kernel_width, kernel_height, image_width, image_height; 
always @(param_kw) 
    kernel_width = param_kw; 
always @(param_kh) 
    kernel_height = param_kh; 
always @(param_iw) 
    image_width = param_iw; 
always @(param_ih) 
    image_height = param_ih; 

Was mache ich falsch?

Antwort

1

Der folgende Code funktioniert einwandfrei. Stellen Sie sicher, dass Sie die Parameter im top/tb-Modul korrekt deklariert haben.

module PU_conv 
#(//Parameters 
parameter integer image_width = 10, 
parameter integer image_height = 4, 
parameter integer kernel_width = 2, 
parameter integer kernel_height = 2 
) (//PORTS 
input wire         ACLK, 
input wire [0:image_width][image_height:0] image, 
input wire [0:kernel_width][kernel_height:0] kernel, 
output reg [0:image_width][image_height:0] result 
); 

initial 
begin 
$display("image_width = %0d image_height = %0d",image_width,image_height); 
$display("kernel_width = %0d kernel_height = %0d",kernel_width,kernel_height); 
end 
endmodule 

module top(); 

parameter integer image_width = 8; 
parameter integer image_height = 7; 
parameter integer kernel_width = 6; 
parameter integer kernel_height = 5; 

wire         ACLK; 
wire [0:image_width][image_height:0] image; 
wire [0:kernel_width][kernel_height:0] kernel; 
reg [0:image_width][image_height:0] result; 

PU_conv #(
.image_width   (image_width  ), 
.image_height  (image_height  ), 
.kernel_width  (kernel_width  ), 
.kernel_height  (kernel_height  ) 
) convolution (
.ACLK    (ACLK    ), //input  
.image    (image    ), //input 
.kernel    (kernel    ), //input 
.result    (result    ) //output  
); 
endmodule 

Mehrdimensionale Arrays als Eingänge werden in SystemVerilog nur unterstützt. Im Anschluss wird die Ausgangsanzeige:

// Overridden parameters 
image_width = 8 image_height = 7 
kernel_width = 6 kernel_height = 5 

ähnliche Frage wird in Verilog Parameter over ridding geschrieben.

+0

Danke, ich wusste nicht, dass multidimensionale Arrays nicht als Eingaben unterstützt werden! Ich habe die Variablen wie im Code gezeigt deklariert. Ist da etwas nicht in Ordnung? Es sagt immer noch nicht, Parameter zu binden. – AnnaR

+0

Sie müssen 'kernel_width, kernel_height, image_width, image_height' als Parameter und nicht als Variablen haben. Da Parameter zu ** Bearbeitungszeit ** ausgewertet werden, müssen Sie entweder Parameter oder Makrowerte haben. – sharvil111

+0

Wenn ich sie als Parameter deklariere, bekomme ich den Fehler _Syntax error parameter list_ – AnnaR