验证环境中如何捕获后门路径信号的跳变
环境中后门获取DUT内部信号的3种方法:
信号的Hierarchy读取
interface连接
VPI访问
其中前两种方式,借助systemverilog种阻塞等待操作,可以精确地捕获信号的跳变,比如@和wait:
//信号Hierarchy读取
@(tb_top.dut.cnt)
@(posedge dut.clk)
//interface连接
@(negedge vrf.clk)
@(posedge vrf.axi_bid)
wait(vrf.cnt==3)
而对于VPI接口,是通过信号的后门字符串路径获取信号值,则无法通过上述的方式捕捉到边沿跳变。VPI接口是一次性的函数的调用来获取信号值,但无法把一个变量和DUT信号"绑定",因此下述的代码是无法实现此目的。
bit[15:0] A;
void'(uvm_hdl_read("dut.sub_block.A",A));
@(posedge A);
如果需要获取信号的跳变,则需要使用封装task实现。以检测上升沿为例,该task的思路如下:
task at_poedge(string x_path);
int t_value,delta;
if(!uvm_hdl_check_path(x_path,t_value)) begin
//report error
return;
end
while(1) begin
#delta;
void'(uvm_hdl_read(x_path,t_value));
if(t_value==0) break;
end
while(1) begin
#delta;
void'(uvm_hdl_read(x_path,t_value));
if(t_value==1) break;
end
endtask
上述函数种的delta延时,即使是使用时间精度级别的延时,则也无法精确捕获边沿,因为信号的频率不会总是和上述的延时对齐。
里面的delta可以换成时钟,这样对于时序电路来说,就可以精确捕捉到了。
浙公网安备 33010602011771号