Verilog中always@(posedge clock)的寄存器写入时序疑问
关于Verilog中
always@(posedge clock)寄存器写入时序的清晰解释 嘿,这个问题刚学Verilog的时候确实容易绕晕,我来给你讲得明明白白:
首先核心结论:always@(posedge clock)块的赋值逻辑,是在时钟上升沿发生的那一刻**,采样此时输入信号(不管是net还是reg)的当前值,然后将这个值更新到目标寄存器中**。
拆解一下细节:
这个块是边沿触发的,只有当时钟上升沿这个事件触发时,块内的赋值语句才会执行,平时哪怕输入信号怎么变,寄存器的值都不会动。
不管你是把net的信号赋值给reg,还是把一个reg的值赋值给另一个reg,逻辑都是一样的:
举两个例子:- net到reg的情况:
reg out_reg; wire in_net; // 比如来自组合逻辑的输出 always@(posedge clk) begin out_reg <= in_net; end当clk上升沿到来时,电路会采样此刻in_net的稳定值(前提是满足触发器的建立时间要求,这是硬件时序约束的问题,行为级建模不用纠结这个),然后把这个值赋值给out_reg。
- 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
相关产品推荐
相关产品推荐

