【问题标题】:Verilog error : Unable to bind parameter in moduleVerilog 错误:无法在模块中绑定参数
【发布时间】:2016-07-04 06:48:34
【问题描述】:

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

我收到此错误:

错误:无法在“PU_tb”中绑定参数“image_height”
错误:无法在“PU_tb”中绑定参数“image_width”
错误:无法在“PU_tb”中绑定参数“kernel_height”
错误:无法在“PU_tb”中绑定参数“kernel_width”

内核和图像的宽高声明如下:

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;

我做错了什么?

【问题讨论】:

    标签: verilog iverilog


    【解决方案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

    【讨论】:

    • 谢谢,我不知道不支持多维数组作为输入!我已经声明了代码中显示的变量。这有什么问题吗?它仍然说无法绑定参数。
    • 您需要将kernel_width, kernel_height, image_width, image_height 作为参数而不是变量。由于参数是在细化时间评估的,因此您需要有参数或宏值。
    • 如果我将它们声明为参数,我会收到错误 语法错误参数列表
    • 指出确切的错误在哪里。确保参数声明后有分号 (;) 而不是逗号 (,)。复制粘贴我的答案中给出的代码并相应地更改您的值。该代码对我来说很好。
    猜你喜欢
    • 2016-01-12
    • 2019-10-06
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多