错误(10734):m.v处的Verilog HDL错误(156):cnt不是常数

时间:2019-02-07 07:16:26

标签: verilog

我需要根据计数器将输入引脚的4个字节写入寄存器的不同部分,使用代码我现在遇到此错误:
    错误(10734):m.v(156)的Verilog HDL错误:cnt不是常量
    我应该如何处理?

wire wren, rst;     
wire [3:0] abcd;    
reg [31:0] my_reg;    
reg [3:0] cnt;   


always @(posedge wren or posedge rst)   
begin   
   if (rst == 1) 
   begin 
      my_reg <= 0; 
   end    
   else 
   begin   
      if (wren == 1) 
      begin    
         my_reg [4*cnt+3:4*cnt] <= abcd;   
      end   
   end          
end  

1 个答案:

答案 0 :(得分:2)

关于您的错误:您应该使用+:语法[4 * cnt +:4] 有关更多信息,请参见here

即使如果在语义上允许您输入的值也将是错误的:

  • [4*cnt-1:4*cnt]会给出从低到高的索引,例如如果cnt = 1则得到[3:4]

  • 如果cnt == 0 [-1:0]超出[4*cnt-1:4*cnt]的[31:0]范围,则​​
  • reg给出负索引。

您可能打算使用[4*cnt+3:4*cnt]

但是您还有其他错误。

首先,对变量使用关键字非常危险。 (reg)

第二,您正在使用非时钟信号wren进行时钟控制。这将创建另一个时钟树。正常过程是将if与标准系统时钟一起使用:

always @(posedge clk or posedge rst)   
begin   
   if (rst == 1) 
   begin 
      my_reg <= 0; 
   end    
   else 
   begin   
      if (wren == 1) 
      begin    
         my_reg [4*cnt +: 4] <= abcd;   
      end   
   end          
end