2016-07-04 2 views
0

Я новичок в Verilog, я бы очень признателен, если кто-то может помочь мне понять эту ошибку из:Verilog ошибка: Не удается связать параметр в модуле

Я пытаюсь написать испытательный стенд PU_tb, который инстанцирование этого модуля:

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  
); 

модуля PU_conv выглядит следующим образом:

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 
); 

Я получаю эту ошибку:

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'

Ядро и изображения ширины и высоты объявляются следующим образом:

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; 

Что я делаю неправильно?

ответ

1

Следующий код работает нормально. Убедитесь, что вы правильно указали параметры в модуле top/tb.

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 

многомерные массивы в качестве входов поддерживаются только SystemVerilog. Ниже вывод на дисплее:

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

Похожий вопрос размещен в Verilog Parameter over ridding.

+0

Спасибо, я не знал, что многомерные массивы не поддерживаются в качестве входов! Я объявил переменные, как показано в коде. Что-то не так с этим? Он по-прежнему говорит о невозможности привязки параметра. – AnnaR

+0

Вы должны иметь 'kernel_width, kernel_height, image_width, image_height' как параметры, а не переменные. Поскольку параметры оцениваются в ** время разработки **, вам либо необходимо иметь параметры, либо макро-значения. – sharvil111

+0

Если я объявляю их как параметры, я получаю ошибку _Syntax error parameter list_ – AnnaR

Смежные вопросы