|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
各位:
正在写driver,遇到一个问题,就是我必须在一个信号的上升沿将当前的transfer的传输终止(不管传没传完,然后去取下一个item,开始下个transfer的传输)。我是用一个for循环来发送数据的,因此,我想用disable来将它终止,但是好像disable只是将这一次的操作终止掉,下次循环又重新开始了,请问,我该如何才能直接终止掉整个loop呀?
- task rate_handw_driver::drive_transfer(vdo_transfer trans);
- longint r,g,b;
- int cnt;
- int i;
- `uvm_info("START_FRAME",$psprintf("Start send a new frame data"),UVM_MEDIUM)
- cnt=cfg.master_config.hvalid*cfg.master_config.vvalid/rate;
- two_vif.lr_mask <= #1 trans.lr_mask;
- fork
- for(i=0;i<cnt;i++) loop1:begin
- r=0;
- g=0;
- b=0;
- for(int j=0;j<rate;j++) begin
- r |= trans.r[i*rate+j]<<(j*width);
- g |= trans.g[i*rate+j]<<(j*width);
- b |= trans.b[i*rate+j]<<(j*width);
- end
- pix_cnt=i%(cfg.master_config.hvalid/rate);
- line_cnt=i/(cfg.master_config.hvalid/rate);
- $display("befor call drive_one_beat @%t,i=%d",$time,i);
- drive_one_beat(r,g,b,pix_cnt,line_cnt);
- end
- @(posedge two_vif.vs)
- disable loop1;
- join_any
- $display("break for @%t",$time);
- @(posedge two_vif.vdo_clk)
- two_vif.valid <= #1 'b0;
- two_vif.vlast <= #1 'b0;
- two_vif.hlast <= #1 'b0;
- endtask : drive_transfer
复制代码
结果跑出来的log如下:
break for @ 308026000
pix_cnt= 5,line_cnt= 0,@ 308030000
befor call drive_one_beat @ 308030000,i= 6
pix_cnt= 6,line_cnt= 0,@ 308034000
befor call drive_one_beat @ 308034000,i= 7
pix_cnt= 7,line_cnt= 0,@ 308038000
befor call drive_one_beat @ 308038000,i= 8
pix_cnt= 8,line_cnt= 0,@ 308042000
befor call drive_one_beat @ 308042000,i= 9
pix_cnt= 9,line_cnt= 0,@ 308046000
befor call drive_one_beat @ 308046000,i= 10
pix_cnt= 10,line_cnt= 0,@ 308050000
befor call drive_one_beat @ 308050000,i= 11
我该怎么办呢? |
|