如何修复错误“无法分配给非变量...”?

问题描述

我正在为 CNN 中的卷积层编写 verilog 代码,但出现以下错误:

1)ERROR:HDLCompiler:257 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 52 行:不能分配给非变量 max_irow

2)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 52 行:对非寄存器 max_irow 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

3)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 52 行:对非寄存器 max_irow 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

4)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 52 行:对非寄存器 max_irow 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

5)ERROR:HDLCompiler:257 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 54 行:不能分配给非变量 max_icol

6)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 54 行:对非寄存器 max_icol 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

7)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 54 行:对非寄存器 max_icol 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

8)ERROR:HDLCompiler:257 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 56 行:不能分配给非变量 max_krow

9)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 56 行:对非寄存器 max_krow 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

10)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 56 行:对非寄存器 max_krow 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

11)ERROR:HDLCompiler:257 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 58 行:不能分配给非变量 max_kcol

12)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 58 行:对非寄存器 max_kcol 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

13)ERROR:HDLCompiler:1660 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 58 行:对非寄存器 max_kcol 的程序分配不是 允许,左侧应该是 reg/integer/time/genvar

14)ERROR:HDLCompiler:255 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 60 行:不能直接分配给内存总和

15)ERROR:HDLCompiler:747 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 60 行:前缀中不允许使用范围

16)ERROR:HDLCompiler:698 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 60 行:不允许部分选择内存映像

17)ERROR:HDLCompiler:971 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 60 行:运算符 *

的非法操作数

18)ERROR:HDLCompiler:1373 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 60 行:未打包的值/目标不能用于赋值

19)ERROR:HDLCompiler:598 - "D:\DSD_CEP_verilog\convolution_normal.v" 第 21 行:模块 由于之前的错误而被忽略。

我的verilog代码是:

module convolution_normal(sum,clk,image,kernel,bias);
/*suppose we have input image of size 15*16*3,and a kernel of size 3*3*3*/

parameter reg max_irow = 15;  //number of input rows
parameter reg max_icol = 16;  //number of input columns
parameter reg max_idepth = 3; //depth of input
parameter reg max_krow = 3;   //number of kernel rows
parameter reg max_kcol = 3;   //number of kernel columns
parameter reg max_kdepth = 3; //depth of kernel
parameter reg max_orow = 15;  //number of output rows
parameter reg max_ocol = 16;  //number of output columns
parameter reg max_odepth = 3; //depth of output

input clk;
input bias = 0;
input image[max_irow:0][max_icol:0][max_idepth:0];
input kernel[max_krow:0][max_kcol:0][max_kdepth:0];
output reg sum[max_orow:0][max_ocol:0][max_odepth:0];

always@(posedge clk)
begin
//NOTE: ++ does not exist in verilog
 for (max_irow = 0; max_irow <= max_irow; max_irow = max_irow+1)
 begin
  for (max_icol = 0; max_icol <= max_icol; max_icol = max_icol+1)
  begin
   for(max_krow = 0; max_krow <= max_krow; max_krow = max_krow+1)
    begin
     for(max_kcol = 0; max_kcol <= max_kcol; max_kcol = max_kcol+1)
     begin
      sum = image[max_irow:0][max_icol:0][max_idepth:0]*kernel[max_krow:0][max_kcol:0][max_kdepth:0];    
     end
    end
  end
 end
end
endmodule

有人能解决这个问题吗?

解决方法

你的循环不正确: 例如:

 for (max_irow = 0; max_irow <= max_irow; max_irow = max_irow+1)

max irow 是一个参数而不是一个变量。不能递增或赋值。

所有其他循环都存在同样的问题。

你应该这样修改它们:

integer iter;
for (iter = 0; iter <= max_irow; iter = iter+1)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...