凿子:如何避免错误没有规定线索的默认值

时间:2013-10-27 08:39:21

标签: scala hardware hdl digital-logic chisel

我正在尝试为Mem实现结构化读取端口:

class TagType() extends Bundle()
{
    import Consts._

    val valid = Bool()
    val dirty = Bool()
    val tag   = UInt(width = ADDR_MSB - ADDR_LSB + 1)
}

object TagType
{
    def apply() = new TagType()
}

val tag_read   = TagType()
//val tag_read   = Reg(TagType())
val tag_read_port   = UInt(width = TagType().getWidth)
val tag_ram    = Mem(UInt(width = TagType().getWidth), num_lines , seqRead = false )

when (tag_read) {
    tag_read_port   := tag_ram(line_no)
    tag_read.toBits := tag_read_port

}

当我使用组合

val tag_read   = TagType()

而不是顺序

val tag_read   = Reg(TagType())

我收到错误

Cache.scala:39: error: NO DEFAULT SPECIFIED FOR WIRE: /*? in class cache.Cache*/ Chisel.Bool(width=1, connect to 0 inputs: ()) in component class cache.Cache in class cache.TagType
Cache.scala:40: error: NO DEFAULT SPECIFIED FOR WIRE: /*? in class cache.Cache*/ Chisel.Bool(width=1, connect to 0 inputs: ()) in component class cache.Cache in class cache.TagType
Cache.scala:41: error: NO DEFAULT SPECIFIED FOR WIRE: /*? in class cache.Cache*/ Chisel.UInt(width=28, connect to 0 inputs: ()) in component class cache.Cache in class cache.TagType

此错误消息的含义是什么?

第二个问题:

是否可以将结构化红色端口设置为SystemVerilog,即直接读取

tag_read.toBites   := tag_ram(line_no)

而不是

    tag_read_port   := tag_ram(line_no)
    tag_read.toBits := tag_read_port

谢谢!

1 个答案:

答案 0 :(得分:2)

39/40/41对应的线路是什么?

“when(tag_read)”是什么意思?你不应该在when语句中使用Bool()而不是对象吗?

什么是“line_no”? (通过注册地址执行顺序读取)。

你想用tag_read = Reg(TagType())... [编辑] 你想要创建一个TagType 类型的寄存器,而不是具有与之关联的值的节点。 因此我怀疑错误是如果“tag_read_cond”不是真的那么该寄存器没有默认/初始值。使用Reg(init = something)可能会修复错误 [end edits]

我可能会丢失对象TagType代码。我不确定你要用它做什么。此代码将声明tagType并为其提供一组默认值:

val tag_read   = new TagType()
tag_read.valid := Bool(false)
tag_read.dirty := Bool(false)
tag_read.tag := UInt(0)

val tag_ram    = Mem(new TagType(), num_lines , seqRead = false )

when (tag_read_cond) {
    tag_read := tag_ram(line_no)
}

如果你的变量没有默认值,凿子会生气(也就是说,你的逻辑中有一条路径,其中变量不会被设置,因为Chisel不支持X /不关心)。

虽然你可以抛弃大部分代码,如果你不介意额外的端口,可能只是写下来:

val tag_ram    = Mem(new TagType(), num_lines , seqRead = false )
val tag_read = tag_ram(line_no)

对于顺序记忆:

val tag_ram    = Mem(new TagType(), num_lines , seqRead = true )
val tag_read = tag_ram(RegEnable(line_no, tag_read_cond))

注意地址已注册,启用条件可以告诉内存在评估为true时只读取它。 Chisel手册提供了构建顺序记忆的更多示例/解释。