2012-12-19 56 views
4

對不起,這個問題不是特定的代碼,我相信必須做更多的約定而不是技術上正確或錯誤的解決方案。可能它可以做到不止一種方式。SystemVerilog fork/join w /「run()」type函數和SystemC

我想將一個SystemVerilog模型的內存控制器移植到SystemC,並且想知道什麼是翻譯run()類型函數(即使用永久循環進行連續處理)的最佳方法,它使用fork生成並加入到SystemC中。這些run()函數通常在仿真開始時產生。我的困惑是SystemC確實支持產卵線程,分叉和連接,但我相信該語言的意圖是爲SC_THREAD提供這種功能。有沒有人有足夠的經驗與兩種語言評論?

謝謝!

+1

由於SystemC是合作多任務處理,因此它是確定性的,而普通的POSIX線程是搶先式的多任務處理,因此是非確定性的,同時伴隨着許多其他併發症。我強烈建議不要在POSIX線程中使用,因爲這可能會使您的仿真不能重複生成轉儲。原諒我,如果這是顯而易見的。無論如何,我確實認爲你確實想使用'SC_THREAD'。 –

+0

謝謝羅斯,這對我來說並不明顯。我現在感興趣,是否是SystemVerilog的多任務確定性?即連續的模擬會有相同的保證結果嗎? – Rich

+0

所有商用的Verilog/VHDL仿真器從重新運行的角度來看都是確定性的_給出相同的隨機數發生器(RNG)種子number_,它是命令行上的一個可選參數。模擬器必須是確定性的,以便重現錯誤並生成信號轉儲(VCD/FSDB/VCD /等等)。無論如何,這是運行HDL仿真的全部要點。該範式更多的是[合作多任務](http://bit.ly/7epxWx)[RTOS](http://bit.ly/VUHRyb),而不是[搶先式多任務](http:///bit.ly/UdA2q5),這是Linux POSIX線程的範例。 –

回答

0

sc_thread是SystemVerilog的fork/join的模擬。兩種語言都使用相同的非搶先式多線程語義來實現其線程。也就是說,一個線程一直運行,直到它等待一些東西。此時,線程將控制權交給計劃同時運行的任何其他線程。兩種語言都是有限制的確定性的。顯然,種子必須是相同的,但是改變任何代碼都會導致隨機化的改變。我相信這也包括線程運行的順序,但我可能是錯的。

如上所述,你不應該在SystemC中使用posix fork/join,因爲這個庫不是線程安全的,也因爲它打破了引入非確定性的庫的假設。

因此,只要SV代碼沒有SC缺少的功能,移植應該很簡單。