Verilog错误:常量表达式中不允许引用wire或reg

时间:2016-07-04 05:07:46

标签: verilog iverilog

我是Verilog的新手,如果有人可以帮我解决这个错误,我会非常感激:

output  reg [0:image_width][image_height:0]    result
....
integer i, j, imageX, imageY, x, y, kernelX, kernelY;
....

@(negedge ACLK)
for(x = 0; x < image_width; x++) begin 
    for(y = 0; y < image_height; y++)
    begin
    //multiply every value of the filter with corresponding image pixel
        for(kernelX = 0; kernelX < kernel_width; kernelX++) begin            
            for(kernelY = 0; kernelY < kernel_height; kernelY++)
                begin           
                    imageX = (x - kernel_width / 2 + kernelX + image_width) % image_width;
                    imageY = (y - kernel_height / 2 + kernelY + image_height) % image_height;

                    // ignore input samples which are out of bound
                    if( imageY >= 0 && imageY < image_height && imageX >= 0 && imageX < image_width )
                        //ERROR HERE!!!
                        result[x][y] += image[imageX][imageY] * kernel[kernelX][kernelY];   
                    end
                end
        end
    end
end

我得到的错误是:

  

错误:常量表达式中不允许引用wire或reg('x')。
   错误:数组索引表达式必须在此处保持不变。
  错误:常量表达式中不允许引用wire或reg('imageX')   错误:数组索引表达式必须在此处保持不变   错误:常量表达式中不允许引用wire或reg('kernelX')   错误:数组索引表达式必须在这里保持不变。

有人可以告诉我我做错了什么吗?谢谢!

2 个答案:

答案 0 :(得分:1)

这一行是问题所在:

result[x][y] += image[imageX][imageY] * kernel[kernelX][kernelY];

仅对常量表达式允许索引到数组中。不允许在向量索引中使用变量。请记住,您正在使用HDL:您在硬件中指示物理连接。在索引中有一个变量意味着能够动态重新连接电路。 This SO question有一些粗略的解决方法可能对您有用。但是,您应该尝试重构算法,以避免首先使用变量索引。

顺便说一下,您应该使用non-blocking assignments而不是目前的阻止作业。您的代码位于时钟模块中,因此应避免阻塞组合逻辑:

imageX <= (x - kernel_width / 2 + kernelX + image_width) % image_width;
imageY <= (y - kernel_height / 2 + kernelY + image_height) % image_height;

// ignore input samples which are out of bound
if( imageY >= 0 && imageY < image_height && imageX >= 0 && imageX < image_width )
    result[x][y] <= result[x][y] + image[imageX][imageY] * kernel[kernelX][kernelY];   

答案 1 :(得分:0)

@(negedge ACLK);
               ^

我很确定分号不属于那里。如上所述,for循环都在always块之外。

此外,您的image数组目前每个像素只有一位。这是故意的吗?无论是否,我建议您重新考虑这种架构;在单个时钟周期内过滤任何大尺寸的图像并不能很好地合成。