从硬件的角度来看,force和release语句模型是什么?这些陈述的用途是什么?
发布于 2015-07-11 13:06:54
强制/释放语句通常用于帮助模拟。
一种方案是避免X-传播门模拟.RTL代码有时包含没有异步重置的寄存器。虽然RTL仿真将运行干净,但门模拟通常不会。要么X的问题永远不会得到解决,要么它们需要这么多的周期来解决,从而使模拟运行的时间不太实际。通过在复位期间强制并释放一个随机的已知值到寄存器中,使模拟能够干净地进行并及时完成。
另一个场景涉及大型计数器。例如,要看到32位计数器翻转,需要40亿个周期.通常,您希望它在一次模拟中滚动几次。同样,这可能需要相当长的时间来模拟。所述力/释放可用于将一个随机值存放到接近该翻转值的计数器中。
另一个场景涉及提高代码覆盖率结果。在所有指标上都很难达到100%的覆盖率,特别是当使用无法修改的IP时。该力可用于切换未使用的信号。
只有当你确信这样做是有效的时,才应该谨慎使用武力/释放。
发布于 2015-07-11 10:12:26
基于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在上面的示例中,门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的结果。但是,一旦将发布应用于e,该值就会更改为0(恢复和门的功能)。
在上面的示例中,您还可以看到强制/释放既可以应用于regs (d),也可以应用于电线(e)。当您想在reg或wire中强制确定值时,此语句将用于testbenches中。
https://stackoverflow.com/questions/31355714
复制相似问题