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



我需要根据计数器从输入引脚将 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  

至于你的错误:你应该使用+:语法 [4*cnt +: 4]有关更多信息,请参阅此处。

即使这在语义上是允许的,你的值也是错误的:

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

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

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

但是你也有其他错误。

首先,对变量使用关键字是非常危险的。(注册(

其次,您使用非时钟信号进行计时: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  

最新更新