Vec [Mem]에게 set-associative cache가 좋을 것 같습니다.Vec [Mem] in Chisel을 가지고있는 것이 좋을 것입니다.
불행하게도 시추 지원하지 않습니다 VEC [의 Mem] 구조 : 실제로
val tag_ram2 = Vec.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true)}
:
inferred type arguments [Chisel.Mem[cache.TagType]] do not conform to method fill's type parameter bounds [T <: Chisel.Data]
[error] Error occurred in an application involving default arguments.
[error] val tag_ram2 = Vec.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true)}
[error] ^
[error] /home/asamoilov/work/projects/my-chisel/Cache.scala:139: type mismatch;
[error] found : Chisel.Mem[cache.TagType]
[error] required: T
[error] Error occurred in an application involving default arguments.
[error] val tag_ram2 = Vec.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true)}
그러나 간단한 해결 방법은 잘 작동 :
val tag_ram2 = Array.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true)}
[...]
is (read_tag) {
set_idx := req_idx % UInt(num_sets) // FIXME
for (way_no <- 0 until num_ways) {
tag_read_vec(way_no) := tag_ram2(way_no)(set_idx)
}
controller_state := compare_tag
}
그리고, 쓰기위한 태그 (일부 경우 (...) 절의 원인)
for (way_no <- 0 until num_ways) {
when (UInt(way_no) === way_idx) {
printf("writing to way %d set %d tag %x\n", way_idx, set_idx, tag_write.toBits)
tag_ram2(way_no)(set_idx) := tag_write
}
}
제안 사항을 개선하기위한 제안? 감사합니다.
기능 요청은 (https://github.com/ucb-bar/chisel/issues) 또는 https://groups.google.com/forum/#에서 볼 수 있고 응답 할 확률이 더 높습니다. ! forum/chisel-users). 내가하는 일은 for 루프를 설정하고 익명으로 for 루프 내에서 각 은행을 정의하는 것입니다. 메모리 뱅킹의 경우 실제로 2 차원 배열을 사용하려고 시도하는 것보다 완벽하게 괜찮은 (어쩌면 더 나은) 것으로 나타났습니다. – Chris
당신은 꽤 옳습니다. 이것은 효과적으로 n_ways X n_sets 태그와 데이터를 유지하기위한 2 차원 배열입니다. 메모리 뱅킹 구현을 살펴볼 수 있습니까? 나는 치즐을 처음 사용하고 최고의 끌의 스타일 가이드를 찾고 있습니다. 감사! –
좋아, github에 코드에서 2 뱅크 메모리 구현을 찾았습니다. https://github.com/ucb-bar/riscv-sodor/blob/master/src/rv32_3stage/memory.scala –