2

次のChiselコードは期待どおりに動作します。

class Memo extends Module {                                                                                                                                                                                                                    
  val io = new Bundle {
    val wen     = Bool(INPUT)
    val wrAddr  = UInt(INPUT,  8)
    val wrData  = UInt(INPUT,  8)
    val ren     = Bool(INPUT)
    val rdAddr  = UInt(INPUT,  8)
    val rdData  = UInt(OUTPUT, 8)
  }
  val mem = Mem(UInt(width = 8), 256)
  when (io.wen) { mem(io.wrAddr) := io.wrData }                                                                                                                                                                                                
  io.rdData := UInt(0)
  when (io.ren) { io.rdData := mem(io.rdAddr) }                                                                                                                                                                                                
}

io.rdData := UInt(0)ただし、デフォルトが必要なため、指定しないとコンパイル時エラーになります。明示的に指定するXか、デフォルトで X、erm を出力しないモジュールをデフォルトにする方法はありますか?

これを行う理由としては、出力がアサートされていない場合renは出力に依存するべきではなく、X を指定すると出力を指定できるため、最適化のために、X を指定することで合成ツールにドントケアであることを伝えることができます。

4

2 に答える 2

1

Chisel 2.0 チュートリアルペーパーから、現時点ではバイナリ ロジックのみがサポートされています。

2 チゼルで表現できるハードウェア

このバージョンの Chisel もバイナリ ロジックのみをサポートし、トライステート信号はサポートしていません。

実際の設計の大部分を構成するバイナリ ロジック設計に焦点を当てています。現在の Chisel 言語でのトライステート ロジックのサポートは省略しています。これは、いずれにせよ、業界の流れによるサポートが不十分であり、制御されたハード マクロの外で確実に使用することが難しいためです。

于 2013-09-11T16:25:04.913 に答える
1

Chisel は X をサポートしていません。

これはおそらくあなたが望むものです:

io.rdData := mem(io.rdAddr)

(これにより、ゼロと mem の読み出しデータ間の多重化が防止されます)。

たとえば、シングルポート SRAM を推論しようとしている場合、Chisel のチュートリアル/マニュアルにその方法が説明されています ( https://chisel.eecs.berkeley.edu/latest/chisel-tutorial.pdf ):

val ram1p =
  Mem(UInt(width = 32), 1024, seqRead = true)
  val reg_raddr = Reg(UInt())
  when (wen) { ram1p(waddr) := wdata }
  .elsewhen (ren) { reg_raddr := raddr }
  val rdata = ram1p(reg_raddr)

つまり、読み取りアドレスを登録する必要があり (この例では同期メモリを扱っているため)、このレジスタのイネーブル信号は、読み取りデータがそのイネーブルでのみ変化することを指示します。したがって、バックエンドはこれを読み取りイネーブル信号が読み取りポートに存在することを認識します。この例では、書き込みポートと読み取りポートは同じです (一度に 1 つだけがアクセスされるため)。または、(例のように) 1w/1r が必要な場合は、「elsewhen (ren)」を「when (ren)」に変更できます。

于 2013-09-12T11:08:10.537 に答える