verification TLM传输数据导致多线程访问同一个数据

TLM传输数据导致多线程访问同一个数据

原因

TLM发送数据跟mailbox类似,都是发送的引用,这样发送端和接收端的引用都指向同一个数据,这样就会出现发送端修改数据会影响到接收端,比如发送的时候数据时A,接收端接收后,发送端又修改了这个数据为B,就会导致接收端接收的是B。

举例

monitor发送数据个RM

monitor伪代码

while(1)begin
    tr.a = bus.a;
    @(bus)
    port.put(tr);
end

RM伪代码

while(1)begin
    port.get(tr);
    if(tr.a == 'hA)begin
        $display("A");
    end else begin
        $display("B");
    end
end

在上面的例子中,monitor发送完数据后,就立马采用数据,修改transaction,如果monitor先修改,RM后判断tr.a,那么就会出现问题(如果这个顺序是固定的还好,就是差一拍,问题是一部数据使用差一拍一部分数据使用又不差就出问题了)

解决办法

在使用TLM发送transaction的时候先copy一份再发送,或者TLM接收数据后拷贝一份再使用

posted @ 2021-12-14 23:43  下夕阳  阅读(64)  评论(0编辑  收藏  举报