如何在父uvm_transaction中随机及例化子的uvm_transaction

Use Case: AXI DMA控制器有128个独立的通道,可以并行进行读写操作。首先我们对AXI DMA控制器的top level的事务进行建模,如下:

class axi_dmac_transaction extends uvm_transaction;
	rand axi_chan_transaction axi_chan[axi_dmac_dec::CHAN_NUM];
    function new(string name = "axi_dmac_transaction ");
        super.new(name);
        `uvm_info("TRACE", $sformatf("%m"), UVM_DEBUG)
    endfunction
endclass

那么如何进行多通道事务的例化及随机呢?这里利用到了uvm object的pre_randomize函数:

function void pre_randomize();
    foreach(axi_chan[i]) begin
        axi_chan[i] = axi_chan_transaction ::type_id::create($sformatf("axi_chan[%0d]",i));
    end
endfunction

这样就可以在接下来调用axi_dmac_transaction的随机化,从而实现axi_chan_transaction的各个实例的随机化。

如果开启的DMA的通道数量不确定,我们可以利用队列来进行实现:

class axi_dmac_transaction extends uvm_transaction;
	rand int chan_num;
	rand axi_chan_transaction axi_chan[$];
	
	constraint c_chan_num {
		chan_num inside {[1:128]};
		axi_chan.size == chan_num;
    }
    
    function new(string name = "axi_dmac_transaction ");
        super.new(name);
        `uvm_info("TRACE", $sformatf("%m"), UVM_DEBUG)
    endfunction

	function void pre_randomize();
	endfunction

endclass

这时候,调用axi_dmac_transaction的随机化,队列axi_chanchan_numaxi_chan_transaction 句柄,但是句柄的值是空的,因此我们需要进行实例化,该操作可在post_randomize函数中完成:

function void post_randomize();
    `uvm_info("TRACE", $sformatf("%m"), UVM_DEBUG)
    
    foreach(axi_chan[i]) begin
        axi_chan[i] = axi_chan_transaction ::type_id::create($sformatf("axi_chan[%0d]",i));
        assert(axi_chan[i].randomize());
    end
endfunction
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunvally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值