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応じて、話しているアドレスに応じて変わりますiiは定数ではないため、このコードは合成できません。

これに対する他の回避策はありますか?私が知っている唯一の回避策は、これら3つのステートメントをCONST回書き出すことです。私は最終的にそれをする必要がないことを望んでいます。他に解決策はありますか?

4

1 に答える 1

4

readdata常にコピーしようとしているように見えますが、特定の特殊なケースの条件が満たさwritedataれた場合は、LSBに入力してください。また、ループがブロック内にあり、コンボロジックを構築しようとしているenと仮定します。foralways

あなたが書いた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各ビットに1つずつ、合計3つのロジックコーンを構築していますwritedata[3:1]。ビットマッピングが意図したものであるかどうか、つまりにマッピングするかどうかを再確認en[2:0]writedata[1:3]ます。

于 2011-07-27T17:03:30.790 に答える