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

pra*_*eep 2 verilog

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

too*_*lic 7

强制/释放语句通常用于辅助模拟.

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

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

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

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


Qiu*_*Qiu 6

基于 IEEE Std 1364-2005,强制过程连续赋值语句应覆盖对变量或网络的所有过程赋值。该版本的程序语句应该终止一项程序性连续赋值给一个变量或净。变量的值应保持不变,直到通过过程赋值或过程连续赋值为变量赋予新值。

例如:

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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中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和 force 的结果e = 1。但是一旦将release应用于e,该值就会更改为 0(和 gate 的功能恢复)。

在上面的示例中,您还可以看到/释放可以同时应用于 regs ( d) 和电线 ( e)。当您想在 reg 或 wire 中强制确定值时,此语句用于测试平台。