从硬件的角度来看,force-release语句的模型是什么?武力释放声明的用途是什么?
答案 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 = 10
,e
应该等于0(从1 & 0 & 1 = 0
开始)。使用 force 语句会覆盖and1
和强制e = 1
的结果。但是,只要 release 应用于e
,该值就会更改为0(还原门的功能)。
在上面的示例中,您还可以看到强制 / 发布可以同时应用于regs(d
)和电汇(e
)。如果要在reg或wire中强制确定值,则在语句中使用此语句。