我尝试在systemverilog中实现一个循环双向链表类(带有单个哨兵节点)。列表本身似乎按预期工作,但最终崩溃的模拟器(腐败堆栈?)没有systemverilog支持链表?
这让我想知道这是从根本上不支持的语言(按分配)? SV确实有一个“队列”结构,可以以相同的方式工作(可能在访问和插入时更有效)。
任何想法?
我尝试在systemverilog中实现一个循环双向链表类(带有单个哨兵节点)。列表本身似乎按预期工作,但最终崩溃的模拟器(腐败堆栈?)没有systemverilog支持链表?
这让我想知道这是从根本上不支持的语言(按分配)? SV确实有一个“队列”结构,可以以相同的方式工作(可能在访问和插入时更有效)。
任何想法?
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队列是否可综合。我不是100%确定如何从一个循环缓冲区开始,而不先检查索引...
没有从我不在的语言中缺失的东西。几乎所有的东西都是通过参考,所以这是你需要的主要东西。我能想到的唯一问题就是要记住SV是垃圾收集的,所以重要的是当你从你的列表中删除对实例的引用(但你可能会这么做)
我是很确定队列将在内部作为链接列表实现。这就是说,当我想以奇怪而奇妙的方式使用队列时,我在不同的模拟器上遇到了一些问题。
SystemVerilog是一种垃圾收集语言。如果您正在使用的模拟器实施的垃圾收集方案存在错误,则循环链接列表可能会导致问题。