微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 求助:monitor中如何用信号沿给一个数清零?

求助:monitor中如何用信号沿给一个数清零?

时间:10-02 整理:3721RD 点击:

各位:
最近正在用UVM搭建仿真环境。在写monitor时候遇到一点问题,嗯,我写的是monitor接收一幅图像的数据,但是不知道该图像的大小。因此,需要根据interface中的hs和vs来给line_cnt和pix_cnt进行清零,加一操作。本来我想的是“valid有效时采集数据”,“hs的上升沿时line_cnt加一”,“vs的上升沿,line_cnt和pix_cnt均清零”这三件事可并行进行。代码如下:
task run_phase(uvm_phase phase);
wait(!vif.vdo_rst);
`uvm_info(get_type_name(),"Detected Reset Done",UVM_LOW)
fork
forever begin
@(posedge vif.vdo_clk iff(vif.vdo_rst))
if(vif.valid) begin
my.r[pix_cnt]=vif.r;
my.g[pix_cnt]=vif.g;
my.b[pix_cnt]=vif.b;
pix_cnt++;
end
end
forever begin
@(posedge vif.hs)
pix_cnt++;
end
forever begin
@(posedge vif.vs)
pix_cnt=0;
line_cnt=0;
end
join
endtask
运行的结果是pix_cnt能够正常进行加一操作,但是没办法清零,line_cnt既没办法加一,也没办法清零,为什么会这样呢?我该如何修改呢?
用[code] 后代码全变成一行了,重新编辑了一下,去掉了【code】【/code】

fork join这么多task在对同一个变量赋值有竞争危险。建以都在vif.vdo_clk上升沿对各个变量赋值;另外可以定义几个变量来检测vsync和hsync的上升沿。在vif.vdo_clk的上升沿的时根据这些变量决定究竟是该请0 还是+1。

我也曾想过像verilog一样,用hs_d1,hs_d2来产生hs的上升沿信号,但是在monitor的run_phase中不知道该怎么操作,因为我只能定义logic和reg,不能定义wire,而且貌似没办法使用"<="来赋值,这样出来的结果是hs_d1跟hs完全同步,根本没延时。

I don't think your 3 @ are issue. Just make your fork-join clear, while should involve three begin forever @ ... end blocks. Set counter as int

hs_d2=hs_d1;hs_d1=hs;不可以吗?

用$display打印出来查看好像不行,看波形的话,我用的是nc,还不知道怎么看class中的波形。

No way to check waveform in SVTB unless you link the signal into your interface block.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top