【发布时间】:2014-11-03 23:14:26
【问题描述】:
我正在管道处理器中实现 dcache。 我的 dcache 是 2-way associative,每块 2 个单词和 8 个索引 这就是我初始化缓存结构的方式。
typedef struct packed {
logic [25:0] tag;
logic valid, dirty;
word_t [1:0] data;
} block_t;
typedef struct packed {
block_t [1:0] way;
} dcache_t;
dcache_t [7:0] cache;
所以要访问一个词:cache[i].way[j].data[k]
我可以很好地写入缓存。
index、way 和 sel 是使用组合逻辑来确定索引位置的变量。
因此,例如,此行在我的 always_ff 缓存寄存器中。
cache[index].way[way].data[sel] = ccif.dload[CPUID];
在上述代码行之后,以下内容被存储到缓存中
对于index = 6、way = 0、sel = 0
cache[6].way[0].data[0] <== 0x01234567
在下一个时钟周期之后,index = 6、way = 0、sel = 1
cache[6].way[0].data[1] <== 0x89ABCDEF
因为我一次加载两个单词。
...但是当我使用 index = 6、way = 0、sel = 1 阅读它时
dcif.dmemload = cache[index].way[way].data[sel];
从我的缓存中读取以下内容
dcif.dmemload <== 0xCDEF0123
我得到了错误的值并且不知道为什么,因为缓存中的值仍然相同并且没有改变。
这是读取时我的缓存部分的当前状态
+-------+------------+------------+
| index | data[1] | data[0] |
+-------+------------+------------+
| 6 | 89ABCDEF | 01234567 |
+-------+------------+------------+
有什么想法吗?我很困惑,因为我的索引在写作时工作正常,但在阅读时发生了一些奇怪的事情
编辑:读取的值并不总是偏移 2 个字节。 我不确定我是否有太多的嵌套数组。
【问题讨论】:
标签: system-verilog