在Systemverilog中使用进程间同步

在Systemverilog中使用进程间同步,verilog,system-verilog,uvm,Verilog,System Verilog,Uvm,我需要在systemverilog中对我的部分硬件进行建模,它看起来有点像: 我可以让两个踏板(SV任务)并行运行 Thread: 1. get_resource_from_manager() [sema.get(1) ??] 2. repeat(until_finish) 3. do_work() 4. give_contorl_to_thread1() [sema.put(1) ??] 5. wait_for_thread1_to_return_control() [sema

我需要在systemverilog中对我的部分硬件进行建模,它看起来有点像:

我可以让两个踏板(SV任务)并行运行

Thread:

1. get_resource_from_manager()  [sema.get(1) ??]
2. repeat(until_finish)
3.   do_work()
4.   give_contorl_to_thread1() [sema.put(1) ??]
5.   wait_for_thread1_to_return_control() [sema.get(1) ??]
6.   continue_work()
7. endrepeat
8. do_some_cleanup()
9. exit()

两个线程做相同的工作。我在考虑使用信号灯。我以前从未用过。线程将在第5行阻塞是一个有效的假设/事实吗?我想要实现的是,thread1将通过在第4行中使用信号量put()将资源放弃给thread2->thread2将获取此资源并执行其工作,最终使用put释放它。在此期间,thread1将在第5行等待阻止get()调用

是如果一个线程获得信号量,另一个线程将被阻塞。您需要将信号量定义为:

 semaphore  sema = new(1);

是一个与您正在寻找的类似的工作示例。为了使这两个任务同时运行,应该从两个并行体(例如在fork-join块内)调用它们。另外,请注意,普通的合成工具无法合成信号量。

我认为您不了解SystemVerilog中线程的概念以及使用fork/join生成线程的方法。这里可能不需要信号量,我想这里需要信号量或互斥量,因为在我的例子中,两个线程都会尝试访问一个共享接口。