我嘗試在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是一種垃圾收集語言。如果您正在使用的模擬器實施的垃圾收集方案存在錯誤,則循環鏈接列表可能會導致問題。