索引嵌套数组时读取错误数据

时间:2014-10-31 04:50:48

标签: system-verilog

我正在管道处理器中实现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]

我可以写缓存。

indexwaysel是使用组合逻辑来确定索引位置的变量。

例如,这一行在我的always_ff缓存寄存器中。

cache[index].way[way].data[sel] = ccif.dload[CPUID];

在上面的代码行之后,以下内容存储到缓存中 适用于index = 6way = 0sel = 0

cache[6].way[0].data[0] <== 0x01234567

在下一个时钟周期后,index = 6way = 0sel = 1

的后续内容如下
cache[6].way[0].data[1] <== 0x89ABCDEF

因为我一次加载两个单词。

...但是当我使用index = 6way = 0sel = 1

阅读时
dcif.dmemload = cache[index].way[way].data[sel];

从我的缓存中读取以下内容

dcif.dmemload <== 0xCDEF0123

我得到错误的值并且不知道为什么,因为缓存中的值仍然相同且没有更改。

这是我阅读时缓存部分的当前状态

+-------+------------+------------+
| index |  data[1]   |  data[0]   |
+-------+------------+------------+
|     6 |  89ABCDEF  |  01234567  |
+-------+------------+------------+

有什么想法吗?我很困惑,因为我的索引在写作时工作正常,但在阅读

时发生了一些奇怪的事情

编辑:读取的值并不总是偏移2个字节。 我不确定我是否有太多嵌套数组。

1 个答案:

答案 0 :(得分:4)

这是ModelSim / Questa中的错误,已在下一版本中修复。

解决方案是不要将整个嵌套数组全部打包。您可能并不打算将缓存打包。除非需要将整个数组作为单个整数值访问,否则不应打包数组。

dcache_t cache[7:0];