【问题标题】:Reading wrong data when indexing a nested array索引嵌套数组时读取错误数据
【发布时间】: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]

我可以很好地写入缓存。

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 个字节。 我不确定我是否有太多的嵌套数组。

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

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

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

    dcache_t cache[7:0];
    

    【讨论】:

    • 你说得对,我不需要打包整个缓存,将缓存的索引部分更改为解压,正如您提到的那样解决了我的问题。谢谢!
    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2020-11-23
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多