提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
UVM-TLM总结
前言
总结《UVM实战》第4章内容
一、put、get、transport端口
1.术语
A为发起者(port),B为目标(export)
- put: A发送给B一个数据
- get: A从B拿到一个数据
- transport: 相当于put+get,A发出一个请求,B返回一个应答
- peek: 复制一个数据送出去,原来的数据还在
2.PORT、EXPORT、IMP、TRANSPORT
- 优先级:port > export > imp
- 在有port, export, imp连接的data path中,有且必须以imp作为终点,否则的话,程序会报错。port, export相当于一道门,没用存储作用
- imp在声明时相较于port, export多了一个类型参数IMP,第一个参数是传输的transaction,第二个参数是实现这个接口的component
- 端口连接举例:
2.1 port-export-imp
A代码
class A extends uvm_component;
`uvm_component_utils(A)
uvm_blocking_put_port#(my_transaction) A_port;
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
extern function void build_phase(uvm_phase phase);
extern virtual task main_phase(uvm_phase phase);
endclass
function void A::build_phase(uvm_phase phase);
super.build_phase(phase);
A_port = new("A_port", this);
endfunction
task A::main_phase(uvm_phase phase);
my_transaction tr;
repeat(10) begin
#10;
tr = new("tr");
assert(tr.randomize());
A_port.put(tr);
end
endtask
B代码
class B extends uvm_component;
`uvm_component_utils(B)
uvm_blocking_put_export#(my_transaction) B_export;
uvm_blocking_put_imp#(my_transaction, B) B_imp;
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
extern function void build_phase(uvm_phase phase);
extern function void connect_phase(uvm_phase phase);
extern function void put(my_transaction tr);
extern virtual task main_phase(uvm_phase phase);
endclass
function void B::build_phase(uvm_phase phase);
super.build_phase(phase);
B_export = new("B_export", this);
B_imp = new("B_imp", this);
endfunction
function void B::connect_phase(uvm_phase phase);
super.connect_phase(phase);
B_export.connect(B_imp);
endfunction
function void B::put(my_transaction tr);
`uvm_info("B", "receive a transaction", UVM_LOW)
tr.print();
endfunction
task B::main_phase(uvm_phase phase);
endtask
env代码
class my_env extends uvm_env;
A A_inst;
B B_inst;
function new(string name = "my_env", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
A_inst = A::type_id::create("A_inst", this);
B_inst = B::type_id::create("B_inst", this);
endfunction
extern virtual function void connect_phase(uvm_phase phase);
`uvm_component_utils(my_env)
endclass
function void my_env::connect_phase(uvm_phase phase);
super.connect_phase(phase);
A_inst.A_port.connect(B_inst.B_export)