我正在管道处理器中实现dcache。 我的dcache是一个双向关联,每个块有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个字节。 我不确定我是否有太多嵌套数组。
答案 0 :(得分:4)
这是ModelSim / Questa中的错误,已在下一版本中修复。
解决方案是不要将整个嵌套数组全部打包。您可能并不打算将缓存打包。除非需要将整个数组作为单个整数值访问,否则不应打包数组。
dcache_t cache[7:0];