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未断言,则任何内容都不应依赖于输出,并且 Xs 允许您指定它,并且指定 X 可以告诉综合工具它是无关紧要的,用于优化目的。

4

2 回答 2

1

Chisel 不支持 X。

这可能是你想要的:

io.rdData := mem(io.rdAddr)

(这可以防止在零和内存的读出数据之间混合)。

例如,如果有人试图推断单端口 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)

简而言之,需要注册读取地址(因为我们在此示例中处理的是同步存储器),并且该寄存器上的使能信号指示读出数据仅在使能为真时才更改。因此,后端知道读取端口上存在读取使能信号,并且在此示例中,写入端口和读取端口是相同的(因为一次只能访问一个)。或者,如果您想要 1w/1r(根据您的示例),您可以将“elsewhen (ren)”更改为“when (ren)”。

于 2013-09-12T11:08:10.537 回答
1

Chisel 2.0 Tutorial论文中,目前仅支持二进制逻辑:

2 可在 Chisel 中表达的硬件

这个版本的 Chisel 也只支持二进制逻辑,不支持三态信号。

我们专注于二进制逻辑设计,因为它们构成了实践中的绝大多数设计。我们在当前的 Chisel 语言中省略了对三态逻辑的支持,因为在任何情况下,行业流程都对三态逻辑的支持很差,并且难以在受控硬宏之外可靠地使用。

于 2013-09-11T16:25:04.913 回答