我正在使用Verilog进行设计,并且正在使用一个整数,每次always模块在时钟正沿运行时都会重新定义该整数。这对于我在always块中的两个数组之一正常工作,但是Vivado抱怨(仅)第二个数组使用“非常量”作为索引,以选择数组的切片。 o_pl_inst
是一个128位的寄存器,而csh_reg
是一个128兆位的寄存器,我一次要选择128位存储在o_pl_inst
中。在相同情况下,如何分配数组的动态切片没有问题,就像在“ csh_reg[i*i-127] = activ_inst;
”中一样,但是在相同的庄园中我没有价值?任何帮助将不胜感激。
我尝试将数组声明移到Always块之外,但这会引起新的问题。
always@(posedge clk) begin
// Load instructions into the CSH
int i = (inst_width*(sp_csh+1))-1; /*Reference index generation for dynamic array slicing*/
int j = (i_pl_sp*128)-1; /*Reference index generation for dynamic array slicing*/
csh_reg[i*i-127] = activ_inst; /*Load 128-bit instructions into the array 128 bits apart*/
sp_csh = sp_csh +1; /*Increment internal CSH_sp*/
activ_inst = i_ps_inst; /*Get next instruction*/
// Save instruction from CSH
o_pl_inst = csh_reg[j:j-127]; /*Retrieve 128-bit instruction from 1 of 1048576 positions in CSH*/
end
我需要修订/替代可以综合。根据我的阅读,Vivado在使用非常数切片时往往会遇到问题,但这仅在第二个数组中发生了……
答案 0 :(得分:1)
这个问题已经得到解决,这在很大程度上要归功于这些评论。我将分享所做的更改以使其正常运行;首先,我的BRAM使用率太高。显然,在尝试进行合成之前,我没有得到任何警告,但是在合成或实施过程中都会碰到它,因此我根据芯片的数据表进行了调整,以不使用超过可用的BRAM的内存。其次,我使用的是动态切片的形式,该切片在Vivado中不受支持,但在Quartus之类的其他工具中得到支持,因此我使用@dwikle在注释中共享的链接进行了更改。之后,我在声明中留下了一个愚蠢的错误:我已将我的一个参数声明为向量,并试图将其分配给数组。所以我改变了。谢谢大家。