强制/释放语句通常用于辅助模拟.
一种情况是避免门模拟中的X传播.RTL代码有时包含没有异步复位的寄存器.虽然RTL模拟运行得很干净,但门模拟通常不会.X的永远不会得到解决,或者他们需要这么多周期来解决,以便使模拟花费不切实际的时间来运行.通过在复位期间强制并将随机已知值释放到寄存器中,允许模拟以干净的方式及时完成.
另一种情况涉及到大量柜台.例如,要查看32位计数器翻转,它需要40亿个周期.通常,您希望在一次模拟中多次滚动.同样,这可能需要花费很长时间来模拟.力/释放可用于将随机值存放到接近翻转值的计数器中.
另一种情况涉及提高代码覆盖率结果.在所有指标上实现100%覆盖率可能很困难,尤其是在使用无法修改的IP时.该力可用于切换未使用的信号.
只有在您确信这样做有效时才应谨慎使用力/释放.
基于 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 = 10,e应该等于 0(因为1 & 0 & 1 = 0)。使用force语句会覆盖and1和 force 的结果e = 1。但是一旦将release应用于e,该值就会更改为 0(和 gate 的功能恢复)。
在上面的示例中,您还可以看到力/释放可以同时应用于 regs ( d) 和电线 ( e)。当您想在 reg 或 wire 中强制确定值时,此语句用于测试平台。