Altifigence Academy

25 / 63 · 实验

实验:MUX 的穷举检查与寄存输出分析

将相同输入施加到组合路径与寄存器路径,利用真值表与采样时刻验证结果。

实验对象与观察条件

sel=0 时 y 输出 a,sel=1 时输出 b。sampled_y 在时钟上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多存储 y。即使输入变化,sampled_y 也保持到下一个上升沿。

开始之前

准备 Digital Design Studio 的 Desktop 项目,并确保具备运行权限。将各示例分别保存到独立文件夹中的 rtl/top.sv。

先构造 a 与 b 不同的组合。确认 sel=0 时输出 a、sel=1 时输出 b,再与输入文件的每一行对照。

亲自切换所选路径

y = sel ? b : a

SystemVerilog 源码

SystemVerilog
module top (
    input logic clk,
    input logic a,
    input logic b,
    input logic sel,
    output logic y,
    output logic sampled_y
);
    assign y = sel ? b : a;
    // Explicit observation register: y remains purely combinational.
    // The register makes this design eligible for logic-netlist-1 simulation.
    always_ff @(posedge clk) sampled_y <= y;
endmodule

运行方法

在 New analysis 中选择 Two-state single-clock v1。Clock port 设为 clk,周期为 1000ps。使用以下设置完成 Preflight,再执行 Run RTL simulation 并比较结果。

设置值
初始寄存器值(从 LSB 开始)[false]
Reset port留空
Maximum cycles / time8 / 8000ps

每列对应下方输入文件的一项。组合输出 y 的预期值为 0,0,0,1,1,0,1,1。此图只按输入顺序预测功能,不包含 sampled_y 的更新时间。

一览输入 JSON 的八种组合
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
a0...1...
b0.1.0.1.
sel01010101
y expected0..1.01.

输入激励

json
[
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  }
]

比较结果

8 cycles · y=1 · sampled_y=1。检查在 3000ps 时,是否 y=1 而 sampled_y=0。

本实验使用 0/1 单时钟 RTL,不包含 #delay、initial 或 X/Z 测试平台。学习完成标记只记录学习进度,不代表实际仿真结果。

先写出预期结果

运行模拟器之前,亲自计算上述输入顺序的组合输出 yy。预期位序列为 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1。它检查了全部八种输入组合,比只确认一个最终值更有说服力。

寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多输出在上升沿更新,而不是在输入激励变化的瞬间更新。请分别记录边沿前的组合输出和边沿后的寄存器输出。

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

这里用第 kk 个边沿采样的输入定义边沿后的状态 qk+1q_{k+1}。信号名 sampled_y 对应这一状态。即使显示在同一时间坐标上,也必须确认输入施加与寄存器更新的事件顺序。

用三项检查区分缺陷

  1. 选择反相:改为 sel ? a : b 之前,先预测最早失败的是哪个向量。a=ba=b 的向量无法发现此错误。
  2. 混淆观察点:解释为什么把 sampled_y 当作 y,立即与组合参考值比较,会使正常电路看起来也失败。
  3. 输入保持检查:只改变未选中的输入,确认 yy 保持不变;改变所选输入时,yy 应随之变化。

在错误报告中逐项记录输入、观察时刻、预期值和实际值。只写“波形异常”,无法区分选择逻辑错误与一个周期的延迟。

扩展任务

将数据位宽扩为四位后,组合输入空间为 24+4+1=5122^{4+4+1}=512 种,仍可穷举。但应先用 0、最大值、0101、1010 以及 walking-one 模式快速暴露位位置错误。修改位宽后,也要同步更新电路设置与输入文件。

自己试试

在上升沿存储 a=0,b=1,s=0a=0,b=1,s=0 对应的值后,在下一边沿前只把 ss 改为 1。求逻辑延迟过后的 yy,以及下一个上升沿前后的 sampled_y。

阅读解释

组合输出 y=1y=1。sampled_y 在下一个上升沿前保持为 0,并在该边沿存入 1。这个比较假设输入在采样所需的时间内保持稳定。

Lesson files

mux-top.sv ↓mux-inputs.json ↓

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