fpga系列 HDL:verilog latch在fpga中的作用 & 避免latch的常见做法

目录

Latch在FPGA中的作用

Quartus中有关latch的警告⚠

  • 如果代码中生成了Latch,会收到类似如下的警告:Warning (10240): Verilog HDL Always Construct warning at test.v(8): inferring latch(es) for variable "q", which holds its previous value in one or more paths through the always construct

避免Latch的常见做法

  • 当在组合逻辑(如if-elsecase语句)中没有处理所有可能的输入条件时,如果某个信号在某些条件下没有被明确赋值,则综合工具可能会推断出Latch以维持该信号的前一状态。在一些复杂的组合逻辑中,存在从输出到输入的直接反馈路径也可能导致Latch的生成。

1. if-else 语句未覆盖所有条件

生成Latch的代码:
verilog 复制代码
module test (
    input wire sel,
    input wire in1,
    output reg out
);
    always @(*) begin
        if (sel == 1'b1) begin
            out = in1;
        end
        // 没有 else 分支
    end
endmodule


修复后的代码:
verilog 复制代码
module test (
    input wire sel,
    input wire in1,
    input wire in2, // 添加额外输入
    output reg out
);
    always @(*) begin
        out = in2; // 默认值
        if (sel == 1'b1) begin
            out = in1;
        end
    end
endmodule

2. case语句未覆盖所有分支

生成Latch的代码:
verilog 复制代码
module test (
    input wire [1:0] state,
    input wire in1,
    input wire in2,
    output reg out
);
    always @(*) begin
        case (state)
            2'b00: out = in1;
            2'b01: out = in2;
            // 没有 default 分支
        endcase
    end
endmodule
修复后的代码:
verilog 复制代码
module test (
    input wire [1:0] state,
    input wire in1,
    input wire in2,
    output reg out
);
    always @(*) begin
        case (state)
            2'b00: out = in1;
            2'b01: out = in2;
            default: out = 1'b0; // 添加默认值
        endcase
    end
endmodule

3. 组合逻辑中缺少默认赋值

生成Latch的代码:
verilog 复制代码
module test (
    input wire enable,
    input wire data_in,
    output reg out
);
    always @(*) begin
        if (enable) begin
            out = data_in;
        end
        // 没有 else 分支
    end
endmodule
修复后的代码:
verilog 复制代码
module test (
    input wire enable,
    input wire data_in,
    output reg out
);
    always @(*) begin
        out = 1'b0; // 默认值
        if (enable) begin
            out = data_in;
        end
    end
endmodule

4. 多路选择器中未处理所有输入

生成Latch的代码:
verilog 复制代码
module test (
    input wire [1:0] sel,
    input wire in1,
    input wire in2,
    input wire in3,
    output reg out
);
    always @(*) begin
        case (sel)
            2'b00: out = in1;
            2'b01: out = in2;
            2'b10: out = in3;
            // 没有处理 2'b11
        endcase
    end
endmodule
修复后的代码:
verilog 复制代码
module test (
    input wire [1:0] sel,
    input wire in1,
    input wire in2,
    input wire in3,
    output reg out
);
    always @(*) begin
        case (sel)
            2'b00: out = in1;
            2'b01: out = in2;
            2'b10: out = in3;
            default: out = 1'b0; // 添加默认值
        endcase
    end
endmodule

5. 部分条件未赋值

生成Latch的代码:
verilog 复制代码
module test (
    input wire condition1,
    input wire condition2,
    input wire in1,
    input wire in2,
    output reg out
);
    always @(*) begin
        if (condition1) begin
            out = in1;
        end else if (condition2) begin
            out = in2;
        end
        // 没有 else 分支
    end
endmodule
修复后的代码:
verilog 复制代码
module test (
    input wire condition1,
    input wire condition2,
    input wire in1,
    input wire in2,
    output reg out
);
    always @(*) begin
        out = 1'b0; // 默认值
        if (condition1) begin
            out = in1;
        end else if (condition2) begin
            out = in2;
        end
    end
endmodule

6. 反馈路径中的Latch

生成Latch的代码:
verilog 复制代码
module test (
    input wire reset,
    input wire enable,
    input wire d,
    output reg q
);
    always @(*) begin
        if (reset) begin
            q = 1'b0;
        end else if (enable) begin
            q = d;
        end
        // 没有 else 分支
    end
endmodule
修复后的代码:
verilog 复制代码
module test (
    input wire reset,
    input wire enable,
    input wire d,
    output reg q
);
    always @(*) begin
        q = 1'b0; // 默认值
        if (reset) begin
            q = 1'b0;
        end else if (enable) begin
            q = d;
        end
    end
endmodule

CG

相关推荐
ZPC82106 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC82106 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
tiantianuser6 天前
RDMA设计53:构建RoCE v2 高速数据传输系统板级测试平台2
fpga开发·rdma·高速传输·cmac·roce v2
博览鸿蒙6 天前
FPGA 和 IC,哪个前景更好?怎么选?
fpga开发
FPGA_小田老师6 天前
xilinx原语:ISERDESE2原语详解(串并转换器)
fpga开发·iserdese2·原语·串并转换
tiantianuser6 天前
RDMA设计50: 如何验证网络嗅探功能?
网络·fpga开发·rdma·高速传输·cmac·roce v2
Lzy金壳bing6 天前
基于Vivado平台对Xilinx-7K325t FPGA芯片进行程序在线更新升级
fpga开发·vivado·xilinx
unicrom_深圳市由你创科技6 天前
医疗设备专用图像处理板卡定制
图像处理·人工智能·fpga开发
tiantianuser6 天前
RDMA设计52:构建RoCE v2 高速数据传输系统板级测试平台
fpga开发·rdma·高速传输·cmac·roce v2
luoganttcc7 天前
Taalas 将人工智能模型蚀刻到晶体管上,以提升推理能力
人工智能·fpga开发