6

我正在尝试编写此代码:

 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 次。我希望我最终不必这样做。还有其他解决方案吗?

4

1 回答 1

4

看起来您一直在尝试复制readdata到,但如果满足某些特殊情况条件,请writedata填写 LSB 。en我还将假设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

在这段代码中,我设置writedatareaddata,然后调整结果值,writedata如果特殊情况在起作用。该for循环正在构建 3 个逻辑锥,每个位对应writedata[3:1]. 我会仔细检查位映射是否是您想要的 - 即映射en[2:0]writedata[1:3].

于 2011-07-27T17:03:30.790 回答