我尝试在systemverilog中实现一个循环的双向链表类(带有一个单一的标记节点)。列表本身似乎按预期工作但最终崩溃了模拟器(破坏堆栈?)
这让我想知道这是否是语言根本不支持的(在分配方面)? SV确实有一个“队列”结构,可以以相同的方式工作(在访问和插入时间可能更有效)。
有什么想法吗?
答案 0 :(得分:6)
SystemVerilog确实有一个队列构造。它们被声明有点像数组,但使用$
符号:
int myqueue[$]; // $ indicates a queue
myqueue.push_front(14);
some_int = myqueue.pop_back();
根据您使用方法组合push_front()
,push_back()
,pop_front()
和pop_back()
的方式,您可以实现堆栈& FIFO等。快速的互联网搜索应该为您提供方法和声明选项的完整列表。
我怀疑SystemVerilog队列是否可以合成。而且我不是百分之百确定如何在不检查索引的情况下从一个循环缓冲区制作循环缓冲区...
答案 1 :(得分:1)
我所偏离的语言没有任何内在遗漏。几乎所有东西都是通过引用传递的,所以这是你需要的主要东西。只有我能想到的是要记住SV是垃圾收集的,所以当你从列表中删除它们时对你的实例引用是很重要的(但你可能还是这样做了)
我很确定队列将在内部实现为链表。这就是说当我想以奇怪而奇妙的方式使用队列时,我在不同的模拟器上遇到了一些问题。
答案 2 :(得分:1)
SystemVerilog是一种垃圾收集语言。如果您使用的模拟器实现的垃圾收集方案存在问题,则循环链接列表可能会导致问题。