SV——disable_fork与总线事务

对于下面的例子,假设实际中是thread1 先完成,thread0被disable。并且 signal==1的时候,reg0的值恰好也会跳变为1。本意是再thread 2对reg 0 做的write clear.

1
2
3
4
5
6
7
8
9
10
11
12
fork
begin // thread 0
while(rd_data == 0) begin
getreg(reg0,rd_data);
end
end
else begin // thread 1
wait(signal == 1);
end
join_any
disable fork;
wrreg(reg0,rd_data); //thread 2

但是实际波形中,在thread 1 结束之后,总线上先做了一个读操作,读到的值是跳变后的1;然后做了一个写操作,写的值是0.

这与期望不同,期望的是thread 1结束之后,是一个写1的操作。

这可能是因为,thread 1结束的时候thread 0已经在总线(好像是AXI)上了,它会读到1;但thread 1结束之后,thread 2也被提到总线上,此时写的值rd_data为0,因为thread 0还没有返回1,所以会有问题。

解决方法有两个,一个是在thread 2之前做一段时间的延迟(#);另一个是在thread 2写之前,先读。

而且这次仿真中在thread 2之后还有一个读reg 0的操作,判断是否write clear,但是在总线上没有看到这次的transaction,最终timeout。