当我尝试综合我的verilog项目时,我收到以下错误: 错误:Xst:2634 - " shiftman.v"第15行:对于循环停止条件应取决于循环变量或是静态的。 错误:Xst:2634 - " shiftman.v"第22行:对于循环停止条件应取决于循环变量或是静态的。
我想我明白导致错误的原因,但我无法找到解决问题的方法。
module shiftman(in,sh,out);
input[47:0] in;
input[8:0] sh;
output[47:0] out;
reg[47:0] out;
reg[7:0] r;
reg i;
always@(in or sh)
begin
r=sh[7:0];
out=in;
if(sh[8]==0)
for(i=0; i<r; i=i+1)
begin
out[23:0]={1'b0,out[23:1]};
end
else
for(i=0; i<r; i=i+1)
begin
out[47:24]={1'b0,out[47:25]};
end
end
endmodule
答案 0 :(得分:1)
您的综合失败的原因是因为您无法在可合成代码中使用变量迭代循环。合成时,工具将尝试展开循环,但如果循环的终止条件不是静态的或在合成时可确定,则它不能执行此操作。你的条件i <= r
是这样一个条件,因为我们无法在不知道r
的情况下展开循环,in
是模块的输入,因此不是静态的。
为了解决这个问题,您需要以综合工具可以处理的方式重写代码。根据它的外观,您只需将sh[7:0]
的顶部或底部逻辑移位sh[8]
,具体取决于always
。为此,您根本不需要循环,但可以使用&gt;&gt; (逻辑右移运算符)。因此,您的always @(*) begin
out = in;
if (sh[8])
out[47:24] = in[47:24] >> sh[7:0];
else
out[23:0] = in[23:0] >> sh[7:0];
end
块看起来更像是这样:
{{1}}