Я пытаюсь реализовать структурированное чтение порта для 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
Спасибо!
Спасибо за ваши комментарии. Конечно, это был тип, когда (...) условие, на самом деле это была переменная Bool, когда (...). Для инициализации значений по умолчанию мне было удобно использовать метод приложения сопутствующего объекта. –
Просто небольшие строки сложения делают 39/40/41 соответствуют действительным, грязным, полям тегов в классе TagType, спасибо! –
Использование метода применения объекта для инициализации значений по умолчанию может быть хорошей идеей, но вы должны быть осторожны: в этом конкретном случае Reg (TagType()) создает регистр типа TagType, тогда как Reg (init = TagType()) создаст регистр типа TagType с соответствующими начальными значениями после сброса. Я признаю, что не использую этот метод применения объекта, поэтому приведенный выше синтаксис может быть неправильным, но, надеюсь, идея достаточно ясна. – Chris