always语句综合详解

标签:
锁存器组合电路alwaysw语句逻辑综合寄存器杂谈 |
分类: Dreamywork |
想说的有两点:
1.always的综合
2.always与assign之间的关系
先来说第一个
always的综合中,如果if语句中所有的可能性都顾虑到了,会生成组合电路,即使在output中明明写着reg out;那都是浮云,无论怎么综合都不会出现寄存器的。
如果always语句中的if没有被所有情况都有提及,那么输出必然出现锁存器,ena与clk被连接到一起了。
如果always语句中所有if都被遍历,可是在else中有
“
else
begin
out = out;
end
”
那么,将被一样的综合成unsafed latch。要注意一下。
如果敏感信号列表里面没有提及所有提供驱动的信号,综合结果同样没有锁存器的。原以为会有的。。。
再来说说always 和assign的关系
如果功能的表述一样的话,也是一样的结果。就像下面的第三个例子中也会出现锁存器~
像这样,在always的纯组合电路中没有reg产生的话,我还是比较推荐always的方法来写,if总比三目运算更明了~
module test (a,b,x,y);
input
output [3:0] x,y;
reg
always @(a or b)
begin
end
endmodule
Warning: Latch y$latch has unsafe behavior
module test (a,b,x,y);
input
output [3:0] x,y;
reg
always @(a or b)
begin
end
endmodule
Warning: Latch y$latch has unsafe behavior
module test (a,b,x,y);
input [3:0] a,b;
output[3:0] x,y;
//reg
assign x = (a != b) ? a : x;
assign y = (a != b) ? b : y;
endmodule
Warning: Latch y$latch has unsafe behavior
http://s8/middle/5e9b181a4aeeb37cb9857&690
module test (a,b,x,y);
input
output [3:0] x,y;
reg
always @(a or b)
begin
end
module test (a,b,x,y);
input [3:0] a,b;
output[3:0] x,y;
//reg
assign x = (a != b) ? a : 4'd0;
assign y = (a != b) ? b : 4'd0;
endmodule
http://s16/middle/5e9b181a077e45233bcdf&690