我正在尝试将内存控制器的SystemVerilog模型移植到SystemC,并且想知道什么是最好的方法来翻译用fork生成的run()
类型的函数(即具有进行连续处理的永久循环)并加入SystemC。这些run()
函数通常在模拟开始时产生。我的困惑是SystemC确实支持生成线程,派生和联接,但是我相信该语言的意图是SC_THREAD
提供这种功能。有没有人有足够的两种语言经验来发表评论?
注意:我认为这个问题与约定有关,而不是技术上正确或错误的解决方案。可能可以通过多种方法完成。
最佳答案
sc_thread与SystemVerilog的fork / join类似。两种语言都使用相同的非抢先式多线程语义实现其线程。就是说,一个线程运行直到它等待某件事为止。那时,线程将控制权移交给计划同时运行的任何其他线程。两种语言都是确定性的,具有局限性。显然种子必须相同,但是更改任何代码也可能导致随机化发生变化。我认为这还包括线程运行的顺序,但是我可能是错的。
如上所述,您不应在SystemC中使用posix fork / join,因为该库不是线程安全的,并且还因为它破坏了该库的假设并引入了非确定性。
因此,只要SV代码不具备SC缺少的功能,移植就应该很简单。