对 Vec[Mem] 来说说集合关联缓存会很好。
不幸的是,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
}
并用于编写标签(在某些 when(...) 子句下的原因)
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
}
}
意见,改进拟议方案的建议?谢谢!