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

相关推荐
南檐巷上学5 小时前
基于FPGA的正弦信号发生器、滤波器的设计(DAC输出点数受限条件下的完整正弦波产生器)
fpga开发·数字信号处理·dsp·dds
嵌入式-老费9 小时前
Linux Camera驱动开发(fpga + csi rx/csi tx)
fpga开发
ALINX技术博客1 天前
【202601芯动态】全球 FPGA 异构热潮,ALINX 高性能异构新品预告
人工智能·fpga开发·gpu算力·fpga
JJRainbow1 天前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
s9123601011 天前
FPGA眼图
fpga开发
北京青翼科技1 天前
【PCIe732】青翼PCIe采集卡-优质光纤卡- PCIe接口-万兆光纤卡
图像处理·人工智能·fpga开发·智能硬件·嵌入式实时数据库
minglie11 天前
verilog信号命名规范
fpga开发
XINVRY-FPGA1 天前
中阶FPGA效能红线重新划定! AMD第2代Kintex UltraScale+登场,记忆体频宽跃升5倍
嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga
南檐巷上学2 天前
基于FPGA的音频信号监测识别系统
fpga开发·音频·verilog·fpga·傅立叶分析·fft·快速傅里叶变换
Aaron15882 天前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理