3

次のフラグメントの場合、Chisel で合成されたものはありません:

import Chisel._
import Node._
import scala.collection.mutable.HashMap

class PseudoLRU(val num_ways: Int) extends Module
{

    val num_levels = log2Up(num_ways)

    val io = new Bundle {
        val last_used_cline = UInt(INPUT,  width = num_levels)
        val update_state    = Bool(INPUT)
    }

    val state = Reg(Vec.fill(num_ways-1){Bool()})

    private val msb = num_levels - 1

    when (io.update_state) {

        // process level 0
        state(0) := !io.last_used_cline(msb, msb) // get the most significant bit

        // process other levels
        for (level <- 1 until num_levels) {
             val offset = UInt((1 << level) - 1, width = log2Up(num_ways-1))
             val bit_index = io.last_used_cline(msb, msb - level + 1) + offset
             val pos = msb - level
             val bit = io.last_used_cline(pos, pos)
             state(bit_index) := !bit
        }
    }
}

object test_driver {
    def main(args: Array[String]): Unit = {
        val plru_inst  = () => Module(new PseudoLRU(num_ways = 16))
        chiselMain(args, plru_inst)

    }
}

(level <- 1 until num_levels) のループを手動でアンロールし、定数を折り畳んだ場合と同じ動作:

when (io.update_state) {
    state(                                            0  ) := !io.last_used_cline(3, 3)
    state( io.last_used_cline(3, 3) + UInt(1, width = 3) ) := !io.last_used_cline(2, 2)
    state( io.last_used_cline(3, 2) + UInt(3, width = 3) ) := !io.last_used_cline(1, 1)
    state( io.last_used_cline(3, 1) + UInt(7, width = 3) ) := !io.last_used_cline(0, 0)
}

両方のスニペットに対して生成された Verilog (および同様の C++ コード) (元のスニペットと 16 通りのケースで展開/インスタンス化されたもの):

module PseudoLRU(input reset,
    input [3:0] io_last_used_cline,
    input  io_update_state
);

  wire T0;
  wire[151:0] T1;

  assign T0 = ! reset;
endmodule

なぜダミー構造しかないのかわからない ロジックの合成を強制するにはどうすればよいですか? ありがとう!

4

1 に答える 1

3

Chisel は、信号が何にも接続されていない場合、設計内の信号を積極的に削除します。

あなたの場合、PsuedoLRU からの出力がなく、「last_used_cline」と「update_state」のみを入力しているようです。これは、C/C++ で関数を記述し、関数の結果に対して何もしないようなものです。

C では、変数に「揮発性」のタグを付けて、コンパイラをだましてコードを保持させることができます (他の誰かがその変数の値を使用することを約束しています)。Chisel では、「debug()」を使用してシグナルを強制的に存在させることができます。

Vec of Regs を強制的に存在させると思います。これを行うことができます。

for (i <- 0 until num_ways)
    debug(state(i))
于 2013-11-16T18:32:12.020 に答える