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 内存,我认为它没有生成。
我认为我最初的模块包装在我没有意识到的情况下修复了这个错误。
我正在写一个 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 内存,我认为它没有生成。
我认为我最初的模块包装在我没有意识到的情况下修复了这个错误。