2012-12-19 54 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缺少的功能,移植应该很简单。