一些比较好的组件代码

vld和rdy握手类型的驱动

背景:驱动收到rdy才能发起驱动,否则保持。

实践示例:

这样可以实现背对背发包,需要注意的地方就是,如果是最后一个包,DUT rdy一直拉高,TB这里发完最后一个包,要接口的vld信号置为无效。否则vld&rdy都会一直为高,输入大量非预期的包。所以需要在发完一个item后,再去初始化一下接口。

task  drv();

dut.data <= Tb.data; 
do begin
 @clk   ;
end while(rdy !== 1);

endtask

task run_phase();
supper.phase;

forever  begin

    init_if();
    ....;//get item
    drv();



end

网上其他示例:Simple "ready-valid" interface examples, data is sent in a loop - SystemVerilog - Verification Academy

这里用了wait,可能会潜在风险;之前遇到过wait会get到毛刺导致环境认为已经达到wait条件,就是不知道这个下降沿能不能规避这个问题; 


vld=0时,对其他信号随机驱动为0/1/rand/x等

run phase调用

get_stim任务

task get_stim()
SEQ_TR tr;

forever begins
seq_item_port.try_next_item(tr);


if(tr == null) driver_idle();
else begin

driver_pkt();
seq_item_port.item_done(tr);

end

endtask


task  driver_idle();

vif.data <= 0;
vif.data <= '1;
vif.data <= 'x;
vif.data <= $urandom_range(1,9999);

@(posedge  vif.clk)
endtask

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值