芯片家
芯片家

2019年10月13日 阅读234


Soc debug经验<5>

 在验证芯片的case中,很多时候需要先在自己的case中配置模块中的一些寄存器(这些寄存器的某些域可能是数据能够成功穿过该模块的条件,因此必须优先配置这些寄存器)。在数据在到达该模块之后,只有先配置这些寄存器,该模块才能成功输出数据到下一个模块。在配置好这些寄存器之后,可能需要检测这些配置是否达到要求,会有如下代码。

Unsigned int timeout;

unsigned int signal;

timeout=100000;

signal=0;

While( (signal!=1) &&timeout!=0)

{

       signal= get_value(tb.a.siganl_A);

     @ posedge clk;

      Timeout- -;

}

  这段代码的意思是case在执行到该代码时,在10000clk之内,判断模块a中的信号signal_A是否是1。如果一直不是1 说明初始化某些寄存器没有达到要求。在仿真的log中,我们可以看到仿真不会继续走下去,如果在case中关键位置加了打印信息,打印信息到这里就不会继续打印了。

我们如果知道配置哪一个寄存器可以影响到signal_A,我们首先要在log 中去匹配这个寄存器地址,先检查一下我们配置了几次该寄存器,都配置了哪些值。如果不知道具体是哪一个寄存器的话,只能在波形中trace该信号signal_A

在波形中,可以拉出来该信号signal_A,会发现其值是0。一直trace,可能会发现如下代码。

Port_enable=EN?enable_A:enable.

EN值是1 enable_A的值是1,但是Port_enable的值是0Port_enable的值和enable_A的值不一样。现在只需要解决为什么Port_enable的值和enable_A的值不一样即可。

这里可能会发现,该信号Port_enable force0了。我们在波形中的message中,可以看到Port_enable是多驱动,另外一个赋值语句是force语句。

force tb.a.b.Port_enable=1’b0;

  一般情况下,所有的force语句都被按模块分在同一个目录下面,我们在该目录下,去搜索信号Port_enable,就能看到是否被force了。

0 个评论

要回复文章请先登录注册