1

最近在学习systemc,有一个关于信号量通道的问题。

我在 asic 世界(http://www.asic-world.com/systemc/channels3.html)上找到了一个例子,但有点困惑。

在这个例子的前 1ns,第一个进程 bus_semaphore() 工作并且可以打印出两行“@1 ns ....”。同时,信号量值(bus)变为2(bus.post()),然后等待下一个时钟posedge。

对于第二个进程do_read(),也是在1ns,第一行“@”可以正常打印出来,但是下一个if语句中的trywait()呢?第一个和第二个进程应该同时执行,也就是说我们无法确定trywait()是在第一个进程的bus.post()语句之前还是之后执行,所以我们不知道第二个“@”是否第二个过程的行将被打印出来。

但是页面底部显示的答案意味着 trywait() 将在 bus.post() 执行后执行,以便打印出第二个“@...”语句。如何确定在 bus.post() 执行后 trywait() 将执行?

提前致谢!

4

2 回答 2

1

我想我已经想通了。SC_CTOR 中定义的进程顺序非常重要,这与 SC_CTOR 中定义的顺序相反。

于 2015-03-02T21:33:56.877 回答
1

您是正确的,该示例展示了许多竞争条件。在构造函数中更改进程创建顺序会影响模块的行为这一事实就是证明。

这不是一个很好的例子。任何设计都不应该具有这样的竞争条件。

于 2015-03-09T09:40:45.677 回答