我正在使用Verilog和modelSim,当我尝试将reg变量分配给另一个reg变量的不同部分时,我得到以下错误:
** Error: Range width must be greater than zero.
** Error: Range width must be constant expression.
这是相关代码:
integer f; //zd, qd, R and Q are regs
always @ * begin
f = 52 - zd;
R = qd[f +:0];
Q = qd[63 -:f+1];
end
我希望R包含qd(从0到f),Q要包括(其余的)qd(从f + 1到63)。怎么做?谢谢。
答案 0 :(得分:4)
你想要做的事情在verilog 2001中是不合法的。
正如你的警告所说,Range width must be constant expression
,即你不能有可变长度的部分选择。
您可以使用固定长度的部分选择来改变起始点(即从f
开始选择8位),但语法是这样的:
vector_name[starting_bit_number +: part_select_width]
vector_name[starting_bit_number -: part_select_width]
在硬件中,总线的大小必须是固定大小,您不能根据寄存器的内容更改硅中的导线数量:)