Altifigence Academy

2 / 37 · 概念

信号与端口:位宽、方向和时间的约定

阅读接口约定,区分组合输出与状态输出的验证标准。

把端口列表读成电路约定

input logic [7:0] data 是同时传送 8 个比特的端口,并不是 8 个值依次到达。仅有 logic 数据类型也不会产生存储元件。硬件行为取决于它由组合赋值驱动,还是由基于边沿的时序块驱动。

阅读信号时,除位宽和方向外,还应确认何时有效、由谁驱动以及复位后是什么值。缺少这些信息时,即使各模块单独正确,连接后的系统也可能出错。

同一个 MUX 也有两类输出

本课程的实验同时观察选择结果 y 及保存该结果的 sampled_y。

y(t)=s(t)‾a(t)+s(t)b(t)y(t)=\overline{s(t)}a(t)+s(t)b(t)
qk+1=y(tk−)q_{k+1}=y(t_k^-)

第一个表达式描述组合功能,第二个描述在边沿存储此前已稳定 y 的理想同步模型。若一概将两个输出都与同一瞬间的输入比较,就会把正常寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多判为错误。

SystemVerilog
assign y = sel ? b : a;
always_ff @(posedge clk) sampled_y <= y;

在模拟器中,即使时间值相同,也有事件处理顺序。实际器件则有 setupsetup 捕获时钟边沿之前,输入数据必须保持稳定的最短时间。违反建立时间就无法保证存储结果。了解更多/hold 及 clock-to-Q 延迟。这里的两个表达式并未消除这些差别,而是为功能验证明确观察时刻的起点。

箭头表示数据依赖关系。a、b、sel 改变时,组合输出 y 先改变,而 sampled_y 只在上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多存储新值。

组合输出与存储输出的边界
  1. a · b · sel: 同时给定的输入
  2. MUX → y: 由当前选择信号计算
  3. DFF → sampled_y: 在上升沿存储 y

需要审查的问题

  • sel 是确定为 0/1 的输入,还是异步外部信号?
  • y 改变后,与 sampled_y 比较的时刻是否在下一个有效边沿之后?
  • sampled_y 的初值由复位复位 将状态恢复为规定初值的控制。必须同时规定其同步或异步性质,以及相对于其他控制的优先级。了解更多确定,还是采用工具的初始化设置?

本实验的显式初值用于建立可复现的 0/1 模型。不能把初值设置理解为实际芯片上电行为的保证。

自己试试

在两个时钟边沿之间,a 从 0 变为 1,sel 始终为 0。y 与 sampled_y 分别何时变化?

阅读解释

组合输出 y 在相应组合路径完成求值或传播后改变。sampled_y 在捕获该值的下一个上升沿更新。边沿附近的输入变化涉及实际电路的 setup/hold 问题,不能仅凭这个简化模型断定安全。

你的选择适用于此浏览器,可随时在页脚更改。