1.TLM2.0通信
TLM2.0主要包括:
双向的阻塞或者非阻塞接口
时间标记
统一的数据包
TLM2.0的传输是双向的,意味着在一次完整传输中有request和response类型
TLM2.0支持blocking和nonblocking两种transport方式
blocking的传输方式要求在一次传输过程中,完成request和response的传输
nonblocking的传输方式将request和response的传输分为了两个独立的单向传输,而两次传输整体视为完成一次握手传输。
对应的uvm方法
task b_transport(T t, uvm_tlm_time delay);
function uvm_tlm_sync_e nb_transport_fw(T t, ref P p, input uvm_tlm_time_delay);//forward
function uvm_tlm_sync_e nb_transport_bw(T t, ref P p, input uvm_tlm_time_delay);//backward
T代表着统一的传输数据类uvm_tlm_generic_payload,P代表着在nonblocking传输方式中用来做状态同步的类型
TLM2.0将端口类定义为socket,包含port,export,imp
put(),get(),peek()变为了b_transport(),nb_transport_fw(),nb_transport_bw();
uvm_tlm_generic_payload:
bit[63:0] m_address:数据的读写地址
uvm_tlm_command_e m_command:数据的读写命令
byte unsigned data[]:写入的数据或者读出的数据,由byte unsigned的类型构成动态数组,按照总线传输的最小粒度进行划分,便于target一侧进行数据整合
int unsigned length:data数组的长度,该数值应该与data数组的实际容量保持一致
uvm_tlm_response_status_e m_response_status :由target返回的状态值,表示数据传输是否完成和有效
byte unsigned m_byte_enable[]:用来标记写入数据的有效性,标记哪个byte应该写入
int unsigned m_byte_enable_length:该数值应该等于m_byte_enable数组的容量值
m_stream_width:用来表示连续传输时的数据传输长度
uvm_tlm_extension_base m_extensions[uvm_tlm_extension_base]:如果一些数据域不在上面的部分,那么可以在这个数据延伸域中添加
时间类uvm_tlm_time
class comp1 extends uvm_component;
uvm_tlm_b_initiator_socket b_ini_skt;
`uvm_component_utils(comp1)
...
task run_phase(uvm_phase phase);
byte unsigned data[] = {1, 2, 3, 4, 5, 6, 7, 8};
uvm_tlm_generic_payload p1 = new("p1");
uvm_tlm_time delay = new("delay");
p1.set_address('h0000F000);
p1.set_data_length(8);
p1.set_data(data);
p1.set_byte_enable_length(8);