我正在尝试为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
谢谢!
答案 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手册提供了构建顺序记忆的更多示例/解释。