2013-10-27 8 views
1

Я пытаюсь реализовать структурированное чтение порта для 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

Что делать линиям 39/40/41 соответствуют?

Что означает «когда (tag_read)» означает? Разве вы не должны использовать Bool() внутри оператора when, а не объект?

Что такое "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) 
} 

Зубило сердится, если ваши переменные не имеют значения по умолчанию (то есть, есть путь через логику, в которой переменная не получит set, поскольку 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 приводятся дополнительные примеры/объяснения по построению последовательных запоминающих устройств.

+0

Спасибо за ваши комментарии. Конечно, это был тип, когда (...) условие, на самом деле это была переменная Bool, когда (...). Для инициализации значений по умолчанию мне было удобно использовать метод приложения сопутствующего объекта. –

+0

Просто небольшие строки сложения делают 39/40/41 соответствуют действительным, грязным, полям тегов в классе TagType, спасибо! –

+0

Использование метода применения объекта для инициализации значений по умолчанию может быть хорошей идеей, но вы должны быть осторожны: в этом конкретном случае Reg (TagType()) создает регистр типа TagType, тогда как Reg (init = TagType()) создаст регистр типа TagType с соответствующими начальными значениями после сброса. Я признаю, что не использую этот метод применения объекта, поэтому приведенный выше синтаксис может быть неправильным, но, надеюсь, идея достаточно ясна. – Chris