我正在尝试编写此代码:
for (i = 0; i <= CONST - 1'b1; i = i + 1'b1)
begin : loop_inst
if (i < 3)
begin
if (changed[i] & !done_q[i])
begin
writedata[3-i] = en[i];
writedata[2-i:0] = readdata[2-i:0];
writedata[15:4-i] = readdata[15:4-i];
end
end
else
...
基本上,我尝试写入的位(en
)的位置会根据我所说的地址而改变,具体取决于i
。此代码不可合成,因为i
不是常量。
还有其他解决方法吗?我知道的唯一解决方法是写出CONST时间的这三个语句。我希望我最终不必那样做。还有其他解决方案吗?
答案 0 :(得分:4)
您似乎一直在尝试将readdata
复制到writedata
,但如果满足某些特殊情况条件,请使用en
填写LSB。我还假设您所拥有的for
循环位于always
块中,并且您打算构建组合逻辑。
从硬件的角度来看,编写for
循环对我来说没有多大意义。 for
循环用于构建逻辑数组,就像你一样
写它你将至少有3个逻辑锥试图在整个writedata
总线上设置值。 (如果它生成任何东西,它将是一些奇怪的优先级结构)。
也就是说,它可能是您的编译器抱怨的范围选择,即writedata[2-i:0]
而不是writedata[3-i] = en[i];
(部件选择中:
的任何内容)。如果你想沿着这些方向做某事,你可以使用'索引部分选择'(+:
或-:
),但在这种情况下有更好的解决方案。
我会按如下方式重写它 - 假设我假设正确:)
always @( /*whatever*/ ) begin
// default assignment
writedata = readdata;
// overwrite some bits in writedata for special cases
for(i=0; i<3; i++) begin
if( changed[i] & !done_q[i] )
writedata[3-i] = en[i];
end
end
在此代码中,我将writedata
设置为readdata
,然后在特殊情况发生时调整writedata
的结果值。 for
循环构建3个逻辑锥,一个用于writedata[3:1]
中的每个位。我会仔细检查位映射是否符合您的意图-ie,将en[2:0]
映射到writedata[1:3]
。