UVM TLM1
所谓TLM就是事物级建模(Transaction Level Modeling),目的是提高仿真模拟的数据传输层次,进而提高提高仿真速度和效率。
TLM1是相对于TLM2而言的。但是他们之间没有明确的generation关系,只是用于不同的领域,TLM2是基于C++的。
TLM1 有以下几种类似:uvm_*_port , uvm_*_export , uvm_*_imp。
对于单向,"*"可以是下面任何一种:
blocking_put
nonblocking_put
put
blocking_get
nonblocking_get
get
blocking_peek
nonblocking_peek
peek
blocking_get_peek
nonblocking_get_peek
get_peek
对于双向,"*"可以是下面任何一种:
blocking_transport
nonblocking_transport
transport
blocking_master
nonblocking_master
master
blocking_slave
nonblocking_slave
slave
另外"*"还可以是analysis,即uvm_analysis_port , uvm_analysis_export , uvm_analysis_imp。analysis port用于调用write()函数广播数据,即一个analysis port可以有n个analysis imp。
这些object在uvm_component内部实例化,port可以连接任何兼容的port,export和imp,一个port至少要和一个imp连接。
也就是说有以下几种连接方式:
1:port - port - imp
2:port - export - imp
3:port - imp
4:export -imp
总之在连接的最后一定是imp。为什么呢?
要明白为什么会有imp这种类型,imp其实是implementation的简称。举例uvm_blocking_put_port - uvm_blocking_put_imp 这种连接,在port端要调用调用put函数用以传递,但是其实这个put函数并不在uvm_blocking_put_port 里面定义,而是需要用户在uvm_blocking_put_imp 端定义。如果末端没有imp,那么就没有用户定义的put或者get等函数,这是编译自然会出问题。
所以当调用connect连接若干个兼容的port时,调用谁的connect函数来连接谁可以根据imp的位置来确定。如下面的连接:port1 -- port2 -- export1 -- imp1 ,连接如下:
port1.connect(port2)
port2.connect(export1)
export1.connect(imp1)
除了通过兼容的port连接来直接传数据,UVM还提供了两种fifo: uvm_tlm_fifo和 uvm_tlm_analysis_fifo,用来提供一种缓存机制,以免丢包。
uvm_tlm_fifo:
通过以下几种方式可以向fifo放数据:
task put (input T t)
function bit can_put ()
function bit try_put (input T t)
通过以下几种方式可以从fifo取数据:
ask get (output T t)
function bit can_get ()
function bit try_get (output T t)
task peek (output T t)
function bit can_peek ()
function bit try_peek (output T t)
uvm_tlm_analysis_fifo:
uvm_tlm_analysis_fifo和uvm_tlm_fifo不同之处:
1:uvm_tlm_analysis_fifo是没有大小限制的,是无限大的
2: uvm_tlm_analysis_fifo增加了一个write函数,用于数据广播。
3:uvm_tlm_analysis_fifo和uvm_analysis_port配合使用。UVM TLM1
所谓TLM就是事物级建模(Transaction Level Modeling),目的是提高仿真模拟的数据传输层次,进而提高提高仿真速度和效率。
TLM1是相对于TLM2而言的。但是他们之间没有明确的generation关系,只是用于不同的领域,TLM2是基于C++的。
TLM1 有以下几种类似:uvm_*_port , uvm_*_export , uvm_*_imp。
对于单向,"*"可以是下面任何一种:
blocking_put
nonblocking_put
put
blocking_get
nonblocking_get
get
blocking_peek
nonblocking_peek
peek
blocking_get_peek
nonblocking_get_peek
get_peek
对于双向,"*"可以是下面任何一种:
blocking_transport
nonblocking_transport
transport
blocking_master
nonblocking_master
master
blocking_slave
nonblocking_slave
slave
另外"*"还可以是analysis,即uvm_analysis_port , uvm_analysis_export , uvm_analysis_imp。analysis port用于调用write()函数广播数据,即一个analysis port可以有n个analysis imp。
这些object在uvm_component内部实例化,port可以连接任何兼容的port,export和imp,一个port至少要和一个imp连接。
也就是说有以下几种连接方式:
1:port - port - imp
2:port - export - imp
3:port - imp
4:export -imp
总之在连接的最后一定是imp。为什么呢?
要明白为什么会有imp这种类型,imp其实是implementation的简称。举例uvm_blocking_put_port - uvm_blocking_put_imp 这种连接,在port端要调用调用put函数用以传递,但是其实这个put函数并不在uvm_blocking_put_port 里面定义,而是需要用户在uvm_blocking_put_imp 端定义。如果末端没有imp,那么就没有用户定义的put或者get等函数,这是编译自然会出问题。
所以当调用connect连接若干个兼容的port时,调用谁的connect函数来连接谁可以根据imp的位置来确定。如下面的连接:port1 -- port2 -- export1 -- imp1 ,连接如下:
port1.connect(port2)
port2.connect(export1)
export1.connect(imp1)
FIFO:
除了通过兼容的port连接来直接传数据,UVM还提供了两种fifo: uvm_tlm_fifo和 uvm_tlm_analysis_fifo,用来提供一种缓存机制,以免丢包。
uvm_tlm_fifo:
通过以下几种方式可以向fifo放数据:
task put (input T t)
function bit can_put ()
function bit try_put (input T t)
通过以下几种方式可以从fifo取数据:
ask get (output T t)
function bit can_get ()
function bit try_get (output T t)
task peek (output T t)
function bit can_peek ()
function bit try_peek (output T t)
uvm_tlm_analysis_fifo:
uvm_tlm_analysis_fifo和uvm_tlm_fifo不同之处:
1:uvm_tlm_analysis_fifo是没有大小限制的,是无限大的
2: uvm_tlm_analysis_fifo增加了一个write函数,用于数据广播。
3:uvm_tlm_analysis_fifo和uvm_analysis_port配合使用。