武力释放声明的用途是什么?

时间:2015-07-11 09:38:57

标签: verilog

从硬件的角度来看,force-release语句的模型是什么?武力释放声明的用途是什么?

2 个答案:

答案 0 :(得分:7)

强制/释放声明通常用于辅助模拟

一种情况是避免 X-传播门模拟。 RTL代码有时包含没有异步复位的寄存器。虽然RTL模拟运行得很干净,但门模拟通常不会。 X的永远不会得到解决,或者他们需要这么多周期来解决,以便使模拟花费不切实际的时间来运行。通过在复位期间强制并将随机已知值释放到寄存器中,允许模拟以干净的方式及时完成。

另一种情况涉及大型计数器。例如,要查看32位计数器翻转,它需要40亿个周期。通常,您希望它在一次模拟中多次滚动。同样,这可能需要花费很长时间来模拟。力/释放可用于将随机值存入接近翻转值的计数器。

另一种情况涉及提高代码覆盖率结果。在所有指标上实现100%覆盖率可能很困难,尤其是在使用无法修改的IP时。该力可用于切换未使用的信号。

只有在您确信这样做有效时,才应谨慎使用力量/释放。

答案 1 :(得分:4)

基于IEEE Std 1364-2005, force 程序连续赋值语句应覆盖对变量或网络的所有程序分配。 release 程序语句应结束对变量或网络的程序连续赋值。变量的值应保持不变,直到通过程序赋值或程序连续赋值为变量赋值为新值。

例如:

module test;  
    reg a, b, c, d;
    wire e;
    and and1 (e, a, b, c);

    initial begin
      $monitor("%d d=%b,e=%b", $stime, d, e);
      assign d = a & b & c;
      a = 1;
      b = 0;
      c = 1;
      #10;
      force d = (a | b | c);
      force e = (a | b | c);
      #10;
      release d;
      release e;
      #10 $finish;
    end
endmodule

在上面的示例中, gate and1被修补以用作门。如果你模拟它,你会得到以下结果:

  

结果:
  00 d = 0,e = 0
  10 d = 1,e = 1
  20 d = 0,e = 0

如果没有 force 语句,对于t = 10e应该等于0(从1 & 0 & 1 = 0开始)。使用 force 语句会覆盖and1和强制e = 1的结果。但是,只要 release 应用于e,该值就会更改为0(还原门的功能)。

在上面的示例中,您还可以看到强制 / 发布可以同时应用于regs(d)和电汇(e )。如果要在reg或wire中强制确定值,则在语句中使用此语句。