2014-04-12 8 views
0

편지함에 글을 쓰려고 할 때 UVM SV 테스트 벤치에서 편지함을 사용 중입니다. 데이터 writetrans (*) 함수에 모든 방법을 도착하고 결국 공간이 사서함이 있지만도 쓰기에 실패이야 ... 내가 무엇이 잘못되었는지 확실히 확실하지 않다systemverilog 편지함에 쓰지 못함

class my_seqyuence extends uvm_sequence; 

mailbox data; 
some_user_defined_type mydata; 

function new(string name = "my_sequence"); 
    super.new(name); 
    data=new(); 
endfunction 

task body(); 
    forever begin 
    // blocking-get. program is blocked here... not why get is not returning...! 
    data.get(mydata); 
    decode_mydata_and_do_something_here; 
    end 
endtask 

function void writetrans(some_user_defined_type trans); 
// I used print statements with mailbox size and i can see that valid trans is arriving here and successfully writing to mailbox. 
    data.try_put(trans) 
endfunction 
endclass 

: 내 코드는 울부 짖는 소리처럼 보인다 .

답변

3

코드에 몇 가지 문제가 있지만 기능 및 작업 호출을 조정하는 방법을 정확히 모른 채 문제가 무엇인지 알기가 어렵습니다.

항상 성공한 지 확인하려면 try_put()try_get()의 결과를 테스트해야합니다.

당신은 항상 anaylsis_export 또는 anaylsis_imp이 모니터의 분석 포트에 연결하는 데 사용되는

mailbox #(some_user_defined_type) data; 
+0

uvm_component를 확장하여 분석 포트를 만들었습니다. 분석 포트는 DUT 요청을 받기 위해 모니터 트랜잭션 포트와 연결됩니다. 분석 포트의 쓰기 구현 내에서, 위의 코드에서 언급 한 writetrans (*) 함수를 호출하여 수신 된 req를 전달합니다. 사서함에 데이터가 쓰여지고 있습니다. get()이 작동하지 않는 이유를 알 수 없으므로 다소 잃어 버렸습니다 ... – newbie

0

1) 확인 안전한 유형에 대한 매개 변수화 사서함을 사용해야합니다. 사서함이 제한은 없습니다

2)

때문에, 넣어() 대신 try_put()의를 사용합니다. SystemVerilog LRM에 따르면 try_put은 제한되지 않은 사서함에 의미가 없습니다. 사서함에 항목을 넣지 않고 차단하는 용도로만 사용됩니다. 의미가 무엇인지 알지 못하지만 예상대로 작동하지 않을 수도 있습니다. LRM에서

-

try_put() 메소드를 저장 엄격한 FIFO 위해 사서함에 메시지를 입력합니다. 이 메서드는 제한된 사서함에만 의미가 있습니다.

3))는 (A try_get을 수행 할 수 있습니다, 그것은 또한 1보다 큰 수 있도록 방법) (당신의 하기 전에)를 사서함의 기능을 납입를 (사용하고 반환 값이 있는지 확인 1 (0-> 비어 있음, 1> 형식 불일치)

관련 문제