除assign-deassign外另一种形式的过程连续赋值是force和release过程语句,它们和assign-deassign对有类似的作用,但是force既可以对变量使用,也可以对线网使用。force过程连续的使用规则如下。
例子:在下面的代码中,通过使用force过程语句,与门被“patched”成了或门,一个是针对“assign d = a & b & c;”,另一个是针对“and and1(e,a,b,c);”。
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
运行结果: 0 d=0,e=0 10 d=1,e=1 20 d=0,e=0
assign过程连续赋值和force语句的RHS可以是一个表达式,如同连续赋值一样,这就意味着如果RHS中的变量发生变化,而且assign或force正在有效,那么赋值就会被重新计算。
例子:如果b或c发生变化,那么a就会被强制更改为新值。
force a = b + f(c);
注意:建议不要使用force,而是使用仿真器提供的系统函数$deposit,具体用法请参考仿真器的手册。