我正在使用 systemc 来建模基于数据包的网络。有两个并行线程,处理随机大小的数据包。在每个数据包之后,我想检查另一个线程是否恰好处于相同的状态(数据包边界)以避免冲突。
知道如何检测此类事件并发性吗?
直接回答有关检测同一模拟时间发生的事件的方法的问题:
sc_time_stamp()
将返回当前模拟时间。
如果你的线程在构造数据包时记录了“最后一个数据包时间”,那么第二个执行的线程可以将其模拟时间与“最后一个数据包”的时间进行比较。匹配表示并发情况,第二个执行线程可以等待发送其数据包。
sc_time last_pkt_time = sc_time(0,SC_NS);
void pktgen1_thread() {
...
if (last_pkt_time != sc_time_stamp()) {
send_pkt();
else {
wait(); // wait to send in a later iteration of thread loop
我不确定您正在开发什么样的系统,以及您是否通过“事件”特指
sc_event
,但我认为您真正想要的是基于数据包的可用性进行仲裁。您可以有一个单独的仲裁线程来检查 2 个 FIFO 是否有数据包并选择一个进行处理:
void pktgen1_thread() {
...
MyPkt pkt = build_pkt();
pktgen1_fifo.write(pkt);
...
}
void arbiter_thread() {
while (1) {
MyPkt pkt;
if (pktgen1_fifo.available()) {
pkt = pktgen1_fifo.read();
process_pkt(pkt);
} else if (pktgen2_fifo.available()) {
pkt = pktgen2_fifo.read();
process_pkt(pkt);
}
wait();
}
}
所需的确切编码风格将取决于您的 SystemC 使用案例(TLM LT/AT 模型与综合兼容)。