2013-10-27 4 views
1

내가 MEM하는 구조 읽을 포트를 구현하기 위해 노력하고있어 지정된 디폴트를 피하기하는 방법 :드릴링 : 오류를 WIRE

나는 조합

val tag_read = TagType() 

대신 순차적

의 사용
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 = 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은 무엇을할까요?

"when (tag_read)"의 의미는 무엇입니까? when 문 안에 Bool()을 사용하면 안되며 객체가 아닌가?

"line_no"란 무엇입니까? (순차적 읽기는 주소를 등록하여 수행됩니다).

당신이 tag_read으로 달성하려고하는 무엇 = 등록 (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 's/do not care를 지원하지 않기 때문에).

당신이 그 코드의 대부분을 도랑 당신은 여분의 포트를 괜찮다면 아마이 쓸 수 있지만 :

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

참고 주소 :

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

그리고 순차적 추억

이 등록되면 true로 평가 될 때 메모리에만 읽을 수 있음을 알리는 사용 조건이 설정됩니다. Chisel 매뉴얼은 순차적 메모리를 구성하는 것에 대한 더 많은 예제/설명을 제공합니다.

+0

의견을 보내 주셔서 감사합니다. 물론, 그것은 (...) 조건 일 때 실제로 유형 (...)에 대한 Bool 변수였습니다. 기본값을 초기화하기 위해 동반자 객체의 apply 메소드를 사용하는 것이 편리하다는 것을 알았습니다. –

+0

작은 추가 라인 39/40/41은 TagType 클래스의 유효하고 더러운 태그 필드에 해당합니다. 감사합니다! –

+0

개체의 apply 메서드를 사용하여 기본값을 초기화하는 것이 좋습니다. 그러나이 특별한 경우 Reg (TagType())는 TagType 유형의 레지스터를 만드는 반면 Reg (init = TagType))는 재설정 후 적절한 초기 값을 갖는 TagType 유형의 레지스터를 작성합니다. 나는이 객체 적용 기법을 사용하지 않는다는 것을 인정한다. 위의 구문은 틀릴 수도 있지만, 그 아이디어는 충분히 명확하다. – Chris