SystemVerilog中如何单代码行实现寄存器多时钟周期延迟?
如果你使用支持SystemVerilog的仿真、综合工具(当前主流EDA工具均已支持),可以通过以下两种方案在单个模块内实现单代码行完成单信号延迟配置,无需额外引入子模块:
方案1:宏封装方案(最简洁,全流程兼容)
先在当前模块开头定义通用延迟宏,后续所有待延迟信号仅需一行调用宏即可完成定义与时序逻辑绑定:
// 模块内开头先定义通用延迟宏,clk为你的时钟信号名,可根据需求调整 `define DELAY_SIGNAL(sig_name, sig_width, delay_cycle) \ logic [sig_width-1:0] ``sig_name``_delayed[0:delay_cycle-1]; \ always @(posedge clk) ``sig_name``_delayed <= {``sig_name``_delayed[0:delay_cycle-2], sig_name}; // 待延迟信号仅需一行调用,比如延迟4bit位宽的a信号X拍: `DELAY_SIGNAL(a, 4, X)
延迟X拍后的输出信号为a_delayed[X-1],和你原写法的逻辑、综合结果完全一致。如果你的时钟信号名不是clk,可给宏新增时钟参数传入即可。
方案2:无宏简化写法
如果不想使用宏,也可以通过数组拼接简化移位逻辑,信号定义和移位逻辑可合并为一行编写:
// 合并信号定义行 logic [3:0] a, a_delayed[0:X-1]; // 单行动态移位逻辑,替代原有的for循环写法 always @(posedge clk) a_delayed <= {a_delayed[0:X-2], a};
如果你的EDA工具仅支持Verilog-2001标准,不支持SystemVerilog数组整体赋值,可将宏内的移位逻辑替换为原for循环写法,调用方式不变,依然可以做到单信号仅需一行代码配置。
内容的提问来源于stack exchange,提问作者Topa
相关产品推荐
相关产品推荐

