SV 移位寄存器操作

verilog

复制代码
phase_clk <= {phase_clk[13:0], src_clk};

1. 语法与操作本质

这是一个移位寄存器操作 ,核心是 Verilog 的拼接运算符 {}非阻塞赋值 <=

  • phase_clk 是一个 15 位的寄存器 reg [14:0] phase_clk;
  • phase_clk[13:0] 取了 phase_clk 的低 14 位
  • {phase_clk[13:0], src_clk} 把这 14 位和 src_clk(1 位信号)拼接起来,得到一个新的 15 位信号
  • 然后把这个新信号赋值给 phase_clk

等价的理解方式:

verilog

复制代码
phase_clk[14] <= phase_clk[13];
phase_clk[13] <= phase_clk[12];
...
phase_clk[1] <= phase_clk[0];
phase_clk[0] <= src_clk;

也就是:src_clk 作为新的最低位,将 phase_clk 的所有位整体左移一位


2. 功能:构建移位链,实现多拍延迟

这段代码的核心目的,是生成 src_clk 信号的不同延迟版本:

  • phase_clk[0]src_clk 延迟 0 拍(等于当前周期的 src_clk
  • phase_clk[1]src_clk 延迟 1 拍
  • phase_clk[2]src_clk 延迟 2 拍
  • ...
  • phase_clk[14]src_clk 延迟 14 拍

phase_clk 这个 15 位寄存器,就相当于一个长度为 15 的移位寄存器链,把 src_clk 的每一拍都 "存" 了下来。


3. 为什么要这么做?(结合你的代码上下文)

你这段代码的模块名和端口(phase_selphase_dly_clk)说明,它的功能是相位可调的时钟延迟电路

  1. 用高速的 pll_clk 采样 / 移位 src_clk,生成多拍延迟的信号
  2. 后续会根据 phase_sel 的值,从 phase_clk 中选择某一位(对应某个延迟拍数),输出到 phase_dly_clk
  3. 比如 phase_sel = 4'd5,就选 phase_clk[5],实现 src_clk 延迟 5 个 pll_clk 周期的输出

4. 补充说明

  • 注意:代码里的 src_clk 没有在端口列表里声明,是个笔误 / 遗漏的信号
  • 这种方式的延迟精度由 pll_clk 的周期决定,比如 pll_clk 是 100MHz(周期 10ns),那每拍延迟就是 10ns,最大可实现 140ns 的可调延迟
  • tm 信号的作用是测试模式,当 tm=1phase_sel 会被强制设为 0,通常是为了固定相位或进入测试状态
相关推荐
liuluyang53022 天前
SV主要关键词详解
fpga开发·uvm·sv
北方孤寂的灵魂4 个月前
systemverilog中随机std::randomize的用法
verilog·systemverilog·sv·数字验证
啄缘之间1 年前
17. 示例:用assert property检查FIFO空满标志冲突
学习·fpga开发·verilog·uvm·sv
啄缘之间1 年前
7. 覆盖率:covergroup/coverpoint/cross
学习·测试用例·verilog·uvm·sv
啄缘之间1 年前
4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)
学习·测试用例·verilog·uvm·sv
啄缘之间1 年前
4.6 学习UVM中的“report_phase“,将其应用到具体案例分为几步?
学习·verilog·uvm·sv
啄缘之间1 年前
3.9 学习UVM中的uvm_env类分为几步?
学习·verilog·uvm·sv
啄缘之间1 年前
1.4 学习序列(Sequence)分为几步?
学习·uvm·sv
啄缘之间1 年前
3. 学习UVM的核心组件
学习·verilog·uvm·sv