reg [11:0] data;
initial begin
data = 12'h000;
forever #1000 begin
data = data + 12'h001;
end
end
上面这段代码仿真是符合预期的,每隔1000ns data值加1,但是如果把第五行改成:
force data = data + 12'h001;
那么仿真结果就变成data每隔1000ns加2了,这是什么原理?想了半天没想出来为啥,网上也没找到解释,仿真器是vcs,难道force是先算data = data + 1,然后又把这个值加1再赋值给等号左边的变量?这样就加了两次?
force 变量的类型一般都是wire,在这里,这种表达式data = data + 1的时候一般都会隐式的定义了一个data_wire变量,data_wire = data (这个在initial 块外面); data = data_wire + 1, 当使用了force的时候,force的内容又作用到这个data_wire上了,这个initial块内的表达式又等效于,data= data_wire + 1; force data_wire = data + 1 。