用modelsim仿真一个模块top时,模块里有一段组合逻辑代码。模块代码如下:
module top(
...)
...
reg en = 1;
always@(*)begin
if(a)
en = 0;
else if(b)
en = 1;
end
...
endmodule
这段代码的用途是产生一个使能信号en,en的值由信号a,b决定。用modelsim 仿真时,整个模块的功能是正常的。把代码下载到FPGA里面后,发现这个模块的功能不正常。定位到是en信号没有正常变化引起的问题。查看代码,才发现这个组合逻辑没有写else分支,按照我的经验,应该生成锁存器,但是en的值并没有被锁存,而是保持为0.还是我对锁存器有误解?总之,modelsim 仿真和实际电路运行的结果不同。
如果使用vivado综合的时候,把代码改成如下所示:
module top(
...)
...
(* MARK_DEBUG="true" *)reg en = 1;
always@(*)begin
if(a)
en = 0;
else if(b)
en = 1;
end
...
endmodule
这样模块的功能也正常。
最后改成了时序逻辑:
module top(
...)
...
reg en = 1;
always(posedge clk)begin
if(a)
en = 0;
else if(b)
en = 1;
end
...
endmodule
功能也正常了。之所以用组合逻辑,是为了en能及时拉低,但是实际过程中发现多一个使能也可以。
后面如果有机会再把仿真和综合的结果比较一下。