RawModule 仅用于 Top 连接吗?

Is RawModule only for Top connections?

我正在写一个 SPI to Wishbone component with Chisel3,为了在 FPGA/real 世界上测试它,我必须更改重置 (rstn) 的极性。

为了管理它,我对我的 Top 模块使用了 RawModule。我用 withClockAndReset() 改变了复位极性:

class TopSpi2Wb extends RawModule {
  val clock = IO(Input(Clock()))
  val rstn  = IO(Input(Bool()))
  // ...
   withClockAndReset(clock, !rstn) {
    val spi2Wb = Module(new Spi2Wb(dwidth, awidth))
    // module connections IO
  }

自从我尝试在叉骨端口上实例化同步内存后,它似乎就可以工作了。使用这种代码:

class TopSpi2Wb extends RawModule {
  val clock = IO(Input(Clock()))
  val rstn  = IO(Input(Bool()))
  // ...
   withClockAndReset(clock, !rstn) {
    val spi2Wb = Module(new Spi2Wb(dwidth, awidth))
    val wmem = SyncReadMem(1 << awidth, UInt(dwidth.W)) 
    val ackReg = RegInit(false.B)
    val datReg = RegInit(0.U(dwidth.W))

    ackReg := false.B
    datReg := 0.U(dwidth.W)
    when(spi2Wb.io.wbm.stb_o && spi2Wb.io.wbm.cyc_o) {
      when(spi2Wb.io.wbm.we_o){
        wmem.write(spi2Wb.io.wbm.adr_o, spi2Wb.io.wbm.dat_o)
        datReg := DontCare
      }.otherwise{
        datReg := wmem.read(spi2Wb.io.wbm.adr_o, spi2Wb.io.wbm.stb_o &
                            spi2Wb.io.wbm.cyc_o & !spi2Wb.io.wbm.we_o)
      }
  // ...

编译 没有错误,但我无法在内存中正确地 read/write(使用 icarus)。发出的 Verilog 似乎放弃了内存实例化。

也许不鼓励编写 凿子代码 像 Register, memories, ... 并在 RawModule 中实例化 one top module 否?

好吧,如果我在 RawModule 中包装一个 top 模块,效果会更好:

// Testing Spi2Wb with a memory connexion
// and reset inverted
class TopSpi2Wb extends RawModule {
  // Clock & Reset
  val clock = IO(Input(Clock()))
  val rstn  = IO(Input(Bool()))

  // Simple blink
  val blink = IO(Output(Bool()))

  // SPI
  val mosi = IO(Input(Bool()))
  val miso = IO(Output(Bool()))
  val sclk = IO(Input(Bool()))
  val csn  = IO(Input(Bool()))

  val dwidth = 8
  val awidth = 7

  withClockAndReset(clock, !rstn) {
    val spi2Wb = Module(new Spi2WbMem(dwidth, awidth))
    blink := spi2Wb.io.blink
    spi2Wb.io.mosi := mosi
    miso := spi2Wb.io.miso
    spi2Wb.io.sclk := sclk
    spi2Wb.io.csn := csn
  }
}

使用上面的代码,Wishbone 内存的所有连接和寄存器实例化都在 Spi2WbMem() standard 模块中完成。

按照 jkoenig 的要求,我重新编写了模块以重现该错误,并且... fixed it! 抱歉给您带来不便。

我很难找到这个错误,因为 Icarus didn't dump the content 内存,我认为它没有生成。

我认为我最初的模块包装在我没有意识到的情况下修复了这个错误。