【AMBA学习】用VIP如何发送紧密连续的AMBA transaction

AXI协议传输

发送单笔AMBA transaction相对比较容易,但是在高速测试尤其是性能测试过程中需要非常紧密的,不留任何cycle空隙的发送transaction来实现最大化bus冲击情况,经常能发现一些bus的性能瓶颈问题。
故本文简要阐述下如何实现极大化紧密发送amba transaction.

单笔AXI transaction

`uvm_create(req_wr)
req_wr.port_cfg    = cfg;
req_wr.xact_type   = svt_axi_transaction::WRITE;
req_wr.addr        = waddress;
req_wr.id          = wid;
req_wr.burst_type  = svt_axi_transaction::INCR;
req_wr.burst_size  = svt_axi_transaction::BURST_SIZE_32BIT;
req_wr.burst_length= 1;
req_wr.data        = new(req_wr.burst_length);
req_wr.wstrb       = new(req_wr.burst_length);
req_wr.wvalid_delay= new(req_wr.burst_length);
req_wr.data[0]     = wdata;
req_wr.wstrb[0]    = 'hf;
`uvm_send(req_wr)
get_response(rsp);

连续多笔AXI transaction紧密传输

  1. burst_length要设成多笔;
  2. wvalid_delay=0, 否则会有间隙;
fork
	begin
		for(int i=0; i<100; i++)begin
			`uvm_create(req_wr)
			req_wr.port_cfg    = cfg;
			...
			req_wr.burst_length= wlength;
			foreach(req_wr.wvalid_delay[i])	req_wr.wvalid_delay[i]=0;
			`uvm_send(req_wr)
		end 
	end
	begin
		for(int i=0; i<100; i++)begin
			get_response(rsp);
		end
	end
join

AHB协议传输

与AXI类似, 需要使用fork join来保证非常紧密的发出transaction.

连续多笔AHB transaction紧密传输

  1. num_busy_cycles要设成0, 否则会有间隙;
p_sequencer.get_cfg(u_get_cfg);
$cast(cfg,u_get_cfg);
fork
	begin
		for(int i=0; i<100; i++)begin
			`uvm_create(req_wr)
			`uvm_rand_send_with(req_wr, {
				req_wr.cfg == cfg;
				...
				foreach(req_wr.wvalid_delay[i])	{req_wr.wvalid_delay[i]==0;}
			})
		end 
	end
	begin
		for(int i=0; i<100; i++)begin
			get_response(rsp);
		end
	end
join

欢迎讨论指教.

你可能感兴趣的:(IC验证)