UVM 交互式怎么完成?
uvm_driver 发送第一个transaction 给DUT,
DUT根据收到的当前这个transaction发送一笔资料回去,
uvm_driver 发送第二个transaction必须根据 DUT发送的内容来发送相应特定的内容(不能乱发)。
这样的来回几个回合,完成注册过程。
"完成注册过程" 是指什麼?
是不是指“req, resp"的过程。
可以这么说,但单单是UVM里面put_respone(), get_response().
a: driverb: dut
就是 a 发送一个微信给 b, 告诉b, “你晚上来不来吃饭啊?”
#第一种情况>>>
b说,“晚上要加班,去不了了”。
a 得到这信息就在 发一个微信给b, "那我就取消这次饭局了"。
。
#第一种情况<<<
#第二种情况===
b说,“好的,我6点准时出发”;
a得到肯定的答案后,发微信告诉b,“那我马上定个包间”;
。
#第二种情况===
后面还有一堆的对话,但a除了第一次说“你晚上来不来吃饭啊?”这句以外,其他的对话都是根据b的回复来发送 特定的微信内容。
就是这个意思,不知道我说清楚了没?
1. 建一个transcation,讲DUT需要发送的数据放到里面去
2. 在driver和testbench的top文件各建一个analysis端口,各自连到对方的模块里面。
3. 在各自模块的analysis的write函数下可以很方便的实时调用各自transaction的数据,可以写你想要的逻辑。
1、可以交互,在mon中根据你采集dut的内容控制drv的发送情况或者直接构造复杂的测试seq。但你认为这样做好吗?
2、为什么要交互呢?你只要给不同的简单激励,测试dut的输出是否符合你的预期就ok了。硬件是讲究时序和通路的。只要这个配合的好,我管你a和b交互多少次,说多少话。
那你是对家里的路由器不了解,要是不和局端交互的对话的话,你以为家里的路由器一插电线板就能上网了。要是你家的路由器说话不对路,你就别指望能上网了,那它唯一的功能就是费电。
这样说,不知道能不能说清交互的重要性?
这种想法我最初也是大致这样想的。发帖的目的是看看UVM有没有自带这种function,毕竟UVM源代码没有看过,不知道里面到底有多少好东西。
some example of req, resp in the driver/sequence:
my_sequence extends uvm_sequence #(my_sequence_item1, (my_sequence_item2); // type of req = my_sequence_item1, type of rsp = my_sequence_item2
.....
task body();
// Step 1 - Creation
req = my_sequence_item1::type_id::create("req"); // type of req = my_sequence_item1
// Step 2 - Ready - start_item()
start_item(req);
// Step 3 - Set
if(!req.randomize() with {address inside {[0:32'h4FFF_FFFF]};})
begin
`uvm_error("body", "randomization failure for req")
end
// Step 4 - Go - finish_item()
finish_item(req);
// Step 5 - Response - get_response()
get_response(rsp); // type of rsp = my_sequence_item2
endtask: body
endclass: my_sequence
class my_driver extends uvm_driver #(my_sequence_item);
my_interface vif;
.....
task run_phase(uvm_phase phase);
forever
begin
seq_item_port.get_next_item(req); // Blocking call returning the next transaction
@(posedge vif.clk);
vif.addr = req.address; // vif is the drivers Virtual Interface
//
// etc
//
// End of bus cycle
if(req.read_or_write == READ)
begin // Assign response data to the req fields
req.rdata = vif.rdata;
end
rsp = my_sequence_item2::type_id::create("rsp"); // type of rsp = my_sequence_item2
req.resp = vif.error; // Assign response to the req_item response field
seq_item_port.item_done(rsp); // Signal to the sequence that the driver has finished with the item
end
endtask: run
endclass: my_driver
也许我没说清楚,我没有说交互不重要。
我的意思是在验证的不同阶段做不同的事情。
虽然说越早发现问题解决代价越小,但也要考虑环境复杂度和复用性等问题。
同意您的观点。
抱歉前面的回复信息有误,让您误会了,害的你又写了代码上来。总之,谢谢了。
yuanpin318的是正解,driver和sequencer之间就有这个req和rsp的通信接口,应该可以实现你的交互。这样就可以通过反馈,去控制sequence发送trans的流程。