从阻塞与非阻塞赋值看FPGA并行世界:Verilog编码中的时间艺术

深入解析Verilog中的阻塞与非阻塞赋值机制 本文深入解析Verilog中阻塞与非阻塞赋值机制的本质区别与应用场景。通过代码示例详细说明阻塞赋值(=)在组合逻辑中的立即执行特性,以及非阻塞赋值(<=)在时序逻辑中的并行更新优势,帮助开发者避免常见陷阱并优化硬件设计。 阅读详情

从阻塞与非阻塞赋值看FPGA并行世界:Verilog编码中的时间艺术

在数字电路设计的广阔天地中,FPGA开发者如同一位时间建筑师,通过Verilog语言精心编排着信号流动的节奏。阻塞与非阻塞赋值作为Verilog中最基础却又最易被误解的语法元素,直接决定了电路是优雅的同步芭蕾还是混乱的异步杂耍。当我们深入ModelSim的波形海洋,那些微妙的时序差异不再是抽象的代码符号,而是化为可视化的电子舞蹈,揭示出硬件描述语言背后深刻的并行哲学。本文将带你穿越代码表层,探索赋值语句如何塑造FPGA的时空结构,并透过实际案例展示如何避免常见的时序陷阱。

1. 阻塞与非阻塞赋值的本质差异

阻塞赋值(=)与非阻塞赋值(<=)的根本区别在于时间概念的体现方式。阻塞赋值如同单线程程序中的顺序执行,当前语句完全完成后才允许下一语句开始,这种特性在硬件中映射为组合逻辑的级联延迟。而非阻塞赋值则更像并行世界的宣言,所有赋值操作在同一时钟边沿同步计算但延后更新,完美对应寄存器传输级(RTL)的同步设计范式。

在实际编码中,这两种赋值方式产生的硬件结构天差地别。考虑以下代码片段:

// 示例1:阻塞赋值实现数据移位
always @(posedge clk) begin
    reg_a = data_in;
    reg_b = reg_a;  // 立即使用更新后的reg_a值
    reg_c = reg_b;
end

// 示例2:非阻塞赋值实现数据移位
always @(posedge clk) begin
    reg_a <= data_in;
    reg_b <= reg_a;  // 使用时钟边沿前的reg_a值
    reg_c <= reg_b;
end

在ModelSim中观察波形时会发现:示例1的仿真结果中,所有寄存器在同一时钟周期内变为相同值,实际综合后可能产生意想不到的组合逻辑路径。而示例2则展示出预期的移位寄存器行为,每个时钟周期数据向右移动一位。

关键洞察:阻塞赋值模拟的是信号在组合逻辑中的即时传播,而非阻塞赋值模拟的是寄存器在时钟边沿的同步更新。理解这一区别是避免仿真与综合差异的第一步。

2. ModelSim波形调试中的赋值行为可视化

ModelSim作为业界标准的仿真工具,提供了将抽象代码转化为直观波形的能力。通过精心设计的测试平台,我们可以清晰观察到两种赋值方式对电路行为的深刻影响。

创建有效的测试平台(Testbench)是调试赋值行为的关键。以下是一个典型的测试平台结构:

module testbench;
    reg clk, rst_n;
    reg [7:0] data_in;
    wire [7:0] data_out;
    
    // 时钟生成
    always #10 clk = ~clk;  // 50MHz时钟
    
    // 设计实例化
    my_design uut (.clk(clk), .rst_n(rst_n), .data_in(data_in), .data_out(data_out));
    
    initial begin
        // 初始化
        clk = 0; rst_n = 0; data_in = 8'h00;
        #100 rst_n = 1;  // 释放复位
        
        // 测试序列
        data_in = 8'hA5;
        #20 data_in = 8'h3C;
        #40 data_in = 8'hF0;
        
        // 仿真控制
        #500 $stop;
    end
endmodule

在ModelSim中运行仿真后,通过添加相关信号到波形窗口,可以观察到:

时间点(ns)clk边沿阻塞赋值行为非阻塞赋值行为
105上升沿所有寄存器立即更新寄存器保持旧值
115下降沿无变化寄存器同步更新
125上升沿新值立即传播上一周期值更新

这种可视化对比揭示了为什么在always块中混合使用两种赋值方式会导致不可预测的结果。波形中的毛刺和不确定状态往往是这种混合使用的直接后果。

3. 时序逻辑与组合逻辑中的赋值策略

正确的赋值策略选择取决于目标电路类型。时序逻辑(寄存器、状态机)几乎总是使用非阻塞赋值,而组合逻辑则根据情况选择阻塞或非阻塞赋值。

3.1 时序逻辑设计模式

时序逻辑中,非阻塞赋值确保了寄存器在时钟边沿的同步更新,这是构建可靠状态机的基础:

// 三段式状态机最佳实践
module fsm_example(
    input clk, rst_n, input_signal,
    output reg [1:0] state
);

    // 状态定义
    parameter IDLE = 2'b00, WORK = 2'b01, DONE = 2'b10;
    
    // 状态寄存器
    reg [1:0] current_state, next_state;
    
    // 状态更新(时序逻辑)
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            current_state <= IDLE;
        else
            current_state <= next_state;  // 非阻塞赋值
    end
    
    // 次态逻辑(组合逻辑)
    always @(*) begin
        case (current_state)
            IDLE: next_state = input_signal ? WORK : IDLE;  // 阻塞赋值
            WORK: next_state = DONE;
            DONE: next_state = IDLE;
            default: next_state = IDLE;
        endcase
    end
    
    // 输出逻辑
    always @(posedge clk) begin
        if (!rst_n)
            state <= IDLE;
        else
            state <= current_state;  // 非阻塞赋值
    end
endmodule

3.2 组合逻辑设计模式

纯组合逻辑中,阻塞赋值通常更直观,但需要注意避免隐含锁存器:

// 组合逻辑示例:多路选择器
module mux_4to1(
    input [1:0] sel,
    input [3:0] data_in,
    output reg data_out
);

    always @(*) begin
        case (sel)
            2'b00: data_out = data_in[0];  // 阻塞赋值
            2'b01: data_out = data_in[1];
            2'b10: data_out = data_in[2];
            2'b11: data_out = data_in[3];
            default: data_out = 1'b0;      // 避免锁存器
        endcase
    end
endmodule

设计准则:在描述组合逻辑的always块中使用阻塞赋值,在描述时序逻辑的always块中使用非阻塞赋值。绝不混合使用,除非你完全理解其后果。

4. 常见设计陷阱与解决方案

即使经验丰富的工程师也会在赋值语句上犯错。以下是一些典型问题及其解决方案:

4.1 仿真与综合不匹配

最常见的陷阱是代码在仿真中工作正常但综合后行为异常。这通常源于对阻塞赋值的误解:

// 有问题的代码:仿真与综合不匹配
always @(posedge clk) begin
    count = count + 1;           // 阻塞赋值
    if (count == MAX_COUNT)      // 立即使用新值
        flag = 1'b1;
    else
        flag = 1'b0;
end

// 修正后的代码
always @(posedge clk) begin
    count <= count + 1;           // 非阻塞赋值
    if (count == MAX_COUNT)       // 使用旧值(综合前值)
        flag <= 1'b1;
    else
        flag <= 1'b0;
end

在ModelSim中,第一种写法可能显示flag与count同步变化,但实际硬件中由于组合逻辑延迟,flag的变化会落后于count更新。

4.2 毛刺与亚稳态问题

不当的赋值使用会导致毛刺产生,进而引发亚稳态:

问题类型原因解决方案
组合逻辑毛刺阻塞赋值路径延迟不一致使用时序逻辑同步输出
亚稳态异步信号直接使用时序逻辑添加同步器链
复位冲突复位信号与时钟不同步使用同步复位或异步复位同步释放
// 异步复位同步释放技术
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        sync_rst <= 1'b1;
        out_reg <= 1'b0;
    end else begin
        sync_rst <= 1'b0;
        out_reg <= data_in;
    end
end

4.3 多时钟域交互

跨时钟域信号处理需要特别小心赋值策略:

// 跨时钟域同步器
module cdc_sync(
    input clk_dest, 
    input signal_src,
    output reg signal_dest
);

    reg sync_stage1, sync_stage2;
    
    always @(posedge clk_dest) begin
        sync_stage1 <= signal_src;    // 第一级同步
        sync_stage2 <= sync_stage1;    // 第二级同步
        signal_dest <= sync_stage2;    // 同步后信号
    end
endmodule

这种双寄存器同步链使用非阻塞赋值有效降低了亚稳态概率,是跨时钟域设计的标准方法。

5. 高级赋值技巧与优化策略

超越基础用法,高级赋值技巧可以显著提升代码质量和电路性能。

5.1 条件赋值优化

条件赋值是Verilog中的常见模式,但实现方式影响综合结果:

// 低效的条件赋值
always @(posedge clk) begin
    if (enable)
        data_out <= data_in;  // 只有enable时更新
    // 否则保持原值:隐含寄存器使能
end

// 等效但更清晰的表达
always @(posedge clk) begin
    data_out <= enable ? data_in : data_out;  // 明确反馈路径
end

第二种写法明确显示了寄存器值的保持机制,综合工具可能生成更优化的电路结构。

5.2 向量与位域操作

赋值语句支持丰富的向量和位域操作,充分利用这些特性可以编写更简洁的代码:

// 高效的位域操作示例
reg [31:0] data_word;
reg [7:0] byte0, byte1, byte2, byte3;

// 字节提取与组装
always @(posedge clk) begin
    // 字节提取
    byte0 <= data_word[7:0];
    byte1 <= data_word[15:8];
    byte2 <= data_word[23:16];
    byte3 <= data_word[31:24];
    
    // 字节组装(使用连接运算符)
    data_word <= {byte3, byte2, byte1, byte0};
end

5.3 参数化赋值模式

使用参数和宏定义创建可重用的赋值模式:

// 参数化寄存器组
parameter REG_WIDTH = 8;
parameter REG_COUNT = 4;

reg [REG_WIDTH-1:0] reg_file [0:REG_COUNT-1];
wire [REG_WIDTH-1:0] data_in [0:REG_COUNT-1];
wire [REG_COUNT-1:0] write_enable;

// 参数化寄存器更新
generate
    genvar i;
    for (i = 0; i < REG_COUNT; i = i + 1) begin : reg_update
        always @(posedge clk) begin
            if (write_enable[i])
                reg_file[i] <= data_in[i];
        end
    end
endgenerate

这种参数化设计提高了代码的可维护性和重用性。

在实际项目中,我发现严格遵守赋值使用规范可以避免大多数时序问题。特别是在大型FPGA项目中,统一的赋值策略是团队协作的基础。每个工程师都应该建立自己的代码审查清单,其中赋值方式的正确使用应该是必检项之一。记住,在硬件设计中没有"差不多正确",只有完全正确或完全错误。

详细解释 — Verilog中非阻塞赋值为什么能解决时序逻辑里的“寄存器之间竞争 / 读写不一致” 本文深入解析Verilog中非阻塞赋值的仿真语义与硬件匹配机制。通过具体示例演示非阻塞赋值(<=)与阻塞赋值(=)的关键区别:非阻塞采用"采样-更新"两阶段机制,在时钟沿统一读取旧值后并行更新,完美匹配D触发器特性;而阻塞赋值会引入顺序依赖问题。文章详细展示交换寄存器和多寄存器更新案例,并提供工程实践建议:时序逻辑用非阻塞、组合逻辑用阻塞。最后强调非阻塞赋值通过并行采样机制消除寄存器间的读写不一致问题,但不解决跨时钟域等同步问题。全文使用数值表格和波形说明,使抽象概念直观可理解。 阅读详情

相关推荐

Verilog阻塞赋值与非阻塞赋值:仿真波形错位的根源与RTL编码规范

在数字电路设计中,事件调度机制决定了仿真器如何执行过程块中的语句。阻塞赋值与非阻塞赋值的核心差异在于:阻塞赋值立即更新左侧变量,而非阻塞赋值将更新推迟到时间片末尾,从而模拟硬件触发器的并行行为。正确使用这两种赋值方式,能确保仿真波形与综合结果一致,避免数据错拍、毛刺和流水线级数错误。在FPGA和ASIC设计中,时序逻辑必须使用非阻塞赋值,组合逻辑必须使用阻塞赋值,这是RTL编码的基本规范。本文深入剖析Verilog中阻塞赋值与非阻塞赋值的底层原理,帮助工程师彻底理解仿真波形错位的根源。

weixin_42639246的博客 204

[FPGA 学习记录] 阻塞赋值与非阻塞赋值

那么经过上次的了解,有的朋友可能还没有理解阻塞赋值与非阻塞赋值的概念,那么有的朋友可能理解了,但是他们不知道应该怎么使用,也就是说不知道什么时候使用阻塞赋值,什么时候使用非阻塞赋值。它俩却没有延迟一拍的一个关系了,而是在同一时刻变化的,这是因为我们使用的是阻塞赋值,也就是说赋值号右边的表达式它的值有变化,赋值号左边的表达式立刻发生变化。一个时钟周期,是因为使用的是非阻塞赋值,也就是说,只要赋值号右边的表达式的值有变化了,赋值号左边的表达式的值不会立刻发生变化,需要等待下一个时钟沿到来时一起变化,所以说。

cedtek的博客 866

Verilog计数器中的阻塞赋值与非阻塞赋值:事件调度与可综合时序逻辑详解

在数字电路设计中,时序逻辑是构建各类功能模块的基石,而寄存器则是时序逻辑的核心元件。理解寄存器如何按节拍采样输入、锁存状态,是掌握RTL设计的关键。Verilog作为常用的硬件描述语言,通过事件调度机制模拟寄存器并行更新的行为,其中非阻塞赋值正是在这种调度下准确描述寄存器工作方式的重要语法。它强调同一时刻对多个信号进行采样,并在时间步末尾统一更新,避免了竞争与中间态。工程实践中,计数器是最简单也最典型的寄存器模型,广泛应用于分频、定时、状态控制与按键消抖等场景。基于计数器模型,可以直观展示非阻塞赋值与阻塞赋

weixin_30582943的博客 325

2024.11.1 FPGA 的阻塞赋值和非阻塞赋值详解

结合非阻塞赋值和阻塞赋值的RTL和仿真波形,我们不难发现,非阻塞赋值的结果依次延迟了一个周期,我们可以这样理解,当一个时钟上升沿到达时,非阻塞赋值的三个都开始进行赋值,a可以赋值in,但在这个上升沿a才开始有值,于是b赋值不到该时刻的a,而是上一个时刻的a,也就是相对的延迟了一个周期;从波形图可以看出,在计满(仿真我调试的是200为计满)清零时使用非阻塞赋值

2403_87224473的博客 1351

FPGA入门200例(6):大厂面试必考:阻塞赋值(`=`)与非阻塞赋值(`<=`)的底层逻辑与综合结果对比

本文深入解析了FPGA设计中阻塞赋值与非阻塞赋值的核心概念。阻塞赋值(=)用于组合逻辑,具有立即生效、顺序执行的特性,综合后生成响应快速的组合逻辑电路;非阻塞赋值(<=)用于时序逻辑,具有延迟更新、并行执行的特性,综合后生成包含D触发器的时序逻辑电路。文章详细对比了两者在底层实现、综合结果及适用场景的差异,并通过面试真题分析常见错误和规避方法。正确运用这两种赋值方式是FPGA设计成功的关键,需根据电路功能需求选择合适方式,避免混淆使用导致时序问题或资源浪费。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 96

FPGA设计核心:非阻塞赋值的深度解析

FPGA 设计笔记:非阻塞赋值机制与状态机设计

m0_46644103的博客 942

FPGA的阻塞赋值与非阻塞赋值

阻塞赋值的赋值号用“=”表示。为什么称这种赋值方式为阻塞赋值呢? 答:因为对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系。阻塞赋值的操作可以认为是只有一个步骤的操作,即计算赋值号右边的语句并更新赋值号左边的语句,此时不允许有来自任何其他 Verilog语句的干扰,直到现行的赋值完成时刻,即把当前赋值号右边的值赋值给左边的时刻完成后,它才允许下一条的赋值语句的执行。串行块(begin-end)中的各条阻塞型过程赋值语句将以它们在顺序块后的排列次序依次执行。阻塞型过程赋值语句的执行过程是:首先计算

果果小师弟的博客 3913

从Simulink到Amesim:一份FMU联合仿真的避坑指南(含UDP通讯完整配置)

本文详细解析了从Simulink到Amesim的FMU联合仿真全流程,重点介绍了UDP通讯配置中的常见陷阱与解决方案。通过实战案例,帮助工程师规避编译器不兼容、步长设置冲突等典型问题,提升复杂系统仿真的效率与准确性。

weixin_34046298的博客 337

FPGA(五) 阻塞赋值和非阻塞赋值

一、阻塞赋值 阻塞赋值"=",顾名思义即一条阻塞赋值的语句如果没有执行结束,则会导致后边的语句不能执行,用赋值表达式右边的值去更新左边表达式的值,有一种顺序执行的意思。 always @(posedge clk or negedge rst_n)begin if(!rst_n)begin a = 1; b = 2; c = 3; end else begin a = 0;

sxy121835的博客 1906

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

ENVI与Sarscape协同处理哨兵一号数据的完整流程解析

本文详细解析了利用ENVI与Sarscape软件协同处理哨兵一号(Sentinel-1)SAR数据的完整工作流程。从环境搭建、数据导入与裁剪,到核心的DEM辅助多时相配准、斑点噪声滤波,再到最终的地理编码与辐射定标,提供了标准化的操作指南与实用技巧,帮助用户高效地将原始雷达数据转化为可用于分析的地理编码产品。

weixin_29251131的博客 339

非阻塞赋值与阻塞赋值

Verilog语言中最容易被误解的构造之一是非阻塞赋值。 即使是非常有经验的Verilog设计人员也不能完全理解在IEEE兼容的Verilog模拟器中如何安排非阻塞分配,并且不了解应该何时以及为何应该使用非阻塞赋值。 本文详细介绍了如何安排Verilog阻塞和非阻塞赋值,提供重要的编码指南来推断正确的可合成逻辑和详细编码样式,以避免Verilog模拟竞争条件。

Derek Qu的博客 2万+

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

p6666666668的博客 1589

Verilog基础:避免混合使用阻塞和非阻塞赋值

Verilog设计中应避免在同一个always块中混用阻塞和非阻塞赋值。虽然这种写法在某些情况下能正常工作,但会带来仿真行为与硬件不一致、代码可读性差、调试困难等问题。规范做法是将组合逻辑和时序逻辑分开描述:组合逻辑使用assign或单独的always块实现阻塞赋值,时序逻辑使用非阻塞赋值。这种分离式写法能更清晰地映射实际电路结构,减少仿真歧义,提高代码可维护性,是大型工程中的推荐编码风格。

保持终身学习的能力,温故而知新 2577

数据分析!Python爬虫爬取B站UP主数据并分析涨粉规律(附可视化图表)

爬取更多UP主:扩充列表,增加需要分析的UP主UID数量爬取更多作品:修改的参数,增加每个UP主的作品爬取页数新增分析维度:在类中添加方法,可分析发布时间(如定时发布对涨粉的影响)、内容标签(如游戏/知识区涨粉差异)优化可视化样式:调整方法中的图表类型、颜色、标题等,适配个人展示需求播放量与粉丝数强正相关:从相关性热力图可看出,总播放量与粉丝数的相关系数通常在0.8以上,说明曝光量是涨粉的核心基础作品数量存在“边际效应”

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1227

Spring AI 项目实战(十):Spring Boot + AI + DeepSeek 构建智能合同分析技术实践(附完整源码)

摘要:基于Spring AI的智能合同审核系统开发 本文介绍了基于Spring Boot 3.2.0和Spring AI 1.0.0-M4构建的智能合同审核系统。系统采用分层架构设计,整合DeepSeek API实现文档解析、条款提取和风险分析功能。核心技术栈包括Spring AI、H2数据库、Apache POI/PDFBox等文档处理工具,实现了合同条款语义分析、异常识别和审核报告自动生成。项目解决了传统人工审核效率低、主观性强等问题,为合同管理提供了智能化解决方案。文章详细阐述了系统架构设计、技术选型

博客 654

一起聊聊Verilog中的阻塞和非阻塞那点事儿

Verilog 阻塞赋值和非阻塞赋值

houzi6320的博客 3612

1分钟了解LangChain是什么?

是一个基于大型语言模型(LLM)开发应用程序的框架, 它旨在简化语言模型应用的开发流程,特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能,从而使开发者能够更加专注于创造性的解决方案设计。高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。

gorgor在码农 2631

Verilog阻塞赋值 vs 非阻塞赋值:事件队列深解与黄金法则(不再踩坑)

Verilog阻塞与非阻塞赋值核心解析 摘要 Verilog中阻塞赋值(=)与非阻塞赋值(<=)的区别是硬件设计的关键概念。阻塞赋值立即执行并更新变量,适合组合逻辑;非阻塞赋值在时间步结束时更新,模拟寄存器并行特性,适用于时序逻辑。必须遵循黄金法则: 组合逻辑使用阻塞赋值 时序逻辑使用非阻塞赋值 禁止混用两种赋值方式 典型错误案例显示,在移位寄存器中使用阻塞赋值会导致功能错误。深入理解Verilog事件队列的分层执行机制(Active/NBA区域)是掌握赋值语义的基础。SystemVerilog通过语

weixin_44413306的博客 2119

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1236

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

FPGA技术:阻塞赋值与非阻塞赋值

转载:https://www.cnblogs.com/leaftime/p/6023566.html 前言:阻塞与非阻塞赋值是Verilog语言中最基本的部分,也是让大部分Verilog新手最困惑的地方。关于阻塞与非阻塞的著作文章可谓汗牛充栋,这些文章对阻塞与非阻塞赋值的原理进行了非常详细的讲解,但新手读了之后依然有种似懂非懂的感觉,编码过程中一如既往的犯错。所以,本文的目的立足于提供一种实用化...

构建数字通信技术理论与实践之间的桥梁 1915

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

FPGA计数器的Verilog陷阱:阻塞赋值与非阻塞赋值深度解析

时序逻辑是数字电路设计的核心,而Verilog中阻塞赋值与非阻塞赋值的选择直接决定了仿真与综合行为的一致性。计数器作为最基础的时序模块,常被用来观察两种赋值在仿真调度中的差异。阻塞赋值按顺序立即更新变量,适合组合逻辑建模;非阻塞赋值则通过“先采样、后更新”机制模拟触发器的并行特性,是时序逻辑推荐的标准写法。若使用时序块中误用阻塞赋值,可能导致计数器提前回绕、流水线错乱甚至仿真竞争。理解IEEE仿真事件调度机制与硬件映射原理,有助于从根本上掌握两者边界。本文以计数器为最小载体,结合错误示例与底层调度分析,给出

weixin_34121282的博客 367

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

001---Verilog HDL 赋值语句(阻塞赋值和非阻塞赋值)

当前赋值语句赋值号(

weixin_55949063的博客 770

图书推荐|Verilog编程艺术

Verilog 编程艺术》是一部面向数字 IC/FPGA 开发者的高质量 Verilog 编码实践指南,全书围绕 “如何写出高质量、可综合、可维护、工程级的 Verilog 代码” 展开,涵盖设计原则、语言特性、工程方法、复杂语句、时序模型、验证方法等多个方面。作者魏家明拥有多年前端设计经验(RTL 设计、验证、综合、STA 等),将真实项目中的经验与规范方法结合,使本书既能作为学习教材,也可作为工程参考。Verilog 的事件调度、阻塞/非阻塞赋值是写出“不会出Bug的RTL”的关键。

HackEle的博客 884

Verilog计数器中的阻塞赋值与非阻塞赋值:从仿真到综合的完整解析

在数字电路与FPGA开发中,硬件描述语言(HDL)的赋值语义直接决定仿真与综合行为的一致性。Verilog作为最常用的HDL之一,其阻塞赋值与非阻塞赋值是初学者必须跨越的门槛,也是数字IC岗位面试的高频考点。阻塞赋值按顺序立即更新变量,适合组合逻辑;非阻塞赋值先计算后统一提交,模拟寄存器并行更新,用于时序逻辑。若在时钟边沿触发的always块中误用赋值方式,会导致计数器不递增、跳变异常甚至综合后功能失败。本文以计数器为最小样本,从仿真事件队列原理出发,对比两种赋值机制,结合testbench、Modelsi

weixin_34129696的博客 361

【Verilog】阻塞/非阻塞赋值

本文介绍了Verilog中阻塞赋值(=)与非阻塞赋值(<=)的区别及其应用原则。阻塞赋值立即执行并阻塞后续语句,而非阻塞赋值在当前时间槽结束时更新且不阻塞其他语句。文章提出了Verilog编码的8个重要原则,包括时序电路用非阻塞赋值、组合逻辑用阻塞赋值等。通过对比实验显示:在相同初始条件下,使用阻塞赋值的q3最终值为0(直接传递in值),而使用非阻塞赋值的q3保留原q2值2。正确答案为D(0、2),这验证了两种赋值方式的行为差异。文末的电路图进一步直观展示了信号传递路径的不同。

wuyufei_sun的博客 237
上一篇: 嵌入式系统中的ARM指令集:超越代码的硬件对话
下一篇: 从土壤湿度到云端控制:一个STM32物联网施肥机的开发手记
java5
博客等级 码龄22年 85粉丝 2103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值