(UVM验证学习7) ahb master验证组件实现学习

实现一个ahb master端的uvm验证组件

定义uvm_sequence_item

class ahb_trans extends uvm_sequence_item;

	rand bit [`MAX_DATA_WIDTH-1 : 0] data[];
	rand bit [`MAX_ADDR_WIDTH-1 : 0] addr = 0;

	rand burst_size_enum burst_size = BURST_SIZE_8BIT;
	rand burst_type_enum burst_type = SINGLE;
	rand xact_type_enum xact_type = IDLE_XACT;
	rand response_type_enum = response_type = OKAY;

	trans_type_enum trans_type;
	response_type_enum all_beat_response[];
	int current_data_beat_num;
	status_enum status = INITIAL;
	rand bit idle_xact_hwrite = 1;

endclass

定义sequencer

// 只需要包含config和vif
ahb_agent_configuration cfg;
virtual ahb_if vif;

定义driver

首先定义基类driver,可以被master端和slave端的driver继承,包含一些通用方法

class ahb_driver #(type REQ = ahb_trans, type RSP=REQ) extends uvm_driver #(REQ, RSP);
	ahb_agent_configuration cfg;
	virtual ahb_if vif;

	task run_phase(uvm_phase phase);
		super.run(phase);
		fork
			get_and_drive();
			reset_listener();
		join
	endtask
	
	virtual task get_and_drive();
		forever begin
			seq_item_port.get_next_item(req);
	
			driver_transfer(req);
			void'($cast(rsp, req.clone()));
			rsp.set_sequencer_id(reg.get_sequence_id());
			rsp.set_transaction_id(reg.get_transaction_id());

			seq_item_port.item_done(rsp);
		end
	endtask

	virtual task driver_transfer(REQ t);
	endtask

	virtual task reset_listener();
	endtaskl

endclass

随后定义master的driver,主要是重载一些父类提出的虚方法
其中drive_transfer()支支持SINGLE传输,随后区分是读操作还是写操作,具体的读写需要按照时序要求将数据分周期放置到总线上并记录相关信息。具体内容参考do_read(), do_write().

ahb_master_driver extends ahb_driver;

	virtual task 
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值