使用for循环在Verilog中指定变量范围

时间:2011-07-27 16:14:03

标签: hardware verilog system-verilog

我正在尝试编写此代码:

 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时间的这三个语句。我希望我最终不必那样做。还有其他解决方案吗?

1 个答案:

答案 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]