对于带有条件语句的always块内部的循环给出意外错误[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我试过在一个常常块中查看与for循环相关的不同帖子,但我的问题看起来不同。这是我感兴趣的代码的一部分:

   always@(posedge clk) begin
     for(i=2;i<UP_SPACES+2;i=i+1) begin  //Ram_out
        if(up_addr_d2[3:0]==i) 
        begin
          up_dout_t2     <= ram_out[(i+1)*32-1:i*32];                                                                                                    
        end
     end// for loop
  end

我已将i声明为整数。这里编译器给出错误'我不是常数'。我不确定是否可以这样编码并且期待多驱动程序错误但是这个错误我不明白。请扔光。

verilog
1个回答
2
投票

这条线是非法的:

up_dout_t2     <= ram_out[(i+1)*32-1:i*32];

在部分选择中具有冒号右侧的变量值是非法的。基本上,这是非法的:

i[a+3 : a]

相反,你必须说:

i[a+3 -: 4]

其中a+3是起始指数,-:表示倒数,4表示宽度。所以,而不是

i[a : a+3] 

你不得不说:

i[a +: 4]

i指数的方向无关紧要。这些代码行适用于任何一种

reg [big:little] i;

要么

reg [little:big] i;

所以,你的代码行应该是:

up_dout_t2     <= ram_out[(i+1)*32-1 -: 32];

要么:

up_dout_t2     <= ram_out[i*32 +: 32];
© www.soinside.com 2019 - 2024. All rights reserved.