综合latch 规避

1.case语句条件不全情况
module top(out,a, b,c,d,select);
output out;
input a,b,c,d;
input [3:0] select;
reg out;
always @(select or a or b or c or d)
begin
case(select)
4’b0001: out=a;
4’b1110: out=b;
4’b1100: out=c;
4’b1000: out=d;
endcase
end
endmodule
解决方案:
1.添加default语句
2.使用属性约束full_case

2.环路情况,如assign r=~r类型
module led(clk,r);
input clk;
output r;
reg[5:0]cnt=0;

always@(posedge clk)begin
cnt<=cnt+1;
end
assign r=cnt<=30? (cnt<=21 ? 1’b1 : ~r):1’b0;

endmodule
上述情景可能会infer出latch,仿真、综合不等价问题
解决方案:
修改为时序模块
module led(clk,r);
input clk;
output reg r;
reg[5:0]cnt=0;

always@(posedge clk)begin
cnt<=cnt+1;
end

always@(posedge clk)begin
if(cnt<=30)begin
if(cnt<=21)begin
r<=1’b1;
end
else begin
r<=~r;
end
end
else begin
r<=1’b0;
end
end

endmodule
3.组合逻辑电路if语句不完整
module top(sel,d,q);
input sel,d;
output reg q;
always@(*)begin
if(sel)begin
q<=d;
end
end
endmodule
解决方案:
1.补全if语句
2.时序逻辑电路

4.异步复位时接信号
module top(clk,sel,c,d,rst,q);
input sel,d,c,clk,rst;
output reg q;
always@(posedge clk or posedge rst)begin
if(rst)begin
q<=c;
end
else begin
if(sel)begin
q<=d;
end
end
end
endmodule
解决方案:
1.异步复位信号接常量

5.always敏感列表中有3个以上的边沿触发

module top(clk,d,rstn,ce,set,q);
input clk,rstn,ce,set;
input d;
output reg q;
always@(posedge clk or negedge rstn or posedge set)begin
if(!rstn)begin
q<=1;
end
else if(set)
q<=0;
else if(ce)
q<=d;
end
endmodule
上述示例,对于没有这类原语infer情景的综合工具,可能会出现latch
解决方案:
1.建议删除一个边沿触发
2.编写等价性案例

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值