You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog中always@(posedge clock)的寄存器写入时序疑问

关于Verilog中always@(posedge clock)寄存器写入时序的清晰解释

嘿,这个问题刚学Verilog的时候确实容易绕晕,我来给你讲得明明白白:

首先核心结论:always@(posedge clock)块的赋值逻辑,是在时钟上升沿发生的那一刻**,采样此时输入信号(不管是net还是reg)的当前值,然后将这个值更新到目标寄存器中**。

拆解一下细节:

  • 这个块是边沿触发的,只有当时钟上升沿这个事件触发时,块内的赋值语句才会执行,平时哪怕输入信号怎么变,寄存器的值都不会动。

  • 不管你是把net的信号赋值给reg,还是把一个reg的值赋值给另一个reg,逻辑都是一样的:
    举两个例子:

    1. net到reg的情况:
    reg out_reg;
    wire in_net; // 比如来自组合逻辑的输出
    always@(posedge clk) begin
        out_reg <= in_net;
    end
    

    当clk上升沿到来时,电路会采样此刻in_net的稳定值(前提是满足触发器的建立时间要求,这是硬件时序约束的问题,行为级建模不用纠结这个),然后把这个值赋值给out_reg。

    1. reg到reg的情况:
    reg src_reg;
    reg dest_reg;
    always@(posedge clk) begin
        dest_reg <= src_reg;
    end
    

    同样,clk上升沿触发时,取此刻src_reg已经稳定的值(也就是src_reg在上一个时钟周期被更新后的结果),然后更新dest_reg。不存在“上升沿之前把reg的值写入”的情况——毕竟没触发事件,块里的代码根本不会跑。

另外补充个关键小提醒:在时序逻辑里,尽量用非阻塞赋值<=,这样能准确模拟硬件中寄存器并行更新的行为,避免出现仿真和硬件行为不一致的坑。

内容的提问来源于stack exchange,提问作者S. Takano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:24:04